Dans mon JSFiddle , j'essaye simplement d'itérer sur un tableau d'éléments. Le tableau n'est pas vide, comme le prouvent les instructions du journal. Pourtant, l'appel à forEach
me donne l' erreur (pas si utile) «Uncaught TypeError
: undefined
is not a function».
Je dois faire quelque chose de stupide; Qu'est-ce que je fais mal?
Mon code:
var arr = document.getElementsByClassName('myClass');
console.log(arr);
console.log(arr[0]);
arr.forEach(function(v, i, a) {
console.log(v);
});
.myClass {
background-color: #FF0000;
}
<div class="myClass">Hello</div>
arr
n'est pas un tableau, mais unHTMLCollection
. Il n'a pas les mêmes méthodes qu'un tableau. developer.mozilla.org/en-US/docs/Web/API/… . Voici même un article de SO à ce sujet: stackoverflow.com/questions/13433799/…[1,2,3].forEach(function(v,i,a) { console.log(v); });
va. Quelle est la différence entre ceci et le tableau dans mon exemple?arr instanceof Array
cela entraînera,false
il ne pourra pas utiliser de méthodes prototypes de l'Array
objet telles que Array.prototype.forEach () .arr
est une HTMLCollection et un tableau comme un objet (mais n'hérite ni n'instancieArray
). Par conséquent, votrefor
boucle standard fonctionnera car elle itère simplement dans l'index de l'objet et n'est pas un prototype deArray
.Réponses:
C'est parce que
document.getElementsByClassName
renvoie une HTMLCollection , pas un tableau.Heureusement, c'est un objet "de type tableau" (ce qui explique pourquoi il est journalisé comme s'il s'agissait d'un objet et pourquoi vous pouvez itérer avec une
for
boucle standard ), vous pouvez donc faire ceci:Avec ES6 (sur les navigateurs modernes ou avec Babel), vous pouvez également utiliser
Array.from
qui construit des tableaux à partir d'objets de type tableau:ou répartissez l'objet de type tableau dans un tableau:
la source
arguments
est un. Les objets jQuery en sont un autre. Vous pourriez en fabriquer un vous-même:var a = {"0": "str1", "1": "str2", length: 2}
querySelectorAll('.myClass')
devrait fonctionner. J'attends toujours que les itérateurs soient ajoutés à l'API NodeList. :-(Array.prototype.forEach
ne vous laissera pas faire. Si vous avez cette exigence plus tard, utilisez lafor
boucle standard ou si vous souhaitez utiliser l'objet tableau, utilisezArray.prototype.every
ouArray.prototype.some
(notez cependant que tous / certains ne sont pas pris en charge dans IE8 ou moins)splice
dans cette définition, mais quand je veux être plus "en forme de tableau" pour pouvoir l'utilisermap
,filter
etc., alors je l'inclus. Une itération simple en utilisantforEach
n'a pas besoinsplice
.Essayez ceci, cela devrait fonctionner:
la source
dans le cas où vous souhaitez accéder à l'ID de chaque élément d'une classe spécifique, vous pouvez effectuer les opérations suivantes:
la source