jquery-非常に大きなテーブルからすべての行を削除する最も速い方法


93

これは非常に大きなテーブル(3000行)のコンテンツを削除するための高速な方法であると思いました。

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

しかし、Firefoxで完了するまでに約5秒かかります。私は何かばかげたことをしていますか(ブラウザに3000行をロードすることを除いて)?それを行うより速い方法はありますか?

回答:


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

それはあなたが得るのと同じくらい速いです。


うーん。イライラする。削除は挿入よりもはるかに高速だと思います。種類によっては、テーブルを非表示にして、更新したいときに新しいテーブルを作成するなど、本当に醜いことをしたいと思っています。
morgancodesは、2009

10
ええ、まあ... HTMLはページに3k行を表示するように作成されていません:)ページ分割されたソリューションについて考えられませんか?それははるかに速くなります。もちろん、より多くの作業が必要になりますが、ユーザーエクスペリエンスははるかに豊かになります。
セブ

7
これはいいです 問題は、これによりテーブルヘッダーも削除されることです。
isuru

2
ヘッダーを削除します:(
Sandeep Kushwah

4
これにより、ヘッダーを含むテーブル内のすべてが削除されます。@morgancodesは、ヘッダーではなく、内容、つまり行を削除したいと思います。これを後で見つけた人にとっての解決策はでしょう$('#mytable tbody').empty();。これにより、tbodyのみが確実に空になります。
OmniOwl

81

ループを回避することをお勧めします。次のようにすべての要素を直接削除します。

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

6
html("")empty()社内通話
エミールベルジェロン

8
テーブルのヘッダーを削除しないので、私にとっては素晴らしい解決策です。ありがとうございました!
Daria

@Dariaはセレクターを最大限に使用します。これにより、ヘッダーが所定の位置に保持されます。$( 'table tbody')。empty();
ダニ

( "#mytable> tbody")と( "#mytable tbody")の使用の違いは何ですか
eaglei22

1
テーブルの行にネストされたテーブルがある場合、それらのtbodyタグも削除されます。テーブルが1つしかない場合でも、それほど大きな違いはないはずです。
シロイ

6

detachの使用は、ここでの他のどの回答よりもはるかに高速です。

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

detachが削除したので、tbody要素をテーブルに戻すことを忘れないでください:

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

また、効率的な$(target).find(child)構文を話すときは、構文よりも速いことに注意してください$(target > child)。どうして? シズル!

3,161テーブル行を空にするまでの経過時間

Detach()メソッドの使用( 上記の例で示したとおり):

  • Firefox:0.027秒
  • クロム:0.027秒
  • エッジ:1.73秒
  • IE11:4.02秒

empty()メソッドの使用:

  • Firefox:0.055秒
  • クロム:0.052秒
  • エッジ:137.99秒(凍結される場合もあります)
  • IE11:フリーズして元に戻らない


3

ここで確認できる2つの問題:

  1. jQueryのempty()およびremove()メソッドは、実際にはかなりの作業を行います。その理由については、John ResigのJavaScript関数呼び出しプロファイリングを参照してください。

  2. もう1つは、大量の表形式のデータの場合、サーバーからオンザフライでデータを読み込むための優れたDataTablesなどのデータグリッドライブラリを検討し、ネットワーク呼び出しの数を増やしながら、それらの呼び出しのサイズを減らすことです。非常に遅くなった1500行の非常に複雑なテーブルがありました。新しいAJAXベースのテーブルに変更すると、同じデータがかなり高速に見えます。


artlungに感謝します。実際に少しそのようなことをし、サーバーからすべてのデータを一度に取得しますが、必要なときにのみテーブルの行を描画します。
morgancodes 2009

いい電話のようですね。ブラウザーのテーブルの行数を心配することが常に問題になるのか、またはほとんどのコンピューターのメモリが増えるので、これはそれほど問題にならないのではないかと思います。
artlung 2009

ロードしているデータの量に問題はありません。ボトルネックはDOM操作です。
morgancodes 2009

私たちは同じことを言っていると思います。ロードするデータが多ければ多いほど、ロードするDOMノードも多くなりますが、これらは必要なメモリの点で関連しています。とにかく、あなたの状況が改善されたことを願っています。
artlung 2009

1

高速で削除したい場合は、以下のようにできます。

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

しかし、テーブルにはイベントバインドされた要素がいくつかあります。

その場合、

上記のコードはIEでメモリリークを防止していません... TTとFFでは高速ではありません...

ごめんなさい....


0

これは私のために働きます:

1-各行「removeRow」のクラスを追加します

2- jQuery

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

-2

あなたはこれを試すことができます...

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);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.