Javascript 处理大型DOM元素时加速jQuery empty()或replaceWith()函数
让我先为没有给出代码片段而道歉。我正在做的项目是专有的,我恐怕不能确切地说明我正在做什么。不过,我会尽我所能描述 下面是我的应用程序的详细情况:Javascript 处理大型DOM元素时加速jQuery empty()或replaceWith()函数,javascript,jquery,dom,performance,Javascript,Jquery,Dom,Performance,让我先为没有给出代码片段而道歉。我正在做的项目是专有的,我恐怕不能确切地说明我正在做什么。不过,我会尽我所能描述 下面是我的应用程序的详细情况: 用户单击一个按钮 服务器以数据表的形式检索图像列表 表中的每行包含8个数据单元,每个数据单元依次包含一个超链接 用户的每个请求最多可以包含50行(如果需要,我可以更改此数字) 这意味着该表包含超过800个单独的DOM元素 我的分析表明jQuery(#dataTable”).empty()和jQuery(#dataTable).replaceWith(
- 用户的每个请求最多可以包含50行(如果需要,我可以更改此数字)
- 这意味着该表包含超过800个单独的DOM元素
- 我的分析表明
和jQuery(#dataTable”).empty()
占据了我全部处理时间的97%,平均需要4-6秒才能完成jQuery(#dataTable).replaceWith(tableCloneObject)
在处理需要删除/替换的大量DOM元素时,我正在寻找一种方法来加快上述任何一种jQuery函数的速度。我希望我的解释能有所帮助。您必须一次重新填充所有元素,还是可以在setTimeout()上分块重新填充?我意识到分块处理可能需要更长的时间,但对于用户来说,看到一些事情发生而不是明显的锁定是很有价值的。我最近有一个非常大的数据表,由于执行了所有DOM操作,在进行更改时会消耗15秒到1分钟的处理时间。我把它归结为jQuery
empty()
在您的表上花费了很长的时间,因为为了防止内存泄漏,它对清空元素的内容做了大量的工作。如果您能够承受这种风险,您可以跳过涉及的逻辑,只需像这样做,以摆脱表内容:
while ( table.firstChild )
table.removeChild( table.firstChild );
或
对我有效的是
$(“#myTable”).detach()
。我必须清除一个有1000行的表。我尝试了$(“#myTable”).children().remove()
。这是对$(“myTable”).empty()的改进,但仍然非常慢。$(“#myTable”).detach()
需要1秒或更短的时间。
在FF和Chrome中运行良好。IE仍然很慢。好的,我可以看出其中的逻辑。但是,在我的例子中,我基本上是从a中删除一个表。你可能认为这不会花费太长时间,但中的表包含800多个元素。在这种情况下,你认为你提出的解决方案仍然有效吗?我可以。他们正在介绍HTML 5中的DOM片段来处理这个问题。我认为,如果您尝试提取、更新它,并将其放回,您将看到巨大的性能提升。另外,操作非常简单,我用两行代码进行了更改。如果您安装了Firebug,您可以使用“控制台”选项卡下的“配置文件”按钮查看您的性能也开始吃东西了。这起作用了。我会做更多关于可能的内存泄漏的工作,但这完全加快了速度。谢谢大家!第一种方法起作用了,而不是第二种,这仍然会在大表(50k行)上给我带来堆栈溢出。
while ( table.firstChild )
table.removeChild( table.firstChild );
table.children().remove();