J'utilise un forEach pour parcourir une nodeList. Mon code est le suivant

var array = document.querySelectorAll('items');

array.forEach(function (item) {
    console.log(item);
}); 

Et ce code renvoie une erreur comme

TypeError non récupéré: array.forEach n'est pas une fonction

Ensuite, après avoir lu quelques articles de blog en ligne, j'ai changé le code en ceci.

[].forEach.call(array, (function (item) {
    console.log(item);
})); 

Quelqu'un pourrait-il expliquer pourquoi il n'est pas possible d'appeler forEach sur une nodeList et à quoi sert le deuxième élément de code ci-dessus. :)

Modifier: 25/07/2017

Cette question n'est pas valable pour les navigateurs modernes. Vous pouvez utiliser forEach sur les listes de nœuds

Bien que NodeList ne soit pas un tableau, il est possible de l'itérer à l'aide de forEach (). Il peut également être converti en tableau à l'aide de Array.from ().

Cependant, certains navigateurs plus anciens n'ont pas encore implémenté NodeList.forEach () ni Array.from (). Mais ces limitations peuvent être contournées en utilisant Array.prototype.forEach () (plus dans ce document).

Réf: MDN

9
It worked yesterday. 10 juil. 2015 à 13:06

2 réponses

querySelectorAll obtient l'élément dans array-like l'objet et non un tableau. Vous devez donc utiliser ce que vous avez dans le deuxième exemple de code.

-1
Bhojendra Rauniyar 10 juil. 2015 à 10:08

L'objet NodeList ne contient pas la méthode forEach, c'est une méthode de Objet Array. le code ci-dessous:

[].forEach.call(array, (function (item) {
    console.log(item);
})); 

Utilise la méthode forEach du tableau et lui transmet un NodeList.

Une autre option que vous avez, et mieux encore, est de convertir votre NodeList en un tableau, comme ceci:

var myArrayOfNodes = [].slice.call(NodeList);

Elle utilise les objets Array slice méthode pour créer un tableau de nœuds à partir d'un NodeList. C'est une meilleure approche car vous pouvez alors utiliser un tableau plutôt que de pirater un objet de type tableau

4
atmd 10 juil. 2015 à 10:13