second first ejemplos div childnodes child javascript loops children

javascript - first - Loop a través de childNodes



javascript next child (7)

Aquí es cómo puedes hacerlo con for-in loop.

var children = element.childNodes; for(child in children){ console.log(children[child]); }

Estoy intentando recorrer los nińos infantiles de esta manera:

var children = element.childNodes; children.forEach(function(item){ console.log(item); });

Sin embargo, forEach Uncaught TypeError: undefined is not a function debido a forEach función. También trato de usar children lugar de childNodes pero nada cambió.

¿Alguien sabe lo que está pasando?


Aquí hay una forma funcional de ES6 de iterar sobre un NodeList . Este método usa los Array para cada uno de los forEach :

Array.prototype.forEach.call(element.childNodes, f)

Donde f es la función de iterador que recibe un nodo hijo ya que es el primer parámetro y el índice como el segundo.

Si necesita iterar sobre NodeLists más de una vez, podría crear un pequeño método de utilidad funcional a partir de esto:

const forEach = f => x => Array.prototype.forEach.call(x, f); // For example, to log all child nodes forEach((item) => { console.log(item); })(element.childNodes) // The functional forEach is handy as you can easily created curried functions const logChildren = forEach((childNode) => { console.log(childNode); }) logChildren(elementA.childNodes) logChildren(elementB.childNodes)

(Puede hacer el mismo truco para map() y otras funciones de Array).


La variable children es una instancia de NodeList y las NodeList s no son verdaderas Array y, por lo tanto, no heredan el método forEach .

También algunos navegadores realmente lo soportan nodeList.forEach

ES5

Puede usar slice desde Array para convertir NodeList en una Array adecuada.

var array = Array.prototype.slice.call(children);

También puede usar call para invocar forEach y pasarlo como NodeList como contexto.

[].forEach.call(children, function(child) {});

ES6

Puede usar el método de para convertir su NodeList en una Array .

var array = Array.from(children);

O también puede usar la sintaxis de propagación ... como tal

let array = [ ...children ];

Un truco que se puede usar es NodeList.prototype.forEach = Array.prototype.forEach y luego puede usar forEach con cualquier NodeList sin tener que convertirlos cada vez.

NodeList.prototype.forEach = Array.prototype.forEach var children = element.childNodes; children.forEach(function(item){ console.log(item); });

Consulte Una inmersión completa en NodeLists, Arrays, conversión de NodeLists y comprensión del DOM para obtener una buena explicación y otras formas de hacerlo.


Prueba con for loop. Da error en forEach porque es una colección de nodos nodelist .

O esto debería convertir node-list en array

function toArray(obj) { var array = []; for (var i = 0; i < obj.length; i++) { array[i] = obj[i]; } return array; }

O puedes usar esto

var array = Array.prototype.slice.call(obj);


Pruebe esto [recorrido de orden inverso]:

var childs = document.getElementById(''parent'').childNodes; var len = childs.length; if(len --) do { console.log(''node: '', childs[len]); } while(len --);

O [en orden transversal]

var childs = document.getElementById(''parent'').childNodes; var len = childs.length, i = -1; if(++i < len) do { console.log(''node: '', childs[i]); } while(++i < len);


Si haces mucho de este tipo de cosas, entonces valdría la pena definir la función por ti mismo.

if (typeof NodeList.prototype.forEach == "undefined"){ NodeList.prototype.forEach = function (cb){ for (var i=0; i < this.length; i++) { var node = this[i]; cb( node, i ); } }; }


element.lastChild.nextSibling === null muy tarde a la fiesta, pero desde element.lastChild.nextSibling === null , la siguiente parece ser la opción más directa para mí:

for(var child=element.firstChild; child!==null; child=child.nextSibling) { console.log(child); }