36

我有以下内容:

for (var i = 0; i < children.length; i++){
   if(hasClass(children[i], "lbExclude")){
       children[i].parentNode.removeChild(children[i]);
   }
};

我希望它遍历所有孩子的孩子等(不仅仅是顶层)。我找到了这条线,这似乎是这样做的:

for(var m = n.firstChild; m != null; m = m.nextSibling) {

但我不清楚如果我做出那个转换,我如何指代当前的孩子?我将不再让我澄清孩子的索引位置。有什么建议么?

谢谢!

更新:

根据答案建议,我现在正在使用以下内容。这是正确/最有效的方法吗?

function removeTest(child) {
  if (hasClass(child, "lbExclude")) {
    child.parentNode.removeChild(child);
  }
}

function allDescendants(node) {
  for (var i = 0; i < node.childNodes.length; i++) {
    var child = node.childNodes[i];
    allDescendants(child);
    removeTest(child);
  }
}

var children = temp.childNodes;
for (var i = 0; i < children.length; i++) {
  allDescendants(children[i]);
};
4

10 回答 10

53
function allDescendants (node) {
    for (var i = 0; i < node.childNodes.length; i++) {
      var child = node.childNodes[i];
      allDescendants(child);
      doSomethingToNode(child);
    }
}

您遍历所有子元素,并且对于每个元素,您调用相同的函数并让它遍历该元素的子元素。

于 2010-04-26T08:56:38.423 回答
45

通常你会有一个可以在所有节点上递归调用的函数。这真的取决于你想对孩子们做什么。如果您只是想收集所有后代,那么element.getElementsByTagName可能是一个更好的选择。

var all = node.getElementsByTagName('*');

for (var i = -1, l = all.length; ++i < l;) {
    removeTest(all[i]);
}
于 2010-04-26T09:09:21.893 回答
4

没有必要对所有孩子调用 'allDescendants' 方法,因为方法本身已经这样做了。所以删除最后一个代码块,我认为这是一个合适的解决方案(á,不是 thé =])

            function removeTest(child){     
                if(hasClass(child, "lbExclude")){
                    child.parentNode.removeChild(child);
                }
            }

            function allDescendants (node) {
                for (var i = 0; i < node.childNodes.length; i++) {
                  var child = node.childNodes[i];
                  allDescendants(child);
                  removeTest(child);
                }
            }           

            var children = allDescendants(temp);
于 2010-04-26T09:28:16.733 回答
3

您可以使用 BFS 查找所有元素。

function(element) {
    // [].slice.call() - HTMLCollection to Array
    var children = [].slice.call(element.children), found = 0;
    while (children.length > found) {
        children = children.concat([].slice.call(children[found].children));
        found++;
    }
    return children;
};

此函数返回元素的所有子元素的子元素。

于 2017-02-02T10:28:23.637 回答
1

如果您有 jquery 并且想要获取所有后代元素,则可以使用:

 var all_children= $(parent_element).find('*');

请注意,这all_children是一个 HTML 集合,而不是一个数组。当您只是循环时,它们的行为相似,但集合没有很多Array.prototype您可能喜欢的有用方法。

于 2015-06-08T20:24:20.263 回答
1

如果项目是在循环中创建的,你应该通过 id="" data-name 或其他东西留下一个索引。然后,您可以直接对它们进行索引,这对于大多数函数(例如 (!-F))会更快。根据您的操作,对于 1024 位 x 100 个项目非常有效。

if ( document.getElementById( cid ) ) {
 return;
} else {
  what you actually want
}

一旦项目已经加载,这在大多数情况下会更快。仅在重新加载或安全域转移/登录/cors 时擦洗页面,并且您做某事两次。

于 2018-12-15T13:51:24.717 回答
1

在现代浏览器或 babel 中最明确的方法是这样。假设您有一个 HTML 节点$node,您想要递归其子节点。

Array.prototype.forEach.call($node.querySelectorAll("*"), function(node) {
  doSomethingWith(node);
});

querySelectorAll('*')任何 DOM 节点上的都会为您提供 a 中元素的所有子节点NodeListNodeList是一个类似数组的对象,因此您可以使用Array.prototype.forEach.call来迭代此列表,在回调中一个接一个地处理每个孩子。

于 2018-05-31T11:56:48.190 回答
0

如果你使用 js 库,它就像这样简单:

$('.lbExclude').remove();

否则,如果您想获取节点下的所有元素,您可以本地收集它们:

var nodes = node.getElementsByTagName('*');
for (var i = 0; i < nodes.length; i++) {
  var n = nodes[i];
  if (hasClass(n, 'lbExclude')) {
    node.parentNode.removeChild(node);
  }
}
于 2010-04-26T09:35:17.957 回答
0
TreeNode node = tv.SelectedNode;
while (node.Parent != null)
{
    node = node.Parent;
}                    
CallRecursive(node);


private void CallRecursive(TreeNode treeNode)`
{            
    foreach (TreeNode tn in treeNode.Nodes)
    {
        //Write whatever code here this function recursively loops through all nodes                 
        CallRecursive(tn);
    }
}
于 2020-03-11T18:29:52.037 回答
-1

要将所有后代作为数组获取,请使用以下命令:

function getAllDescendants(node) {
    var all = [];
    getDescendants(node);

    function getDescendants(node) {
        for (var i = 0; i < node.childNodes.length; i++) {
            var child = node.childNodes[i];
            getDescendants(child);
            all.push(child);
        }
    }
    return all;
}
于 2019-08-05T14:56:54.617 回答