En utilisant uniquement JavaScript, quelle est la façon la plus efficace de sélectionner tous les éléments DOM qui ont un certain data-
attribut (disons data-foo
). Les éléments peuvent être différents éléments de balise.
<p data-foo="0"></p><br/><h6 data-foo="1"></h6>
javascript
html
dom
DrANoel
la source
la source
document.querySelectorAll
cela ne fonctionne pas sur IE7. Vous devriez créer un script de secours qui parcourrait l'arborescence DOM et vérifierait l'attribut dans chaque balise (en fait, je n'ai aucune idée de la vitessequerySelectorAll
, et irais pour une vérification manuelle des balises).data-
éléments, à savoir:data-foo=0
etdata-bar=1
etdata-app="js"
etdata-date="20181231"
Réponses:
Vous pouvez utiliser querySelectorAll :
la source
vous obtiendra tous les éléments avec cet attribut.
vous obtiendrez seulement ceux avec une valeur de 1.
la source
.querySelectorAll()
renvoie aNodeList
. Comme indiqué dans cette documentation, vous pouvez parcourir la collection à l'aide de.forEach()
. Notez qu'il s'agit d'une solution non IE: developer.mozilla.org/en-US/docs/Web/API/… . Si vous devez prendre en charge IE, vous devrez simplement parcourir la NodeList en utilisant unefor
boucle régulière .Essayez-le → ici
la source
for in
itérera sur les propriétés de longueur et d'élément. Au lieu de cela, utilisezfor of
pour itérer sur les propriétés conçues pour être itéréesVoici une solution intéressante: il utilise le moteur CSS des navigateurs pour ajouter une propriété fictive aux éléments correspondant au sélecteur, puis évalue le style calculé pour trouver les éléments correspondants:
la source
Je ne sais pas qui m'a frappé avec un -1, mais voici la preuve.
http://jsfiddle.net/D798K/2/
la source
getElementsByTagName
avec un*
sélecteur global ( ) est cassé dans les anciennes versions d'IE. C'est là qu'une recherche DOM récursive fait le travail. Il n'y a pas non plus de propriété "data-foo" sur un ElementNode mappé à partir de l'data-foo
attribut. Vous êtes à la recherche de l'dataset
objet ( par exemple:node.dataset.foo
.Bien que pas aussi joli que
querySelectorAll
(qui a une litanie de problèmes), voici une fonction très flexible qui récursive le DOM et devrait fonctionner dans la plupart des navigateurs (anciens et nouveaux). Tant que le navigateur prend en charge votre condition (c.-à-d.: Les attributs de données), vous devriez pouvoir récupérer l'élément.Pour les curieux: Ne vous embêtez pas à tester cela par rapport à QSA sur jsPerf. Des navigateurs comme Opera 11 mettent en cache la requête et faussent les résultats.
Code:
Vous pouvez ensuite l'initier avec les éléments suivants:
recurseDOM(document.body, {"1": 1});
pour la vitesse, ou tout simplementrecurseDOM(document.body);
Exemple avec votre spécification: http://jsbin.com/unajot/1/edit
Exemple avec des spécifications différentes: http://jsbin.com/unajot/2/edit
la source
querySelectorAll
?querySelectorAll
api