2010-02-19 20 views
9

Estoy usando jQuery, y tengo un elemento de tabla que contiene unos cientos de filas. Quiero eliminar todas las filas y luego agregar un nuevo conjunto de filas. Lo hago llamando a remove y luego agrego en el elemento padre.¿Cuál es la forma más rápida de eliminar elementos secundarios del DOM en IE?

Mi lógica de agregación es bastante rápido, y sigue el consejo dado aquí: http://www.learningjquery.com/2009/03/43439-reasons-to-use-append-correctly

Sin embargo, la sola llamada para eliminar tarda 5 veces más larga que la anexión. ¿Cuál es la forma más rápida de borrar a los hijos de un elemento dom?

EDIT: Aquí es una versión condensada del código que utilizo:

var table = $('#mytable'); 
$('tbody', table).remove(); 
table.append(tBodyContents.join('')); 

tBodyContents es una matriz de cadenas, que cuando se combina formará una el HTML para las filas de la tbody.

+0

¿Nos puede mostrar su código? – Sampson

+0

puede publicar el código que usa para eliminar todas las filas? – SBUJOLD

+0

Ponlo allí; lo siento, no lo he incluido antes! – bluemoo

Respuesta

6
function emptyElement(element){ 
    var i = element.childNodes.length; 
    while(i--){ 
    element.removeChild(element.lastChild); 
    } 
} 

este es realmente más rápido que el truco de innerHTML, puede ser mucho más rápido, dependiendo de su navegador. hay algunas pruebas en jsperf usando funciones similares que le darán algunos puntos de referencia ...

+2

Por ejemplo http://jsperf.com/jquery-empty-vs-html/14 –

+0

No estoy seguro de por qué la respuesta aceptada es .html (''), aunque esta es de hecho una solución mucho más rápida. Establecer innerHTML o .html() en una cadena vacía se considera una mala práctica debido a su rendimiento. Para hacer una copia de seguridad de mis palabras, he aquí una prueba: http: // jsperf.com/innerhtml-vs-removechild/239 – boyomarinov

7

por lo general lo hago

$('#myTableToEmpty').html(''); 

A continuación, volver a agregar filas en las que sea necesario.

+0

Probablemente más rápido que $ ('# myTableToEmpty tr'). Remove() – ryanulit

+0

Hago lo mismo. Es simple y rápido. +1 –

+3

¿Este método también elimina los eventos enlazados y los datos de jQuery? Eso es una cosa que (de acuerdo con los documentos) la función remove() hace. EDITAR: Desde los documentos: * Además de los elementos en sí, todos los eventos enlazados y los datos jQuery asociados con los elementos se eliminan. * – user113716

1

Si la velocidad es muy, muy importante, que eres el mejor de utilizar innerHTML. $ ('tbody', tabla) [0] .innerHTML = '';

Personalmente, simplemente ignoraría jQuery alltogether, le daría al cuerpo una ID y solo iría a la opción document.getElementById ('id'). InnerHTML = ''. Y por supuesto todavía usan jQuery para agregar.

+0

Obtengo un "Error de tiempo de ejecución desconocido" cuando pruebo esto. Veré si puedo descubrir lo que estoy haciendo mal. – bluemoo

0

Confirmo que innerHTML es mucho más rápido para eliminar el enorme html de un solo elemento. En mi caso:

$('#main').html(''); // --> approx 5-6 seconds 

$('#main').innerHTML=''; // --> a few milliseconds 

Gracias por los consejos

Cuestiones relacionadas