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);
}