childNodes включает в себя все узлы, что означает, что TextNodes включены.Здесь у вас есть два элемента и три текстовых узла
<section><TextNode>\n</TextNode>
<h2>Text</h2><TextNode>\n</TextNode>
<p>Text</p><TextNode>\n</TextNode>
</section>
С уменьшенной версией у вас есть только два элемента.
<section><h2>Text</h2><p>Text</p></section>
Поскольку вы сказали, что у вас есть 4 узла, я предполагаю, что вы имели в виду h2
, Текст, p
, Текст, если вы хотите, чтобы ваша функция была рекурсивной, вы должны сделать ее рекурсивной.
function whatChildren(e) {
var nodes= [].slice.call(this.childNodes),
len = nodes.length;
for (var i = 0; i < len; i++) {
var node = nodes[i],
childNodes = node.childNodes || [],
nodesLength = childNodes.length;
nodes = nodes.concat(childNodes);
len += nodesLength;
}
console.log(this.nodeName + " number of nodes " + len);
}
Живой пример