2010-06-15 14 views
63

Tengo una lista, solo quiero eliminar todos los nodos secundarios de ella. ¿Cuál es la forma más eficiente de usar jquery? Esto es lo que tengo:¿Eliminar todos los nodos secundarios de un padre?

<ul id='foo'> 
    <li>a</li> 
    <li>b</li> 
</ul> 

var thelist = document.getElementById("foo"); 
while (thelist.hasChildNodes()){ 
    thelist.removeChild(thelist.lastChild); 
} 

¿Hay un atajo en lugar de eliminar cada elemento, uno cada vez?

----------- Editar ----------------

Cada elemento de la lista tiene algunos datos que se le atribuye, y un controlador de clic de esta manera:

$('#foo').delegate('li', 'click', function() { 
    alert('hi!'); 
}); 

// adds element to the list at runtime 
function addListElement() { 
    var element = $('<li>hi</hi>'); 
    element.data('grade', new Grade()); 
} 

finalmente podría añadir botones por elemento de la lista también - lo que parece que vacía() es el camino a seguir, para asegurarse de que no hay pérdidas de memoria?

+0

¿Eficiente en qué términos? Rendimiento, legibilidad? – Gumbo

+0

Agregando a las preguntas de @ Gumbo, ¿qué tan preocupante es la memoria también? ¿Estos artículos tienen controladores de eventos vinculados? –

+0

Dada la respuesta actualizada, sí '.empty()' sería el camino a seguir, borrar los datos de '$ .cache' que' element.data ('grade', new Grade()); 'agrega –

Respuesta

137

Puede utilizar .empty(), como this:

$("#foo").empty(); 

From the docs:

Eliminar todos los nodos hijos del conjunto de elementos coincidentes desde el DOM.

+5

También vale la pena señalar (de docs) * Para evitar fugas de memoria, jQuery elimina otras construcciones como datos y controladores de eventos de los elementos secundarios antes de eliminar los elementos. * – user113716

+1

@patrick - +1, otra razón para seguir esta ruta sobre el a menudo se recomienda '.html ('')', dado que los datos no se almacenan en el elemento, mucha gente olvida la fuga que causa. –

+1

+1 Además, si está seguro de que no se han vinculado eventos a los elementos secundarios del padre '$ (" # foo ") [0] .innerHTML =" ";' será más rápido. Solo tenga cuidado de no causar pérdidas de memoria al eliminar elementos de esta manera ('empty()' ya tiene mucho cuidado para asegurarse de que esto no ocurra, especialmente en IE). –

3

A otros usuarios sugeridos,

.empty() 

es lo suficientemente buena, ya que elimina todos los nodos descendientes (tanto tag-nodos y Text-nodos) y todo tipo de datos almacenados en esos nodos. Ver el JQuery's API empty documentation.

Si desea mantener los datos, como por ejemplo los controladores de eventos, debe utilizar

.detach() 

como se describe en el JQuery's API detach documentation.

El método .remove() podría ser útil para propósitos similares.

Cuestiones relacionadas