Quiero iterar sobre algunos elementos DOM, estoy haciendo esto:
document.getElementsByClassName( "myclass" ).forEach( function(element, index, array) {
//do stuff
});
pero me sale un error:
document.getElementsByClassName ("myclass"). forEach no es una función
Estoy usando Firefox 3, así que sé que tanto getElementsByClassName
y Array.forEach
están presentes. Esto funciona bien:
[2, 5, 9].forEach( function(element, index, array) {
//do stuff
});
¿Es el resultado de getElementsByClassName
una matriz? Si no, ¿qué es?
fuente
[].forEach.call(elsArray, function () {...})
.querySelectorAll
Sin embargo, el método devuelve una NodeList.document.getElementsByClassName()
debe devolver unHTMLCollection
(que es muy similar pero no una NodeList). Gracias por señalar el error.HTMLCollection
sugerencia. Ahora finalmente puedo usarHTMLCollection.prototype.forEach = Array.prototype.forEach;
en mi código.Puede usar
Array.from
para convertir la colección en matriz, que es mucho más limpia queArray.prototype.forEach.call
:En los navegadores más antiguos que no son compatibles
Array.from
, debe usar algo como Babel.ES6 también agrega esta sintaxis:
Descanse la desestructuración con
...
trabajos en todos los objetos similares a una matriz, no solo las matrices en sí mismas, sino que se usa una buena sintaxis de matriz antigua para construir una matriz a partir de los valores.Mientras que la función alternativa
querySelectorAll
(que hacegetElementsByClassName
obsoleta) devuelve una colección que tieneforEach
nativamente, otros métodos comomap
ofilter
faltan, por lo que esta sintaxis sigue siendo útil:fuente
O puede usar
querySelectorAll
que devuelve NodeList :Compatible con navegadores modernos (incluido Edge, pero no IE):
¿Puedo usar querySelectorAll
NodeList.prototype.forEach ()
MDN: Document.querySelectorAll ()
fuente
Editar: aunque el tipo de retorno ha cambiado en las nuevas versiones de HTML (consulte la respuesta actualizada de Tim Down), el código siguiente sigue funcionando.
Como otros han dicho, es una NodeList. Aquí hay un ejemplo completo y funcional que puedes probar:
Esto funciona en IE 9, FF 5, Safari 5 y Chrome 12 en Win 7.
fuente
El resultado de
getElementsByClassName()
no es una matriz, sino un objeto tipo matriz . Específicamente se llama unHTMLCollection
, no debe confundirse conNodeList
( que tiene su propioforEach()
método ).Una forma simple con ES2015 para convertir un objeto tipo matriz para usar con
Array.prototype.forEach()
eso que aún no se ha mencionado es usar el operador de propagación o la sintaxis de propagación :fuente
No
Al igual que con todos los métodos DOM que devuelven múltiples elementos, es una NodeList, consulte https://developer.mozilla.org/en/DOM/document.getElementsByClassName
fuente
Como ya se dijo,
getElementsByClassName
devuelve una colección HTMLC , que se define comoAnteriormente, algunos navegadores devolvían una NodeList en su lugar.
La diferencia es importante, porque DOM4 ahora define NodeList s como iterable.
Según el borrador de IDL web ,
Eso significa que, si desea usar
forEach
, puede usar un método DOM que devuelva una NodeList , comoquerySelectorAll
.Tenga en cuenta que esto aún no es ampliamente compatible. Ver también ¿ Cada método de Node.childNodes?
fuente
forEach in not a function
document.querySelectorAll(...).forEach is not a function
No devuelve un
Array
, devuelve una NodeList .fuente
Esta es la forma más segura:
fuente
getElementsByClassName
devuelve la colección HTMLC en los navegadores modernos.que es un objeto similar a una matriz similar a los argumentos que es iterable por
for...of
bucle, vea a continuación lo que dice MDN doc al respecto:ejemplo
fuente
error TS2488: Type 'HTMLCollectionOf<Element>' must have a '[Symbol.iterator]()' method that returns an iterator.
Aquí hay una prueba que creé en jsperf: https://jsperf.com/vanillajs-loop-through-elements-of-class
La versión más perfumada en Chrome y Firefox es el viejo bucle for en combinación con document.getElementsByClassName:
En Safari, esta variante es la ganadora:
Si desea la variante más perfumante para todos los navegadores, podría ser esta:
fuente