2010-02-19 5 views
9

J'utilise jQuery et j'ai un élément de table qui contient quelques centaines de lignes. Je veux supprimer toutes les lignes, puis ajouter un nouveau jeu de lignes. Je fais cela en appelant remove puis en ajoutant sur l'élément parent.Quel est le moyen le plus rapide de supprimer les éléments enfants du DOM dans IE?

Ma logique append est assez rapide, et suit les conseils donnés ici: http://www.learningjquery.com/2009/03/43439-reasons-to-use-append-correctly

Cependant, l'appel unique pour enlever prend 5 fois plus longtemps que l'append. Quel est le moyen le plus rapide pour effacer les enfants d'un élément dom?

EDIT: Voici une version condensée du code que j'utilise:

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

tBodyContents est un tableau de chaînes, qui, lorsqu'elle formera un code HTML pour les lignes de la tbody.

+0

Pouvez-vous nous montrer votre code? – Sampson

+0

pouvez-vous poster le code que vous utilisez pour supprimer toutes les lignes? – SBUJOLD

+0

Mettez-le là-dedans; désolé je ne l'ai pas inclus avant! – bluemoo

Répondre

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

celui-ci est en fait plus rapide que l'astuce innerHTML, peut être beaucoup plus rapide, en fonction de votre navigateur. il y a quelques tests sur jsperf en utilisant des fonctions similaires qui vous donneront quelques benchmarks ...

+2

Par exemple http://jsperf.com/jquery-empty-vs-html/14 –

+0

Je ne sais pas pourquoi la réponse acceptée est .html (''), alors que c'est en fait une solution beaucoup plus rapide. Définir innerHTML ou .html() à une chaîne vide est en fait considéré comme une mauvaise pratique exactement en raison de ses performances. Pour sauvegarder mes mots, voici un test: http: // jsperf.com/innerhtml-vs-removechild/239 – boyomarinov

7

que je fais habituellement

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

puis ajoutez des lignes en cas de besoin.

+0

Probablement plus rapide que $ ('# myTableToEmpty tr'). Remove() – ryanulit

+0

Je fais la même chose. C'est simple et rapide. +1 –

+3

Cette méthode efface-t-elle également les événements liés et les données jQuery? C'est une chose que (selon les docs) la fonction remove() fait. EDIT: De la docs - * En plus des éléments eux-mêmes, tous les événements liés et jQuery données associées aux éléments sont supprimés. * – user113716

1

Si la vitesse est vraiment, vraiment important, vous êtes mieux d'utiliser innerHTML. $ ('tbody', table) [0] .innerHTML = '';

Personnellement, j'ignorerais tout simplement jQuery, donnerais un ID au corps et irais juste pour l'option document.getElementById ('id'). InnerHTML = ''. Et offcourse encore utiliser jQuery pour l'ajout.

+0

Je reçois une "erreur d'exécution inconnue" lorsque j'essaie cela. Je vais voir si je peux comprendre ce que je fais mal. – bluemoo

0

Je confirme que innerHTML est beaucoup plus rapide pour supprimer un énorme HTML à partir d'un seul élément. Dans mon cas:

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

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

Merci pour les conseils

Questions connexes