En mi JSFiddle , simplemente estoy tratando de iterar sobre una matriz de elementos. La matriz no está vacía, como demuestran las declaraciones de registro. Sin embargo, la llamada a forEachme da el (no tan útil) error "No detectado TypeError: undefinedno es una función".
Debo estar haciendo algo estúpido; ¿Qué estoy haciendo mal?
Mi 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
fuente
fuente

arrno es una matriz, sino unaHTMLCollection. No tiene los mismos métodos que una matriz. developer.mozilla.org/en-US/docs/Web/API/… . Aquí hay una publicación SO incluso al respecto: stackoverflow.com/questions/13433799/…[1,2,3].forEach(function(v,i,a) { console.log(v); });está bien. ¿Cuál es la diferencia entre esto y la matriz en mi ejemplo?arr instanceof Arrayresultado,falseno podrá utilizar ningún método prototipo delArrayobjeto, como Array.prototype.forEach () .arres una HTMLCollection y una matriz como un objeto (pero no hereda ni crea una instanciaArray). Por lo tanto, suforciclo estándar funcionará ya que simplemente itera a través del índice del objeto y no es un prototipo deArray.Respuestas:
Eso es porque
document.getElementsByClassNamedevuelve una colección HTMLCollection , no una matriz.Afortunadamente, es un objeto "similar a una matriz" (lo que explica por qué se registra como si fuera un objeto y por qué puede iterar con un
forbucle estándar ), por lo que puede hacer esto:Con ES6 (en navegadores modernos o con Babel), también puede usar
Array.fromque crea matrices a partir de objetos similares a matrices:o distribuir el objeto similar a una matriz en una matriz:
fuente
argumentses uno. Los objetos jQuery son otro. Podrías hacer uno tú mismo:var a = {"0": "str1", "1": "str2", length: 2}querySelectorAll('.myClass')debería funcionar. Todavía estoy esperando que se agreguen iteradores a la API NodeList. :-(Array.prototype.forEach, no le permitirá hacerlo. Si tiene ese requisito, use elforbucle estándar más adelante o si desea usar el objeto de matriz, useArray.prototype.everyoArray.prototype.some(tenga en cuenta que todos / algunos no son compatibles con IE8 o menos)spliceen esa definición, pero cuando quiero ser más "como una matriz" para poder usarmap,filteretc., entonces lo incluyo.forEachNo es necesario el uso de iteraciones simplessplice.Prueba esto, debería funcionar:
fuente
en el caso de que desee acceder al ID de cada elemento de una clase específica puede hacer lo siguiente:
fuente