2010-04-26 23 views
16

Tengo el siguiente:¿Cómo hago este ciclo todos los niños recursivamente?

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

me gustaría que colocar a través de los niños de todos los niños, etc (no sólo el nivel superior). He encontrado esta línea, que parece hacer eso:

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

Pero estoy claro de cómo me refiero a que el niño actual si hago que el interruptor? Ya no tendría que aclarar la posición del índice del niño. ¿Alguna sugerencia?

Gracias!

Actualización:

Ahora estoy usando la siguiente, según responder sugerencias. ¿Es esta la forma correcta/más eficiente de hacerlo?

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

¿Sabe cuántas matrices ha anidado aquí? – thecoshman

+0

Simplemente con el nombre 'm':' m.parentNode.removeChild (m) '. Puede haber un problema, sin embargo, porque eliminar un nodo y luego tomar su 'nextSibling' (en la cláusula' for') no funcionará como se esperaba. – Dirk

+0

@coshman, la cantidad de hijos anidados será variable. – Matrym

Respuesta

25

Normalmente, tendría una función que podría llamarse recursivamente en todos los nodos. Realmente depende de lo que quieras hacer a los niños. Si simplemente desea reunir todos los descendientes, entonces element.getElementsByTagName puede ser una mejor opción.

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

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

Esto solo obtendrá elementos, no todos los nodos. – Quentin

+3

Sin embargo, se prueban con el método hasClass, por lo que creo que pretenden que sean elementos. – wombleton

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

Usted bucle sobre todos los niños, y para cada elemento, se llama a la misma función y tenerlo bucle sobre los hijos de ese elemento.

+0

Disculpe, ¿podría ser más explícito acerca de cómo aplicar esta función en mi caso? – Matrym

3

No es necesario llamar al método 'allDescendants' en todos los elementos secundarios, porque el método ya lo hace. Por lo tanto eliminar el último bloque de código y yo creo que es una solución adecuada (A, NO EL =])

  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

Si utiliza una biblioteca de JS es tan simple como esto:

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

De lo contrario, si desee adquirir todos los elementos bajo un nodo puede recoger a todos de forma nativa:

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

¡Vaya !, no vi la respuesta de @J-P. – wombleton

1

Si tiene jQuery y desea obtener todos los elementos descendientes que puede utilizar:

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

Solo tenga en cuenta que all_children es una colección HTML y no una matriz. Se comportan de manera similar cuando solo está bucleando, pero la colección no tiene muchos de los métodos útiles Array.prototype que de lo contrario podría disfrutar.

0

Puede usar BFS para encontrar todos los elementos.

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

Esta función devuelve todos los hijos secundarios del elemento.

Cuestiones relacionadas