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

最新のブラウザまたはbabelでそれを行う最も明確な方法はこれです。$node子を繰り返したいHTMLノードがあるとします。

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

任意のquerySelectorAll('*')DOMノードで、の要素のすべての子ノードを提供しますNodeListNodeListは配列のようなオブジェクトであるため、を使用しArray.prototype.forEach.callてこのリストを反復処理し、コールバック内で各子を1つずつ処理できます。

于 2018-05-31T11:56:48.190 に答える
1

アイテムがループで作成されている場合は、id =""data-nameなどを介してインデックスを残す必要があります。次に、それらに直接インデックスを付けることができます。これにより、(!-F)などのほとんどの関数で高速になります。何をしているかにもよりますが、1024ビットx100アイテムでかなりうまく機能します。

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

アイテムがすでにロードされていると、ほとんどの場合、これはより高速になります。リロードまたは安全なドメイン転送/ログイン/corsでページをスクラブするだけで、何かを2回実行します。

于 2018-12-15T13:51:24.717 に答える
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 に答える