Javascript 遍历未知DOM的递归函数

Javascript 遍历未知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

我正在学习jsDOM,我想做一个递归函数,我可以用它来遍历任何DOM中的所有节点。我成功了,但我不明白为什么我的第一次尝试没有成功:

HTML

函数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中编写函数必要性。