Javascript 遍历未知DOM的递归函数
我正在学习jsDOM,我想做一个递归函数,我可以用它来遍历任何DOM中的所有节点。我成功了,但我不明白为什么我的第一次尝试没有成功: HTMLJavascript 遍历未知DOM的递归函数,javascript,dom,recursion,Javascript,Dom,Recursion,我正在学习jsDOM,我想做一个递归函数,我可以用它来遍历任何DOM中的所有节点。我成功了,但我不明白为什么我的第一次尝试没有成功: HTML 函数mostrarNodosV2(节点){ console.log(node.nodeName); if(node.firstElementChild!=null){ node=node.firstElementChild; mostrarNodosV2(节点); } if(node.nextElementSibling!=null){ node=no
函数mostrarNodosV2(节点){
console.log(node.nodeName);
if(node.firstElementChild!=null){
node=node.firstElementChild;
mostrarNodosV2(节点);
}
if(node.nextElementSibling!=null){
node=node.nextElementSibling;
mostrarNodosV2(节点);
}
}
mostrarNodosV2(文件)代码>
练习四
只是头球
好段落
- 我只是无序列表中的一个元素列表
如果要重新分配节点
变量,请尝试以下操作:
function mostrarNodosV2(node) {
console.log(node.nodeName);
if (node.firstElementChild != null) {
var child = node.firstElementChild;
mostrarNodosV2(child);
}
if (node.nextElementSibling != null) {
var sibling = node.nextElementSibling;
mostrarNodosV2(sibling);
}
}
mostrarNodosV2(document);
递归函数重复节点的原因是您重新分配了节点
。让我们自己逐步完成函数:
document -> has a child
html -> has a child
head -> has a child
meta -> has no child, has a sibling
title -> has no child or sibling
head -> head has been overwritten with meta, which has a sibling
title -> has no child or sibling
html -> html has been overwritten with head, which has a sibling
body -> has a child
h1 -> has no child, has a sibling
p -> has no child, has a sibling
ul -> has a child
li -> has no child or sibling
ul -> ul has been overwritten with li, which has no sibling
body -> body has been overwritten with h1, which has a sibling
...
现在您明白了为什么覆盖函数参数是不好的
如果您想要更健壮的方法,下面是我编写递归DOM遍历函数的方法:
function mostrarNodosV2(node) {
if (node == null) {
return;
}
console.log(node.nodeName);
mostrarNodosV2(node.firstElementChild);
mostrarNodosV2(node.nextElementSibling);
}
mostrarNodosV2(document);
这里唯一的区别是我正在检查节点的有效性,一个递归比每个节点更深,这减少了方法的冗长性。无需实现自己的方法,DOM Level 2 API允许遍历,选择自定义开始节点并更改方向。我这样做了->[].slice.call(document.queryselectoral('*').forEach(…
@adeneo这不是重点,重点是调试递归函数OP已经有了。@PatrickRoberts这就是为什么它是一个注释而不是一个答案,并且是相关的。@DavidBarker不是真的。这个问题被标记为recursion
,而adeneo的代码段是迭代的。@PatrickRoberts但不知为什么它仍然不是一个答案,而且它是我的It’这与问题仍然相关。不,不是我的问题;这很有效!我仍然需要知道发生了什么,但知道问题出在哪里会对我有很大帮助。谢谢!我个人认为这值得投票(我投了一张),但如果我不得不猜测的话,我会说它被否决了,因为你没有解释行为发生的原因,并且在没有要求解释的情况下提供了解决方案。再次感谢,这很有帮助。我将检查它作为最佳答案,谢谢!感谢通知,但我认为OP将此作为一个学习练习,而不是从n中编写函数必要性。