2010-04-26 8 views
16

Ho il seguente:Come faccio a rendere questo ciclo tutti i bambini in modo ricorsivo?

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

vorrei che per un ciclo tra i bambini di tutti i bambini, ecc (non solo il livello superiore). Ho trovato questa linea, che sembra farlo:

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

Ma sono poco chiare su come mi riferisco al bambino corrente se faccio che l'interruttore? Non avrei più bisogno di chiarire la posizione dell'indice del bambino. Eventuali suggerimenti?

Grazie!

Aggiornamento:

Ora sto utilizzando la seguente, in base alla risposta suggerimenti. È questo il modo corretto/più efficace per farlo?

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

Sai quanti array hai annidato qui? – thecoshman

+0

Semplicemente con il nome 'm':' m.parentNode.removeChild (m) '. Potrebbe esserci un problema, però, perché la rimozione di un nodo e il suo successivo 'nextSibling' (nella clausola' for') non funzioneranno come previsto. – Dirk

+0

@coshman, la quantità di bambini nidificati sarà variabile. – Matrym

risposta

25

Normalmente si avrebbe una funzione che potrebbe essere chiamata in modo ricorsivo su tutti i nodi. Dipende davvero da cosa vuoi fare ai bambini. Se si desidera semplicemente raccogliere tutti i discendenti, quindi element.getElementsByTagName potrebbe essere un'opzione migliore.

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

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

Questo otterrà solo elementi, non tutti i nodi. – Quentin

+3

Tuttavia, sono testati con un metodo hasClass, quindi credo che intendano che siano elementi. – wombleton

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

È un ciclo su tutti i bambini, e per ogni elemento, si chiama la stessa funzione e lo hanno loop sui figli di quell'elemento.

+0

Scusa, potresti essere più esplicito su come applicare questa funzione nel mio caso? – Matrym

3

Non c'è alcun bisogno di chiamare il metodo 'allDescendants' su tutti i bambini, in quanto il metodo stesso fa già questo. Quindi rimuovere l'ultimo codeblock e penso che sia una soluzione adeguata (a, non i =])

  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

Se si utilizza una libreria js è semplice come questo:

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

In caso contrario, se si desidera acquisire tutti gli elementi sotto un nodo è possibile raccogliere tutti nativamente:

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, non ho visto la risposta di @ J-P. – wombleton

1

Se si dispone di jQuery e si desidera ottenere tutti gli elementi discendenti è possibile utilizzare:

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

Basta essere consapevoli del fatto che all_children è una raccolta HTML e non una matrice. Si comportano allo stesso modo quando si sta eseguendo un ciclo, ma la raccolta non ha molti utili metodi Array.prototype che potrebbero altrimenti piacere.

0

È possibile utilizzare BFS per trovare tutti gli elementi.

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

Questa funzione restituisce tutti i figli figli dell'elemento.

Problemi correlati