jquery - 从一个非常大的表中删除所有行的最快方法

Posted

技术标签:

【中文标题】jquery - 从一个非常大的表中删除所有行的最快方法【英文标题】:jquery - fastest way to remove all rows from a very large table 【发布时间】:2010-10-17 21:51:19 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:
$("#your-table-id").empty();

这和你得到的一样快。

【讨论】:

嗯。令人沮丧。我认为删除会比插入快得多。有点让我想做一些非常丑陋的事情,比如隐藏表格并在我想要更新时创建一个新表格。 是的,嗯... html 不是为了在一个页面中显示 3k 行而创建的 :) 你想不出任何分页解决方案吗?这样会快很多。当然它需要更多的工作,但它会提供更丰富的用户体验。 这个不错。问题是这也会删除表头。 删除标题 :( 这将删除表格中的所有内容,包括标题。我假设@morgancodes 想要删除内容,也就是行,而不是标题。对于以后发现此问题的人,解决方案将是$('#mytable tbody').empty();。这确保只有 tbody 被清空。【参考方案2】:

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

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

【讨论】:

html("") 内部调用empty() 对我来说很好的解决方案,因为它不会删除表格的标题。谢谢! @Daria 充分利用选择器,这将使您的标题保持原位:$('table tbody').empty(); 使用 ("#mytable > tbody") 和 ("#mytable tbody") 有什么区别。 如果您在表格的一行中有一个嵌套表格,它也会删除那些 tbody 标记。如果你只有一张桌子,应该不会有太大的不同。【参考方案3】:
$("#myTable > tbody").empty();

它不会触及标题。

【讨论】:

【参考方案4】:

使用 detach 比这里的任何其他答案都快:

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

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

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

还要注意,当说话效率$(target).find(child) 语法比$(target &gt; child) 快。为什么? Sizzle!

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

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

火狐:0.027s 铬:0.027 秒 边缘:1.73s IE11:4.02s

使用 empty() 方法:

火狐:0.055s 铬:0.052 秒 边缘:137.99s(还不如被冻结) IE11:冻结且永不返回

【讨论】:

empty() 相比,detach() 将保留与已删除元素相关联的所有 jQuery 数据。【参考方案5】:

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

    jQuery 的 empty() 和 remove() 方法实际上做了很多工作。请参阅 John Resig 的 javascript Function Call Profiling 了解原因。

    1234563这些电话的规模。我有一个非常复杂的表,有 1500 行,速度很慢,更改为基于 AJAX 的新表使相同的数据看起来相当快。

【讨论】:

感谢 artlung。实际上做一些类似的事情,一次从服务器获取所有数据,但只在需要时绘制表格行。 听起来不错。我想知道是否担心浏览器中表格中的行数总是一个问题,或者如果大多数计算机的内存增加,这将不是一个问题。 内存不是我加载的数据量的问题。瓶颈是 DOM 操作。 我想我们说的是同一件事。加载的数据越多,加载的 DOM 节点就越多,对我来说,这些与所需的内存有关。无论如何,我希望您的情况有所改善。【参考方案6】:

这对我有用:

1-为每一行添加类“removeRow”

2-在jQuery中

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

【讨论】:

【参考方案7】:

如果你只想快速删除..你可以像下面这样..

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

但是,表格中可以有一些事件绑定的元素,

在这种情况下,

以上代码并不能防止 IE 中的内存泄漏... T-T 和 FF 不快...

对不起……

【讨论】:

【参考方案8】:

你可以试试这个……

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);

【讨论】:

以上是关于jquery - 从一个非常大的表中删除所有行的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

Snowflake 中对非常大的表进行删除操作的最佳方法是啥?

从非常大的表中导出逗号分隔的数据

使用jquery表中的复选框从数组中删除JavaScript对象

在 PLSQL 中,如何迭代更新一个非常大的表的字段?

如何从 django 的表中获取选定行的记录?

如何从cassandra中非常大的表中读取所有行?