


JQuery implémente la boîte de sélection déroulante personnalisée avec image: Traitement des événements indépendants et optimisation de plusieurs instances
Introduction: exigences et défis des boîtes déroulantes personnalisées
Dans le développement Web moderne, les éléments HTML et
Structure HTML de base
Pour implémenter une boîte déroulante personnalisée avec des images, nous avons besoin d'un conteneur de wrapper pour distinguer chaque instance de composant individuel. Ici, nous utilisons la classe .box comme conteneur de niveau supérieur pour chaque boîte de sélection personnalisée et les identifie davantage par un ID unique (comme un, deux). Chaque. Box contient un élément
<script src="https://code.jquery.com/jquery-3.6.0.min.js" int xuj m4=" crosorigin = " anonymme> <! - La première instance de boîte déroulante personnalisée -> <div class = "box" id = "one"> <sélectionnez class = "Vodiapicker"> <option> en sélectionnez un <option value = "en" class = "test" data-thumbnail = "images / 3.png"> Anglais <option value = "Au" data-thumbnail = "images / 3.png"> Engllish (Au) <div class = "Lang-Select"> <Button class = "btn-select" value = ""> </ bouton> <div class = "b"> <ul id = "a"> <! - La deuxième instance de boîte déroulante personnalisée -> <div class = "box" id = "deux"> <sélectionnez class = "Vodiapicker"> <option> en sélectionnez un <option value = "fr" class = "test" data-thumbnail = "images / 3.png"> Français <Option Value = "CA" Data-Thumbnail = "Images / 3.png"> French (CA) <div class = "Lang-Select"> <Button class = "btn-select" value = ""> </ bouton> <div class = "b"> <ul id = "a"> </script>
Remarque: Bien que l'utilisation d'id = "a" inside div.box avec $ (this) .find ("# a") peut fonctionner, à partir de la spécification HTML et des meilleures pratiques, les ID doivent être uniques dans le document. Si plusieurs éléments nécessitent la même identité pour appliquer des styles ou des comportements, la classe (class = "a") doit être utilisée en premier. Dans la solution de ce didacticiel, puisque la méthode find () de jQuery limite la portée de la recherche, elle fonctionne correctement même si l'ID est dupliquée, mais il est recommandé d'éviter les ID en double dans les projets réels.
Définition du style CSS
CSS est chargé de cacher les éléments natifs
.VodiaPicker { Affichage: aucun; / * Masquer l'élément de sélection natif * / } #un { padding-left: 0px; } #A img, .btn-sélection Img { Largeur: 18px; / * Taille de l'image dans les options et les boutons * / } #a li { Style de liste: aucun; Tableau de rembourrage: 5px; Padding-Bottom: 5px; } #A li: Hover { Color d'arrière-plan: # F4F3F3; / * Effet de survol de l'option * / } #a li img { marge: 5px; } #a li span, .btn-select li Span { marge-gauche: 30px; } / * Conteneur de liste d'options * / .b { Affichage: aucun; / * Masquer par défaut * / Largeur: 100%; largeur maximale: 350px; Box-shadow: 0 6px 12px RGBA (0, 0, 0, 0,175); Border: 1px RGBA solide (0, 0, 0, 0,15); Border-Radius: 5px; Position: absolue; / * Faire flotter la liste déroulante au-dessus des autres contenus * / Color d'arrière-plan: #FFF; / * Couleur d'arrière-plan * / Z-Index: 1000; / * Assurez-vous d'être au niveau supérieur * / } / * Style bouton * / .btn-Select { marge: 10px; Largeur: 100%; largeur maximale: 350px; hauteur: 34px; Border-Radius: 5px; Color d'arrière-plan: #FFF; Border: 1px solide #ccc; Texte-aligne: gauche; / * Le contenu du bouton est laissé aligné * / curseur: pointeur; / * style de pointeur de souris * / } .btn-select li { Style de liste: aucun; flottant: à gauche; Padding-Bottom: 0px; } .btn-Select: Hover li { marge-gauche: 0px; } .btn-Select: Hover { Color d'arrière-plan: # F4F3F3; Border: 1px solide transparent; Box-shadow: inset 0 0px 0px 1px #ccc; } .BTN-SELECT: Focus { Aperçu: aucun; } .lang-Select { marge-gauche: 50px; Position: relative; / * Assurez-vous que .b est absolument positionné par rapport à celui-ci * / }
Remarque: Pour s'assurer que la liste déroulante (.B) flotte correctement et écrase un autre contenu, il est nécessaire d'ajouter la position: absolue; et z-index à lui. En même temps, son élément parent .Lang-Select doit définir la position: relative;.
JQuery Logic: implémenter un traitement d'événements indépendant
La clé consiste à utiliser les sélecteurs de traversée et de contexte de JQuery (tels que $ (this) et parents (), find ()) pour s'assurer que toutes les opérations sont limitées aux instances de composant en cours de traitement.
$ (function () { // 1. Initialiser chaque boîte déroulante personnalisée $ (". Box"). Chaque (fonction () { Soit Langarray = []; // Créer un langarray indépendant pour chaque instance de boîte // Traversé l'option Native Sélectionnez dans la boîte actuelle et créez un élément de liste personnalisé $ (this) .find (". Option Vodiapicker") .each (function () { Soit img = $ (this) .attr ("data-thumbnail"); Soit Text = this.innerText; Soit Value = $ (this) .val (); Soit un élément = '
Analyse de code et optimisation:
-
Initialiser ($ (". Box"). Chacun (...)) :
- Utilisez $ (". Box"). Chaque () pour itérer dans chaque conteneur déroulant personnalisé individuel.
- Dans chaque itération, $ (ceci) pointe vers l'élément .box actuel, garantissant que toutes les opérations de recherche () sont effectuées dans le cadre de la boîte .box actuelle, évitant ainsi la confusion de contenu entre différentes instances.
- Langarray est redéclaré comme Langarray = []; Dans chaque boucle, garantissant que chaque. Box a son propre tableau indépendant d'options et ne s'affertera pas mutuellement.
- Langarray.join ('') est utilisé pour épisser les éléments du tableau dans une chaîne, puis le définir sur le DOM en même temps, ce qui est plus efficace que d'appeler HTML () ou APPEND () plusieurs fois dans une boucle.
- La valeur initiale et les paramètres de texte du bouton sont également assurés pour l'instance actuelle via $ (this) .find ().
-
Événement de clic global ($ (document) .click (...)) :
- Cet écouteur d'événements est utilisé pour implémenter la fonction de "Fermer la case déroulante lors de la cliquetis sur la zone externe du composant".
- ! $ (event.target) .Closest (". Lang-Select"). Longueur détermine si la source de l'événement de clic est en dehors de n'importe quelle zone .lang-sélectionneuse (c'est-à-dire le bouton ou la liste de la boîte déroulante personnalisée).
- Si vous cliquez à l'extérieur, parcourez toutes les boîtes. Boîtes, trouvez toutes les listes déroulantes visibles (.B) et fermez-les.
-
Élément de liste Cliquez sur l'événement ($ ("li"). Cliquez sur (...)) :
- Lorsque l'utilisateur clique sur une option (
- ), le contenu d'affichage et la valeur du bouton correspondant doivent être mis à jour et la liste déroulante est fermée.
- $ (this) .parents ("div.lang-select") est la clé ici. Il commence par l'élément
- cliqué et regarde vers le haut pour l'élément parent Div.lang-Select le plus proche, déterminant ainsi la boîte déroulante personnalisée. De cette façon, même s'il y a plusieurs éléments
- sur la page, le composant auquel il appartient peut être trouvé avec précision.
- Rechercher (". BTN-Select") et trouver (". B") puis trouver les boutons et les conteneurs de liste correspondants dans la plage de div.lang-sélectionner pour le fonctionnement.
-
Button cliquez sur l'événement ($ (". BTN-Select"). Cliquez sur (...)) :
- Lorsque l'utilisateur clique sur le bouton dans la zone déroulante personnalisée, l'état d'affichage de sa liste déroulante doit être commuté.
- event.stoppropagation (); est une étape cruciale, ce qui empêche les événements de clic de bouillonner vers le haut vers le document. Si cette ligne n'est pas disponible, après avoir cliqué sur le bouton pour ouvrir la boîte déroulante, $ (document) .click tirera immédiatement et le fermera à nouveau.
- const CurrentBox = $ (this) .closest (". Box"); Obtient le conteneur .box auquel le bouton est actuellement cliqué.
- $ (". Box"). Not (currentBox) .Each (function () {...}); Iterate sur tous les éléments de la boîte à l'exception de la boîte actuelle et ferme la liste déroulante (.B). Cette méthode est plus générale et plus extensible que id codé en dur = "un" ou id = "deux".
- Enfin, currentbox.find (". B"). Toggle (); basculer(); Bascule l'état d'affichage de la boîte déroulante actuellement cliquée.
Résumé et optimisation supplémentaire
Grâce à la structure HTML ci-dessus, aux scripts de style CSS et jQuery, nous avons réussi à construire avec succès une boîte de sélection de déconnexion personnalisée avec des options d'image, et avons résolu le problème des conflits d'événements et de la confusion de contenu lorsque plusieurs instances coexistent. La clé est:
- Sélecteur localisé: utilisez toujours des méthodes telles que $ (this), find (), le plus proche () et les parents () pour limiter les opérations jQuery à la plage DOM du composant actuel.
- Contrôle des bulles d'événements: utilisez l'événement.stoppropagation () pour empêcher les événements mondiaux inutiles de déclencher.
- Logique de clôture générale: il utilise la méthode de traversée de tous les composants et de l'exclusion des composants actuels pour fermer automatiquement d'autres boîtes déroulantes au lieu d'ID spécifiques à code dur.
Suggestions d'optimisation supplémentaires:
- Accessibilité: pour les composants personnalisés, la navigation par clavier (touches d'onglet, les touches fléchées) et la prise en charge du lecteur d'écran doivent être prises en compte. Cela implique généralement de ajouter des propriétés Aria (comme Aria-Haspopup, Aria-Expanded, Aria-LarredBy) et une écoute supplémentaire d'événements de clavier.
- Optimisation de chargement d'image: si le nombre d'images est grand, vous pouvez considérer la technologie de chargement paresseuse de l'image pour améliorer les performances de la page.
- Image d'arrière-plan CSS: Comme mentionné dans la réponse, vous pouvez définir l'image comme l'image d'arrière-plan du bouton au lieu d'incorporer directement la balise
, ce qui peut éviter que l'élément d'image lui-même de bloquer l'événement de clic du bouton et de fournir une plus grande flexibilité de style. - Componentiisation: Pour des applications plus complexes, envisagez d'encapsulant cette fonctionnalité dans un plug-in jQuery réutilisable ou une classe JavaScript native pour améliorer la modularité et la maintenabilité du code.
- Gestion de l'État: si vous avez besoin de persister la valeur sélectionnée, vous pouvez réintroduire le storage local ou d'autres mécanismes de stockage des clients. Lisez la valeur stockée à l'initialisation et définissez l'état initial de la boîte déroulante en conséquence.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT
Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Ce didacticiel vise à résoudre le problème que le projet Vue.js dispose de pages vierges en ouvrant directement le fichier index.html sans serveur Web ni environnement hors ligne. Nous creuserons dans les raisons pour lesquelles la construction par défaut Vue CLI échoue et fournirons une solution pour emballer tous les code et ressources VUE dans un seul fichier HTML, permettant au projet d'exécuter indépendamment sur l'appareil local sans compter sur un environnement de serveur.

Usemailto: inhreftocreateeemaillinks.startwithforbasiclinks, ajouter? Sujet = & body = forpre-fillutContent, andincludemultipleaddressorcc =, bcc = foradvancedOptions.

Ce tutoriel détaille comment utiliser CSS pour masquer avec précision le contenu de texte spécifique dans les pages HTML pour éviter que le problème de l'ensemble de l'élément parent soit caché en raison de sélecteurs inappropriés. En ajoutant des classes CSS exclusives aux éléments d'emballage du texte cible et en utilisant l'affichage: aucun; Attribut, les développeurs peuvent obtenir un contrôle raffiné des éléments de page, en veillant à ce que seules les pièces requises soient masquées, optimisant ainsi la mise en page et l'expérience utilisateur.

SetThelangAttributeInthehtmltagtospecifypagelanguage, par exemple, français; 2. usocodes comme "ES" ForSpanishor "FR" Forfrench;.

Cet article détaille comment créer une fenêtre de chatbot flottante déclenchée en cliquant sur les boutons à l'aide de HTML, CSS et JavaScript. Grâce au positionnement fixe et à la commutation de style dynamique, un bouton flottant situé dans le coin inférieur droit de la page est réalisé. Après avoir cliqué, une fenêtre de chat apparaîtra et une fonction de clôture est fournie. Le tutoriel contient des exemples de code complets et des étapes d'implémentation conçues pour aider les développeurs à intégrer facilement des fonctionnalités similaires dans leur site Web.

Usethetitleattributeforsimpletooltipsorcssforcustom-styledones.1.addtitle = "text" toanyelementfordtooltips.2.ForStyledToolTips, wraptheelementInacontainer, use.tooltipand.tooltiptextclasseswithcspositioning, pseudo-elelights, et vissibilitycccc

USECSSFLOATPROPERTYTOWRAPTextArnanImage: FloatleftFortExtontheRight, FloatRightFortExtontheLeft, AddmarginForspacing, etClearFloatStopReventLayEtLaySues.

Cet article explore deux problèmes courants lors de l'appel des fonctions JavaScript externes dans HTML: un temps de chargement de script incorrect ne fait pas partie des éléments DOM, et la dénomination des fonctions peut entrer en conflit avec les événements ou les mots clés intégrés du navigateur. L'article fournit des solutions détaillées, y compris les emplacements de référence de script de peaufinage et les spécifications de dénomination des bonnes fonctions pour s'assurer que le code JavaScript est correctement exécuté.
