jQuery-从大型表中删除所有行的最快方法


93

我认为这可能是删除非常大的表(3000行)中内容的快速方法:

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

但是在Firefox中完成大约需要五秒钟。我是否在做一些愚蠢的事情(除了尝试向浏览器加载3000行之外)?有更快的方法吗?

Answers:


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

那样快就可以了。


嗯 令人沮丧 我认为删除将比插入快得多。有点让我想做一些丑陋的事情,例如隐藏表并在要更新时创建一个新表。
morgancodes

10
是的,嗯... HTML并不是为了在页面中显示3k行而创建的:)您能想到任何分页的解决方案吗?这样可以更快。当然,这将需要更多的工作,但是它将带来更加丰富的用户体验。
的Seb

7
这个好。问题在于这也会删除表头。
isuru

2
删除标题:(
Sandeep Kushwah

4
这将删除表中的所有内容,包括标题。我假设@morgancodes想删除内容,也就是行,而不是标题。对于那些后来发现的解决方案是$('#mytable tbody').empty();。这样可以确保仅将胸腔清空。
OmniOwl

82

最好避免任何形式的循环,只需像这样直接删除所有元素:

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

6
html("")empty()内部通话
Emile Bergeron

8
对我来说,这是个不错的解决方案,因为它不会删除表头。谢谢!
达里亚(Daria)

@Daria可以充分利用选择器,这将使标题保持不变:$('table tbody')。empty();
丹妮

使用(“ #mytable> tbody”)和(“ #mytable tbody”)有什么区别。
eaglei22 '16

1
如果表的一行中有嵌套表,它也会删除这些tbody标签。如果只有一个表,它应该没有太大不同。
Shiroy

6

使用分离的速度比此处的其他任何答案都快:

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

不要忘了将tbody元素放回表中,因为detach删除了它:

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

另请注意,说话时的效率$(target).find(child)语法比快$(target > child)。为什么? 嘶嘶声!

清空3,161表格行所用的时间

使用Detach()方法 (如上面的示例所示):

  • Firefox:0.027秒
  • 铬:0.027秒
  • 边缘:1.73秒
  • IE11:4.02s

使用empty()方法:

  • Firefox:0.055秒
  • 铬:0.052s
  • 边缘:137.99秒(可能会冻结)
  • IE11:冻结且永不返回


3

我可以在这里看到两个问题:

  1. jQuery的empty()和remove()方法实际上做了很多工作。有关原因,请参见John Resig的JavaScript函数调用分析

  2. 另一件事是,对于大量表格数据,您可能会考虑使用数据网格库(例如出色的DataTables)从服务器动态加载数据,从而增加了网络调用的数量,但减小了这些调用的大小。我有一个非常复杂的表,其中有1500行,但运行起来很慢,更改为新的基于AJAX的表会使相同的数据显得相当快。


谢谢artlung。实际执行类似的操作,一次从服务器获取所有数据,但仅在需要时绘制表行。
morgancodes

听起来像个好电话。我想知道是否担心浏览器中表的行数始终是个问题,或者如果大多数计算机的内存增加,这将不是一个问题。
artlung

内存与我正在加载的数据量无关。瓶颈是DOM操作。
morgancodes

我想我们在说同样的话。加载的数据越多,加载的DOM节点就越多,对我而言,这些与所需的内存有关。希望您的情况有所改善,无论如何。
artlung

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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.