Переменная children
является NodeList
экземпляром, а NodeList
s не являются истинными, Array
поэтому они не наследуют forEach
метод.
Также некоторые браузеры поддерживают его nodeList.forEach
ES5
Вы можете использовать slice
from Array
для преобразования NodeList
в правильный Array
.
var array = Array.prototype.slice.call(children);
Вы также можете просто call
вызвать forEach
и передать его в NodeList
качестве контекста.
[].forEach.call(children, function(child) {});
ES6
Вы можете использовать этот from
метод для преобразования вашего файла NodeList
в формат Array
.
var array = Array.from(children);
Или вы также можете использовать синтаксис распространения,...
например
let array = [ ...children ];
Хак, который можно использовать, NodeList.prototype.forEach = Array.prototype.forEach
и вы можете использовать forEach
с любым NodeList
без необходимости конвертировать их каждый раз.
NodeList.prototype.forEach = Array.prototype.forEach
var children = element.childNodes;
children.forEach(function(item){
console.log(item);
});
См. Подробное описание списков узлов, массивов, преобразования списков узлов и понимания модели DOM для получения хорошего объяснения и других способов сделать это.
[].forEach.call(element.childNodes, child => console.log(child))
let items = [ ...children ]
превратим его в массивЯ очень опаздываю на вечеринку, но с тех пор
element.lastChild.nextSibling === null
, как мне кажется, наиболее простой вариант:for(var child=element.firstChild; child!==null; child=child.nextSibling) { console.log(child); }
источник
Вот как это можно сделать с помощью
for-in
цикла.var children = element.childNodes; for(child in children){ console.log(children[child]); }
источник
for ... of ...
синтаксис ES6.Не удержался и добавил еще метод, используя
childElementCount
. Он возвращает количество узлов дочерних элементов от данного родителя, поэтому вы можете перебрать его.for(var i=0, len = parent.childElementCount ; i < len; ++i){ ... do something with parent.children[i] }
источник
Попробуйте с
for
петлей. Это дает ошибку,forEach
потому что это набор узловnodelist
.Или это должно преобразовать список узлов в массив
function toArray(obj) { var array = []; for (var i = 0; i < obj.length; i++) { array[i] = obj[i]; } return array; }
Или вы можете использовать это
var array = Array.prototype.slice.call(obj);
источник
const results = Array.from(myNodeList.values()).map(parser_item);
NodeList не является массивом, но NodeList.values () возвращает итератор массива, поэтому может преобразовать его в массив.
источник
Попробуйте этот [обход в обратном порядке]:
var childs = document.getElementById('parent').childNodes; var len = childs.length; if(len --) do { console.log('node: ', childs[len]); } while(len --);
ИЛИ [в порядке обхода]
var childs = document.getElementById('parent').childNodes; var len = childs.length, i = -1; if(++i < len) do { console.log('node: ', childs[i]); } while(++i < len);
источник
Вот функциональный способ перебора файла
NodeList
. Этот метод используетArray
«SforEach
следующим образом:Array.prototype.forEach.call(element.childNodes, f)
Где
f
функция итератора, которая получает дочерние узлы в качестве первого параметра, а индекс - в качестве второго.Если вам нужно перебрать NodeLists более одного раза, вы можете создать небольшой функциональный служебный метод из этого:
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)
(Вы можете проделать тот же трюк
map()
и с другими функциями массива.)источник
Если вы делаете много такого, возможно, стоит определить функцию для себя.
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 ); } }; }
источник