jquery - najszybszy sposób na usunięcie wszystkich wierszy z bardzo dużej tabeli

96

Pomyślałem, że to może być szybki sposób na usunięcie zawartości bardzo dużej tabeli (3000 wierszy):

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

Ale w przeglądarce Firefox zajmuje to około pięciu sekund. Czy robię coś głupiego (poza próbą załadowania 3000 wierszy do przeglądarki)? Czy jest na to szybszy sposób?

morgancodes
źródło

Odpowiedzi:

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

To tak szybko, jak to możliwe.

Seb
źródło
Hmmm. Denerwujący. Myślę, że usuwanie byłoby znacznie szybsze niż wstawianie. To sprawia, że ​​chcę robić naprawdę brzydkie rzeczy, takie jak po prostu ukrywanie tabeli i tworzenie nowego, gdy chcę go zaktualizować.
morgancodes
10
Tak, cóż ... HTML nie został utworzony, aby wyświetlać 3k wierszy na stronie :) Nie przychodzi Ci do głowy żadne rozwiązanie z podziałem na strony? To znacznie przyspieszyłoby to. Oczywiście wymagałoby to więcej pracy, ale będzie znacznie bogatsze dla użytkownika.
Seb
7
Ten jest dobry. Problem polega na tym, że spowoduje to również usunięcie nagłówków tabeli.
isuru,
3
usuwa nagłówki :(
Sandeep Kushwah
6
Spowoduje to usunięcie całej zawartości tabeli, w tym nagłówków. Zakładam, że @morgancodes chce usunąć zawartość, czyli wiersze, a nie nagłówki. Dla tych, którzy znajdą to później, rozwiązaniem byłoby $('#mytable tbody').empty();. Gwarantuje to, że opróżniony zostanie tylko korpus.
OmniOwl
83

Lepiej unikać wszelkiego rodzaju pętli, po prostu usuń wszystkie elementy bezpośrednio w ten sposób:

$("#mytable > tbody").html("");
gradosevic
źródło
6
html("")połączenia empty()wewnętrzne
Emile Bergeron
8
Dla mnie fajne rozwiązanie, ponieważ nie usuwa nagłówka tabeli. Dziękuję Ci!
Daria,
@Daria w pełni wykorzystaj selektory, dzięki czemu Twoje nagłówki pozostaną na miejscu: $ ('table tbody'). Empty ();
Dani,
jaka jest różnica między using ("#mytable> tbody") a ("#mytable tbody").
eaglei
1
Jeśli masz tabelę zagnieżdżoną w wierszu tabeli, spowoduje to również usunięcie tych tagów tbody. Jeśli masz tylko jeden stół, nie powinno być inaczej.
Shiroy
8
$("#myTable > tbody").empty();

Nie dotknie nagłówków.

AlexCodeKeen
źródło
7

Użycie odłączenia jest o wielkości szybsze niż jakakolwiek inna odpowiedź tutaj:

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

Nie zapomnij umieścić elementu tbody z powrotem w tabeli, ponieważ detach usunął go:

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

Należy również zauważyć, że podczas mówienia $(target).find(child)składnia wydajności jest szybsza niż $(target > child). Czemu? Trzask!

Upływający czas do opróżnienia 3,161 wierszy tabeli

Korzystanie z metody Detach () (jak pokazano w moim przykładzie powyżej):

  • Firefox: 0,027 s
  • Chrome: 0,027 s
  • Krawędź: 1,73 s
  • IE11: 4.02s

Korzystanie z metody empty ():

  • Firefox: 0,055 s
  • Chrome: 0,052 s
  • Edge: 137,99s (równie dobrze może być zamrożony)
  • IE11: zawiesza się i nigdy nie wraca
Rysował
źródło
3

Widzę tutaj dwie kwestie:

  1. Metody empty () i remove () jQuery w rzeczywistości wykonują całkiem sporo pracy. Zobacz profilowanie wywołań funkcji JavaScript Johna Resiga, aby dowiedzieć się, dlaczego.

  2. Inną rzeczą jest to, że w przypadku dużych ilości danych tabelarycznych można rozważyć bibliotekę datagrid, taką jak doskonałe DataTables do ładowania danych w locie z serwera, zwiększając liczbę wywołań sieciowych, ale zmniejszając rozmiar tych wywołań. Miałem bardzo skomplikowaną tabelę z 1500 wierszami, która była dość powolna, zmiana na nową tabelę opartą na AJAX sprawiła, że ​​te same dane wydawały się dość szybkie.

artlung
źródło
Dzięki, artlung. Robi coś podobnego, pobiera wszystkie dane naraz z serwera, ale rysuje wiersze tabeli tylko wtedy, gdy jest to potrzebne.
morgancodes
Brzmi jak dobry telefon. Zastanawiam się, czy martwienie się liczbą wierszy w tabeli w przeglądarce zawsze będzie problemem, czy też jeśli pamięć większości komputerów wzrośnie, będzie to mniejszy problem.
artlung
Pamięć nie jest problemem z ilością ładowanych danych. Wąska szyja to manipulacja DOM.
morgancodes
Myślę, że mówimy to samo. Im więcej danych ładujesz, tym więcej ładujesz węzłów DOM, dla mnie są one powiązane pod względem potrzebnej pamięci. Mam nadzieję, że mimo wszystko sytuacja się poprawiła.
artlung
1

jeśli chcesz usunąć tylko szybko .. możesz zrobić jak poniżej ..

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

ale w tabeli mogą znajdować się elementy powiązane ze zdarzeniami,

w tym wypadku,

powyższy kod nie zapobiega wyciekowi pamięci w IE ... TT i nie jest szybki w FF ...

Przepraszam....


źródło
0

to działa dla mnie:

1- Dodaj klasę do każdego wiersza „removeRow”

2- w jQuery

$(".removeRow").remove();
Alsaket
źródło
-2

Możesz spróbować tego ...

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);
}
Bilbo Waggins
źródło