2010-04-26 80 views
16

我有以下幾點:如何讓這個循環所有的孩子遞歸?

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]); 
}; 
+0

你知道有多少個數組嵌套在這裏嗎? – thecoshman 2010-04-26 08:56:51

+0

簡單地用'm'命名:'m.parentNode.removeChild(m)'。不過,可能有一個問題,因爲刪除一個節點,然後將它的'nextSibling'(在'for'子句中)將無法按預期工作。 – Dirk 2010-04-26 08:58:37

+0

@coshman,嵌套的孩子的數量將是可變的。 – Matrym 2010-04-26 09:03:19

回答

25

通常你會有一個可以在所有節點上遞歸調用的函數。這真的取決於你想要給孩子做什麼。如果你只是想收集所有的後代,那麼element.getElementsByTagName可能是一個更好的選擇。

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

for (var i = -1, l = all.length; ++i < l;) { 
    removeTest(all[i]); 
} 
+1

這隻會獲得元素,而不是所有的節點。 – Quentin 2010-04-26 09:19:31

+3

然而,他們是通過hasClass方法測試的,所以我相信他們打算將它作爲元素。 – wombleton 2010-04-26 09:36:46

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

您遍歷所有的孩子們,併爲每一個元素,可以調用相同的功能,有過來該元素的孩子循環。

+0

對不起,您能否更明確地說明如何在我的情況下應用此功能? – Matrym 2010-04-26 09:02:17

3

有沒有必要要求所有的孩子「allDescendants」的方法,因爲該方法本身就已經做到這一點。所以刪除最後一個代碼塊,我認爲這是一個正確的解決方案(A,而不是=])

  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); 
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); 
    } 
} 
+0

哎呀,沒有看到@ J-P的回答。 – wombleton 2010-04-26 09:37:29

1

如果你有jQuery和你想獲得的所有後代元素,你可以使用:

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

請注意,all_children是一個HTML集合,而不是數組。當你只是循環時,它們的行爲是相似的,但是集合沒有很多有用的方法,否則你可能會喜歡。

0

您可以使用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; 
}; 

該函數返回元素的所有子元素的子元素。