【发布时间】:2016-01-14 17:44:58
【问题描述】:
我正在学习 js DOM,我想制作一个 递归函数,我可以用它来遍历任何 DOM 中的所有节点 .我做到了,但我不知道为什么我的第一次尝试不起作用:
HTML
function mostrarNodosV2(node) {
console.log(node.nodeName);
if (node.firstElementChild != null) {
node = node.firstElementChild;
mostrarNodosV2(node);
}
if (node.nextElementSibling != null) {
node = node.nextElementSibling;
mostrarNodosV2(node);
}
}
mostrarNodosV2(document);
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Exercise IV</title>
</head>
<body>
<h1> Just a header</h1>
<p>Nice paragraph</p>
<ul>
<li>Im just an element list on an unordered list</li>
</ul>
</body>
</html>
接下来是流程:
- 文档节点。
- 我们用他的第一个孩子重复这个函数:头节点。
- 我们用他的第一个孩子重复这个函数:元节点。
- 因为 'meta' 没有孩子,我们用他的 next 重复这个函数 兄弟:标题节点。
- 因为 'title' 没有孩子或下一个兄弟姐妹,我们结束 函数 where node=title,我们应该结束函数 where node = meta,我们应该继续检查 head 的下一个兄弟:body node。
不是这样,如果您调试或检查控制台,您会看到浏览器重复该部分:
if (node.nextElementSibling != null) {
node = node.nextElementSibling;
mostrarNodosV2 (node);
}
其中 node = meta,所以我们在控制台上打印了两个“TITLE”。然后它按原样进行,我们得到了“body”节点。 'LI' 元素也会出现同样的问题。
所以,我不想要另一个解决方案,我只是这样做了,我只是想知道为什么我回到那个“如果”,因为我不明白。
如果你在开发者工具上调试它会更容易理解。
【问题讨论】:
-
我做到了 ->
[].slice.call( document.querySelectorAll('*') ).forEach( ... -
@adeneo 这不是重点,重点是调试OP已有的递归函数。
-
@PatrickRoberts 这就是为什么它是评论而不是答案,并且相关。
-
@DavidBarker 不是真的。这个问题被标记为
recursion而adeneo 的sn-p 是iterative。 -
@PatrickRoberts 然而不知何故,它仍然不是答案,它仍然与问题相关。
标签: javascript dom recursion