J'essaie actuellement d'écrire du JavaScript pour obtenir l'attribut de la classe qui a été cliquée. Je sais que pour le faire correctement, je dois utiliser un écouteur d'événements. Mon code est le suivant:
var classname = document.getElementsByClassName("classname");
var myFunction = function() {
var attribute = this.getAttribute("data-myattribute");
alert(attribute);
};
classname.addEventListener('click', myFunction(), false);
Je m'attendais à recevoir une boîte d'alerte à chaque fois que je cliquais sur l'une des classes pour me dire l'attribut mais malheureusement cela ne fonctionne pas. Quelqu'un peut-il aider s'il vous plaît?
( Remarque - je peux le faire assez facilement, jQuery
mais je ne voudrais pas l' utiliser )
javascript
dom-events
30secondstosam
la source
la source
Réponses:
Cela devrait fonctionner.
getElementsByClassName
renvoie untableau de typetableau (voir modification) des éléments correspondant aux critères.jQuery fait la boucle pour vous, ce que vous devez faire en JavaScript simple.
Si vous avez le support ES6, vous pouvez remplacer votre dernière ligne par:
Remarque: les navigateurs plus anciens (comme IE6, IE7, IE8) ne prennent pas en charge
getElementsByClassName
et reviennent doncundefined
.EDIT: correction
getElementsByClassName
ne renvoie pas de tableau, mais une HTMLCollection dans la plupart des cas, ou une NodeList dans certains navigateurs ( ref Mozilla ). Ces deux types sont de type tableau (ce qui signifie qu'ils ont une propriété length et que les objets sont accessibles via leur index), mais ne sont pas strictement un tableau ou hérités d'un tableau. (ce qui signifie que d'autres méthodes pouvant être exécutées sur un tableau ne peuvent pas être exécutées sur ces types)Merci à l'utilisateur @ Nemo de l' avoir signalé et de m'avoir invité à comprendre.
la source
document.getElementsByClassName
retourne en fait toujours un tableau, même si un seul élément correspond aux critèresArray.from()
a un deuxième paramètre qui est une fonction de carte de sorte que ce qui précède (en supposant le support es6) pourrait être écritArray.from(classname, c => c.addEventListener('click', myFunction));
.* Ceci a été modifié pour permettre aux enfants de la classe cible de déclencher les événements. Voir le bas de la réponse pour plus de détails. *
Une réponse alternative pour ajouter un écouteur d'événements à une classe où des éléments sont fréquemment ajoutés et supprimés. Ceci est inspiré par la
on
fonction de jQuery où vous pouvez passer un sélecteur pour un élément enfant que l'événement écoute.Violon: https://jsfiddle.net/u6oje7af/94/
Cela écoutera les clics sur les enfants de l'
base
élément et si la cible d'un clic a un parent correspondant au sélecteur, l'événement de classe sera géré. Vous pouvez ajouter et supprimer des éléments comme vous le souhaitez sans avoir à ajouter plus d'écouteurs de clic aux éléments individuels. Cela les rattrapera même pour les éléments ajoutés après l'ajout de cet écouteur, tout comme la fonctionnalité jQuery (qui, j'imagine, est quelque peu similaire sous le capot).Cela dépend des événements qui se propagent, donc si vous êtes
stopPropagation
sur l'événement ailleurs, cela peut ne pas fonctionner. De plus, laclosest
fonction a apparemment des problèmes de compatibilité avec IE (qu'est-ce qui ne l'est pas?).Cela pourrait être transformé en une fonction si vous devez effectuer ce type d'action en écoutant à plusieurs reprises, comme
=========================================
EDIT: Ce message utilisait à l'origine la
matches
fonction pour Éléments DOM sur la cible de l'événement, mais cela a limité les cibles des événements à la classe directe uniquement. Il a été mis à jour pour utiliser laclosest
fonction à la place, permettant aux événements sur les enfants de la classe souhaitée de déclencher également les événements. Lematches
code d' origine se trouve sur le violon d'origine: https://jsfiddle.net/u6oje7af/23/la source
Vous pouvez utiliser le code ci-dessous:
la source
evt.target.classList.contains('databox')
Avec le JavaScript moderne, cela peut être fait comme ceci:
event.target
pour récupérer plus d'informations pour un élément spécifiquela source