Em meu JSFiddle , estou simplesmente tentando iterar em uma matriz de elementos. O array não está vazio, como provam as declarações de log. No entanto, a chamada para forEach
me dá o (não tão útil) erro “Não capturado TypeError
: undefined
não é uma função”.
Devo estar fazendo algo estúpido; O que estou fazendo de errado?
Meu código:
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>
javascript
foreach
Jer
fonte
fonte
arr
não é uma matriz, mas aHTMLCollection
. Não possui os mesmos métodos de um array. developer.mozilla.org/en-US/docs/Web/API/… . Aqui está um post sobre isso mesmo: stackoverflow.com/questions/13433799/…[1,2,3].forEach(function(v,i,a) { console.log(v); });
está bom. Qual é a diferença entre isso e a matriz no meu exemplo?arr instanceof Array
resultará,false
ele não pode se beneficiar de nenhum método de protótipo doArray
objeto, como Array.prototype.forEach () .arr
é um HTMLCollection e um objeto como um array (mas não herda ou instanciadoArray
). Portanto, seufor
loop padrão funcionará como se simplesmente iterasse através do índice do objeto e não fosse um protótipo deArray
.Respostas:
Isso ocorre porque
document.getElementsByClassName
retorna um HTMLCollection , não um array.Felizmente, é um objeto "semelhante a um array" (o que explica por que é registrado como se fosse um objeto e por que você pode iterar com um
for
loop padrão ), então você pode fazer isso:Com ES6 (em navegadores modernos ou com Babel), você também pode usar o
Array.from
que cria arrays a partir de objetos semelhantes a array:ou espalhe o objeto semelhante a uma matriz em uma matriz:
fonte
arguments
é um. Os objetos jQuery são outro. Você pode fazer um você mesmo:var a = {"0": "str1", "1": "str2", length: 2}
querySelectorAll('.myClass')
deve funcionar. Ainda estou esperando que os iteradores sejam adicionados à API NodeList. :-(Array.prototype.forEach
, não o deixarei fazer isso. Se você tiver esse requisito mais tarde, use ofor
loop padrão ou se quiser usar o objeto array, useArray.prototype.every
ouArray.prototype.some
(note que todos / alguns não são suportados no IE8 ou menos)splice
nessa definição, mas quando eu quiser ser mais "array-like" de ser capaz de usarmap
,filter
e assim por diante, então eu incluí-lo. O uso de iteração simplesforEach
não precisasplice
.Experimente isto deve funcionar:
fonte
caso deseje acessar o ID de cada elemento de uma classe específica, você pode fazer o seguinte:
fonte