如何获取JS中的所有childNodes,包括所有'孙子'?

Mik*_*ike 49 javascript

我想扫描所有childNodes的div,包括那些位于其他元素中的childNodes.现在我有这个:

var t = document.getElementById('DivId').childNodes;
for(i=0; i<t.length; i++) alert(t[i].id);
Run Code Online (Sandbox Code Playgroud)

但它只能得到分区的孩子而不是孙子孙女.谢谢!

编辑:这个问题太模糊了.对于那个很抱歉.这是一个小提琴:

http://jsfiddle.net/F6L2B/

body.onload脚本不在JSFiddle上运行,但它可以工作,除了"Me Second"和"Me Third"输入字段没有被分配tabIndex,因此被跳过.

rvi*_*hne 74

这是最快速,最简单的方法,适用于所有浏览器:

myDiv.getElementsByTagName("*")
Run Code Online (Sandbox Code Playgroud)

  • 请注意,与 `childNodes` 不同,它不会获得“评论”或“文本”后代节点(尽管这很可能是您所追求的)。 (3认同)
  • 它得到“Element”,而不是“Node”。 (3认同)

Mad*_*het 21

如果您正在寻找所有HTMLElement现代浏览器,您可以使用:

myDiv.querySelectorAll("*")
Run Code Online (Sandbox Code Playgroud)

  • 使用`myDiv.getElementsByTagName("*")`几乎肯定会更快,并且也适用于更旧的浏览器. (14认同)

Ada*_*kis 9

曾孙子们怎么样?

要任意深入,您可以使用递归函数.

var alldescendants = [];

var t = document.getElementById('DivId').childNodes;
    for(i = 0; i < t.length; i++)
        if (t[i].nodeType == 1)
            recurseAndAdd(t[i], alldescendants);

function recurseAndAdd(el, descendants) {
  descendants.push(el.id);
  var children = el.childNodes;
  for(i=0; i < children.length; i++) {
     if (children[i].nodeType == 1) {
         recurseAndAdd(children[i]);
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你真的只想要孙子,那么你可以拿出递归(并可能重命名函数)

function recurseAndAdd(el, descendants) {
  descendants.push(el.id);
  var children = el.childNodes;
  for(i=0; i < children.length; i++) {
     if (children[i].nodeType == 1) {
         descendants.push(children[i].id);
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 不,它仍然是一样的.`childNodes`返回*所有*包括节点内的文本,例如`span`,属性,注释等.如果你需要子节点是元素(span,div,label,input等),你需要检查` if(el.nodeType == 1){...}`,其中1表示ELEMENT节点类型. (2认同)