jquery: il modo più veloce per rimuovere tutte le righe da una tabella molto grande


93

Ho pensato che questo potesse essere un modo veloce per rimuovere il contenuto di una tabella molto grande (3000 righe):

$jq("tbody", myTable).remove();

Ma ci vogliono circa cinque secondi per completare in Firefox. Sto facendo qualcosa di stupido (a parte il tentativo di caricare 3000 righe in un browser)? C'è un modo più veloce per farlo?

Risposte:


212
$("#your-table-id").empty();

È il più veloce possibile.


Hmmm. Frustrante. Penso che l'eliminazione sarebbe molto più veloce dell'inserimento. Mi fa venir voglia di fare cose davvero brutte come nascondere il tavolo e crearne uno nuovo quando voglio aggiornarlo.
morgancodes

10
Sì, beh ... HTML non è stato creato per mostrare 3k righe in una pagina :) Non riesci a pensare a una soluzione impaginata? Questo lo renderebbe molto più veloce. Sicuramente richiederebbe più lavoro, ma sarà un'esperienza utente molto più ricca.
Seb

7
Questo è buono. Il problema è che questo rimuoverà anche le intestazioni di tabella.
isuru

2
rimuove le intestazioni :(
Sandeep Kushwah

4
Ciò rimuoverà tutto nella tabella, comprese le intestazioni. Presumo che @morgancodes voglia rimuovere il contenuto, ovvero le righe, non le intestazioni. Per chi lo scoprisse in seguito la soluzione sarebbe $('#mytable tbody').empty();. Ciò garantisce che solo il corpo venga svuotato.
OmniOwl

82

È meglio evitare qualsiasi tipo di loop, basta rimuovere tutti gli elementi direttamente in questo modo:

$("#mytable > tbody").html("");

6
html("")chiama empty()internamente
Emile Bergeron

8
Bella soluzione per me perché non rimuove l'intestazione di una tabella. Grazie!
Daria

@Daria usa i selettori al massimo, questo manterrà le tue intestazioni in posizione: $ ('table tbody'). Empty ();
Dani

qual è la differenza tra l'utilizzo di ("#mytable> tbody") e ("#mytable tbody").
eaglei22

1
Se hai una tabella nidificata in una riga della tua tabella, rimuoverà anche quei tag tbody. Se hai solo un tavolo, non dovrebbe essere molto diverso.
Shiroy

6

L'uso del distacco è di magnitudini più veloce di qualsiasi altra risposta qui:

$('#mytable').find('tbody').detach();

Non dimenticare di rimettere l'elemento tbody nella tabella poiché scollegarlo lo ha rimosso:

$('#mytable').append($('<tbody>'));  

Si noti inoltre che quando si parla di efficienza la $(target).find(child)sintassi è più veloce di $(target > child). Perché? Sfrigolare!

Tempo trascorso per svuotare 3.161 righe di tabella

Utilizzando il metodo Detach () (come mostrato nel mio esempio sopra):

  • Firefox: 0,027 secondi
  • Chrome: 0,027 s
  • Bordo: 1,73 s
  • IE11: 4.02s

Utilizzando il metodo empty ():

  • Firefox: 0,055 secondi
  • Chrome: 0,052 s
  • Bordo: 137,99 s (potrebbe anche essere congelato)
  • IE11: si blocca e non ritorna mai


3

Due problemi che posso vedere qui:

  1. I metodi empty () e remove () di jQuery in realtà fanno un bel po 'di lavoro. Vedere JavaScript Function Call Profiling di John Resig per il motivo.

  2. L'altra cosa è che per grandi quantità di dati tabulari potresti considerare una libreria datagrid come l'ottimo DataTables per caricare i tuoi dati al volo dal server, aumentando il numero di chiamate di rete, ma diminuendo la dimensione di quelle chiamate. Avevo una tabella molto complicata con 1500 righe che sono diventate piuttosto lente, il passaggio alla nuova tabella basata su AJAX ha reso questi stessi dati piuttosto veloci.


Grazie artlung. Fare qualcosa di simile in realtà, ottenere tutti i dati contemporaneamente dal server, ma disegnare solo le righe della tabella quando necessario.
Morgancodes

Sembra una buona chiamata. Mi chiedo se preoccuparsi del numero di righe in una tabella in un browser sarà sempre un problema o se la memoria per la maggior parte dei computer aumenterà, questo sarà un problema minore.
artlung

La memoria non è un problema con la quantità di dati che sto caricando. Il collo di bottiglia è la manipolazione del DOM.
Morgancodes

Penso che stiamo dicendo la stessa cosa. Più dati carichi, più nodi DOM carichi, per me questi sono correlati in termini di memoria necessaria. Spero che la tua situazione sia migliorata, a prescindere.
artlung

1

se vuoi rimuovere solo velocemente .. puoi fare come sotto ..

$( "#tableId tbody tr" ).each( function(){
  this.parentNode.removeChild( this ); 
});

ma possono esserci alcuni elementi associati a eventi nella tabella,

in quel caso,

il codice sopra non impedisce la perdita di memoria in IE ... TT e non veloce in FF ...

spiacente....


0

questo funziona per me:

1- aggiungi classe per ogni riga "removeRow"

2- nel jQuery

$(".removeRow").remove();

-2

Potresti provare questo ...

var myTable= document.getElementById("myTable");
if(myTable== null)
    return;
var oTBody = myTable.getElementsByTagName("TBODY")[0];
if(oTBody== null)
    return;
try
{
    oTBody.innerHTML = "";
}
catch(e)
{
    for(var i=0, j=myTable.rows.length; i<j; i++)
        myTable.deleteRow(0);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.