2010-04-26 12 views
16

Ich habe folgendes:Wie mache ich diese Schleife alle Kinder rekursiv?

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

ich es eine Schleife durch alle Kinder Kinder, etc. (nicht nur die oberste Ebene) möchten. Ich fand diese Linie, die das zu tun scheint:

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

Aber ich bin unklar, wie ich auf das aktuelle Kind verweisen, wenn ich diesen Schalter zu machen? Ich müsste nicht mehr die Indexposition des Kindes klären. Irgendwelche Vorschläge?

Danke!

Update:

Ich bin jetzt die folgende Verwendung nach Anregungen zu beantworten. Ist das der richtige/effizienteste Weg?

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

Wissen Sie, wie viele Arrays Sie hier verschachtelt haben? – thecoshman

+0

Einfach mit dem Namen 'm':' m.parentNode.removeChild (m) '. Es kann jedoch ein Problem geben, da das Entfernen eines Knotens und das anschließende "nextSibling" (in der for-Klausel) nicht wie vorgesehen funktioniert. – Dirk

+0

@coshman, die Anzahl der verschachtelten Kinder wird variabel sein. – Matrym

Antwort

25

Normalerweise hätten Sie eine Funktion, die auf allen Knoten rekursiv aufgerufen werden könnte. Es hängt wirklich davon ab, was du mit den Kindern machen willst. Wenn Sie einfach alle Nachkommen sammeln möchten, dann ist element.getElementsByTagName möglicherweise eine bessere Option.

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

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

Dies wird nur Elemente erhalten, nicht alle Knoten. – Quentin

+3

Sie werden jedoch mit einer hasClass-Methode getestet, daher glaube ich, dass es Elemente sein sollen. – wombleton

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

Sie Schleife über alle Kinder, und für jedes Element, rufen Sie die gleiche Funktion und haben es Schleife über die Kinder dieses Elements.

+0

Entschuldigung, könnten Sie genauer erklären, wie Sie diese Funktion in meinem Fall anwenden? – Matrym

3

gibt es keine Notwendigkeit für den Aufruf des ‚allDescendants‘ Methode für alle Kinder, weil sich das Verfahren bereits das tut. So entfernen Sie den letzten Codeblock, und ich denke, dass eine richtige Lösung (A, nicht das =])

  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

Wenn Sie eine js-Bibliothek verwenden, da dies so einfach:

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

Andernfalls, wenn Sie wollen alle Elemente unter einem Knoten erwerben können Sie sie alle nativ sammeln:

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

Whoops, sah @ J-P's Antwort nicht. – wombleton

1

Wenn Sie jquery haben und Sie alle untergeordneten Elemente erhalten Sie verwenden können:

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

Beachten Sie, dass all_children eine HTML-Sammlung und kein Array ist. Sie verhalten sich ähnlich, wenn Sie nur loopen, aber die Sammlung hat nicht viele der nützlichen Methoden, die Sie sonst noch genießen könnten.

0

Sie können BFS verwenden, um alle Elemente zu finden.

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; 
}; 

Diese Funktion gibt alle untergeordneten Elemente des untergeordneten Elements zurück.

Verwandte Themen