Je veux parcourir certains éléments DOM, je fais ceci:
document.getElementsByClassName( "myclass" ).forEach( function(element, index, array) {
//do stuff
});
mais je reçois une erreur:
document.getElementsByClassName ("myclass"). forEach n'est pas une fonction
J'utilise Firefox 3, donc je sais que les deux getElementsByClassName
et Array.forEach
sont présents. Cela fonctionne bien:
[2, 5, 9].forEach( function(element, index, array) {
//do stuff
});
Est le résultat d' getElementsByClassName
un tableau? Sinon, c'est quoi?
la source
[].forEach.call(elsArray, function () {...})
.querySelectorAll
La méthode renvoie cependant une NodeList.document.getElementsByClassName()
doit retourner unHTMLCollection
(qui est très similaire mais pas un NodeList). Merci d'avoir signalé l'erreur.HTMLCollection
conseil. Maintenant, je peux enfin utiliserHTMLCollection.prototype.forEach = Array.prototype.forEach;
dans mon code.Vous pouvez utiliser
Array.from
pour convertir la collection en tableau, ce qui est beaucoup plus propre queArray.prototype.forEach.call
:Dans les anciens navigateurs qui ne prennent pas en charge
Array.from
, vous devez utiliser quelque chose comme Babel.ES6 ajoute également cette syntaxe:
Reste la déstructuration avec des
...
travaux sur tous les objets de type tableau, non seulement les tableaux eux-mêmes, mais une bonne vieille syntaxe de tableau est utilisée pour construire un tableau à partir des valeurs.Alors que la fonction alternative
querySelectorAll
(qui rend un peugetElementsByClassName
obsolète) retourne une collection qui aforEach
nativement, d'autres méthodes commemap
oufilter
manquent, donc cette syntaxe est toujours utile:la source
Ou vous pouvez utiliser
querySelectorAll
ce qui retourne NodeList :Pris en charge par les navigateurs modernes (y compris Edge, mais pas IE):
puis-je utiliser querySelectorAll
NodeList.prototype.forEach ()
MDN: Document.querySelectorAll ()
la source
Modifier: Bien que le type de retour ait changé dans les nouvelles versions de HTML (voir la réponse mise à jour de Tim Down), le code ci-dessous fonctionne toujours.
Comme d'autres l'ont dit, c'est une NodeList. Voici un exemple complet et fonctionnel que vous pouvez essayer:
Cela fonctionne dans IE 9, FF 5, Safari 5 et Chrome 12 sur Win 7.
la source
Le résultat de
getElementsByClassName()
n'est pas un tableau, mais un objet de type tableau . Plus précisément, il s'appelle unHTMLCollection
, à ne pas confondre avecNodeList
( qui a sa propreforEach()
méthode ).Une façon simple avec ES2015 de convertir un objet de type tableau pour une utilisation avec
Array.prototype.forEach()
celui qui n'a pas encore été mentionné consiste à utiliser l'opérateur d' étalement ou la syntaxe d'étalement :la source
Non
Comme pour toutes les méthodes DOM qui retournent plusieurs éléments, il s'agit d'une NodeList, voir https://developer.mozilla.org/en/DOM/document.getElementsByClassName
la source
Comme déjà dit,
getElementsByClassName
renvoie une HTMLCollection , qui est définie commeAuparavant, certains navigateurs renvoyaient une NodeList à la place.
La différence est importante, car DOM4 définit désormais NodeList comme étant itérables.
Selon le projet Web IDL ,
Cela signifie que si vous souhaitez utiliser
forEach
, vous pouvez utiliser une méthode DOM qui renvoie une NodeList , commequerySelectorAll
.Notez que ce n'est pas encore largement pris en charge. Regarde aussi également la méthode forEach de Node.childNodes?
la source
forEach in not a function
document.querySelectorAll(...).forEach is not a function
Il ne renvoie pas un
Array
, il renvoie un NodeList .la source
Voici le moyen le plus sûr:
la source
getElementsByClassName
renvoie HTMLCollection dans les navigateurs modernes.qui est un objet de type tableau similaire aux arguments qui peut être itéré par
for...of
boucle, voir ci-dessous ce que le doc MDN en dit:exemple
la source
error TS2488: Type 'HTMLCollectionOf<Element>' must have a '[Symbol.iterator]()' method that returns an iterator.
Voici un test que j'ai créé sur jsperf: https://jsperf.com/vanillajs-loop-through-elements-of-class
La version la plus performante de Chrome et Firefox est la bonne vieille boucle pour en combinaison avec document.getElementsByClassName:
Dans Safari, cette variante est gagnante:
Si vous voulez la variante la plus performante pour tous les navigateurs, ce pourrait être celle-ci:
la source