I'm trying to loop through childNodes like this:
var children = element.childNodes; children.forEach(function(item){ console.log(item); });
However, it output Uncaught TypeError: undefined is not a function
due to forEach
function. I also try to use children
instead of childNodes
but nothing changed.
Does anybody know what's going on?
The childNodes property is a property of Node in Javascript and is used to return a Nodelist of child nodes. Nodelist items are objects, not strings and they can be accessed using index numbers. The first childNode starts at index 0. Syntax element.childNodes.
To iterate over Children of HTML Element in JavaScript, get the reference to this HTML Element, get children of this HTML using using children property, then use for loop to iterate over the children.
childNodes returns nodes: Element nodes, text nodes, and comment nodes. Whitespace between elements are also text nodes.
The variable children
is a NodeList
instance and NodeList
s are not true Array
and therefore they do not inherit the forEach
method.
Also some browsers actually support it nodeList.forEach
ES5
You can use slice
from Array
to convert the NodeList
into a proper Array
.
var array = Array.prototype.slice.call(children);
You could also simply use call
to invoke forEach
and pass it the NodeList
as context.
[].forEach.call(children, function(child) {});
ES6
You can use the from
method to convert your NodeList
into an Array
.
var array = Array.from(children);
Or you can also use the spread syntax ...
like so
let array = [ ...children ];
A hack that can be used is NodeList.prototype.forEach = Array.prototype.forEach
and you can then use forEach
with any NodeList
without having to convert them each time.
NodeList.prototype.forEach = Array.prototype.forEach var children = element.childNodes; children.forEach(function(item){ console.log(item); });
See A comprehensive dive into NodeLists, Arrays, converting NodeLists and understanding the DOM for a good explanation and other ways to do it.
I'm very late to the party, but since element.lastChild.nextSibling === null
, the following seems like the most straightforward option to me:
for(var child=element.firstChild; child!==null; child=child.nextSibling) { console.log(child); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With