Zmienna children
jest NodeList
instancją i NodeList
s nie są prawdziwe Array
i dlatego nie dziedziczą forEach
metody.
Niektóre przeglądarki faktycznie to obsługują nodeList.forEach
ES5
Możesz użyć slice
from, Array
aby przekonwertować NodeList
plik na właściwy Array
.
var array = Array.prototype.slice.call(children);
Możesz również po prostu użyć go call
do wywołania forEach
i przekazania go NodeList
jako kontekstu.
[].forEach.call(children, function(child) {});
ES6
Możesz użyć tej from
metody, aby przekonwertować NodeList
plik na plik Array
.
var array = Array.from(children);
Albo można też użyć składni spread...
jak tak
let array = [ ...children ];
Hack, którego można użyć, jest NodeList.prototype.forEach = Array.prototype.forEach
i można go następnie użyć forEach
z dowolnym NodeList
bez konieczności ich każdorazowej konwersji.
NodeList.prototype.forEach = Array.prototype.forEach
var children = element.childNodes;
children.forEach(function(item){
console.log(item);
});
Zobacz obszerne omówienie NodeLists, Arrays, konwersji NodeLists i zrozumienia DOM aby uzyskać dobre wyjaśnienie i inne sposoby zrobienia tego.
[].forEach.call(element.childNodes, child => console.log(child))
let items = [ ...children ]
zamieni go w tablicęJestem bardzo spóźniony na imprezę, ale od tego
element.lastChild.nextSibling === null
czasu następująca opcja wydaje mi się najprostsza:for(var child=element.firstChild; child!==null; child=child.nextSibling) { console.log(child); }
źródło
Oto, jak możesz to zrobić za pomocą
for-in
pętli.var children = element.childNodes; for(child in children){ console.log(children[child]); }
źródło
for ... of ...
, jest to składnia ES6.Nie mogłem się oprzeć, aby dodać kolejną metodę, używając
childElementCount
. Zwraca liczbę węzłów elementów podrzędnych z danego rodzica, więc możesz nad nim zapętlić.for(var i=0, len = parent.childElementCount ; i < len; ++i){ ... do something with parent.children[i] }
źródło
Spróbuj z
for
pętlą. Daje błąd,forEach
ponieważ jest to zbiór węzłównodelist
.Lub powinno to przekonwertować listę węzłów na tablicę
function toArray(obj) { var array = []; for (var i = 0; i < obj.length; i++) { array[i] = obj[i]; } return array; }
Lub możesz tego użyć
var array = Array.prototype.slice.call(obj);
źródło
const results = Array.from(myNodeList.values()).map(parser_item);
NodeList nie jest Array, ale NodeList.values () zwraca Iterator tablicy, więc można go przekonwertować na Array.
źródło
Spróbuj tego [przechodzenie w odwrotnej kolejności]:
var childs = document.getElementById('parent').childNodes; var len = childs.length; if(len --) do { console.log('node: ', childs[len]); } while(len --);
LUB [w celu przejścia]
var childs = document.getElementById('parent').childNodes; var len = childs.length, i = -1; if(++i < len) do { console.log('node: ', childs[i]); } while(++i < len);
źródło
Oto funkcjonalny sposób iteracji w ES6 po pliku
NodeList
. Metoda ta wykorzystujeArray
„sforEach
tak:Array.prototype.forEach.call(element.childNodes, f)
Gdzie
f
jest funkcją iteratora, która otrzymuje węzły potomne jako pierwszy parametr i indeks jako drugi.Jeśli potrzebujesz iterować po NodeLists więcej niż raz, możesz z tego utworzyć małą funkcjonalną metodę narzędziową:
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)
(Możesz zrobić tę samą sztuczkę dla
map()
i innych funkcji Array).źródło
Jeśli robisz dużo tego typu rzeczy, warto samemu zdefiniować funkcję.
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 ); } }; }
źródło