Estoy tratando de hacer un bucle simple:
const parent = this.el.parentElement
console.log(parent.children)
parent.children.forEach(child => {
console.log(child)
})
Pero me sale el siguiente error:
VM384: 53 Error de tipo no capturado: parent.children.forEach no es una función
Aunque los parent.children
registros:
¿Cual podría ser el problema?
Nota: Aquí hay un JSFiddle .
javascript
ecmascript-6
vue.js
alexchenco
fuente
fuente
Respuestas:
Primera opción: invocar forEach indirectamente
El
parent.children
es un objeto tipo Array. Use la siguiente solución:El tipo
parent.children
esNodeList
, que es un objeto tipo Array porque:length
propiedad, que indica el número de nodos.{0: NodeObject, 1: NodeObject, length: 2, ...}
Ver más detalles en este artículo .
Segunda opción: usar el protocolo iterable
parent.children
es unHTMLCollection
: que implementa el protocolo iterable . En un entorno ES2015, puede usarloHTMLCollection
con cualquier construcción que acepte iterables.Usar
HTMLCollection
con el operador de propagación:O con el
for..of
ciclo (que es mi opción preferida):fuente
parent.children
No es una matriz. Es una colección HTMLC y no tieneforEach
método. Puedes convertirlo a la matriz primero. Por ejemplo en ES6:o usando el operador de propagación:
fuente
parent.children
devolverá unalista delista denodos, técnicamente una colección html . Esa es una matriz como objeto, pero no una matriz, por lo que no puede llamar directamente a las funciones de matriz sobre ella. En este contexto, puede usarArray.from()
para convertir eso en una matriz real,fuente
Una versión más ingenua , al menos está seguro de que funcionará en todos los dispositivos, sin conversión y ES6:
https://jsfiddle.net/swb12kqn/5/
fuente
parent.children
es unHTMLCollection
objeto tipo matriz. Primero, debe convertirlo en un método realArray
para usarArray.prototype
.fuente
Esto se debe a que
parent.children
es una NodeList y no es compatible con el.forEach
método (ya que NodeList es una estructura similar a una matriz pero no una matriz), por lo tanto, intente llamarla primero convirtiéndola en matriz usandofuente
No hay necesidad de
forEach
, puedes iterar usando solo elfrom
segundo parámetro de la siguiente manera:fuente
Array.from
convierte el objeto dado en el primer parámetro en una matriz. El resultado es el mismo que en la respuesta de madox2 sin necesidad de unforEach
bucle adicional ( documentosArray.from
MDN ).Si está tratando de recorrer un sitio
NodeList
como este:Recomiendo encarecidamente bucle de esta manera:
Personalmente, he intentado varias formas, pero la mayoría de ellas no funcionaron, ya que quería hacer un bucle
NodeList
, pero esta funciona como un encanto, ¡pruébalo!No
NodeList
es una matriz, pero la tratamos como una matriz, por loArray.
tanto, debe saber que no es compatible con navegadores antiguos.¿Necesita más información sobre
NodeList
? Por favor lea su documentación en MDN .fuente
Como está utilizando las funciones de ES6 ( funciones de flecha ), también puede simplemente usar un bucle for como este:
fuente
Puedes verificar si escribiste correctamente para Cada , si escribiste foreach como en otros lenguajes de programación, no funcionará.
fuente
Puede usar en
childNodes
lugar dechildren
,childNodes
también es más confiable teniendo en cuenta los problemas de compatibilidad del navegador, más información aquí :o usando el operador de propagación:
fuente