私は以下を持っています:
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]);
};
通常、すべてのノードで再帰的に呼び出すことができる関数があります。それはあなたが子供たちに何をしたいかによります。すべての子孫を集めたいだけなら、element.getElementsByTagName
の方が適している場合があります。
var all = node.getElementsByTagName('*');
for (var i = -1, l = all.length; ++i < l;) {
removeTest(all[i]);
}
function allDescendants (node) {
for (var i = 0; i < node.childNodes.length; i++) {
var child = node.childNodes[i];
allDescendants(child);
doSomethingToNode(child);
}
}
すべての子をループし、要素ごとに同じ関数を呼び出して、その要素の子をループさせます。
すべての子に対して「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);
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;
};
この関数は、要素のすべての子を返します。
アイテムがループで作成されている場合は、id = "" data-nameなどを使用してインデックスを残す必要があります。その後、それらに直接インデックスを付けることができ、(!-F)などのほとんどの関数でより高速になります。あなたが何をしているのかに応じて、1024ビットx 100のアイテムでかなりうまく機能します。
if ( document.getElementById( cid ) ) {
return;
} else {
what you actually want
}
アイテムが既にロードされていると、ほとんどの場合、これはより速くなります。再読み込みまたは安全なドメイン転送/ログイン/ corsでページをスクラブするだけで、何かを2回実行するだけです。
Jqueryがあり、使用できるすべての子孫要素を取得したい場合:
var all_children= $(parent_element).find('*');
all_children
はHTMLコレクションであり、配列ではありません。ループしているだけでも同じように動作しますが、コレクションには便利なArray.prototype
他の方法で楽しむことができるメソッド。
最新のブラウザまたはbabelでそれを行う最も明確な方法はこれです。たとえば、再帰したい子を持つHTMLノード_$node
_があるとします。
_Array.prototype.forEach.call($node.querySelectorAll("*"), function(node) {
doSomethingWith(node);
});
_
DOMノードのquerySelectorAll('*')
は、NodeList
の要素の子ノードallを提供します。 NodeList
は配列のようなオブジェクトなので、_Array.prototype.forEach.call
_を使用してこのリストを反復処理し、コールバック内で各子を1つずつ処理できます。
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);
}
}
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);
}
}