当前位置:  开发笔记 > 编程语言 > 正文

可以在没有浏览器阻塞的情况下添加大量DOM节点吗?

如何解决《可以在没有浏览器阻塞的情况下添加大量DOM节点吗?》经验,为你挑选了1个好方法。

我的网站上有一个显示表的网页,每隔10秒重新加载XML源数据(使用XmlHttpRequest),然后更新表以向用户显示数据的任何添加或删除.为此,JavaScript函数首先清除表中的所有元素,然后为每个数据单元添加一个新行.

最近,我通过这个DOM破坏和创建代码导致了Internet Explorer中的大量内存泄漏(大多数代码都与JavaScript对象和DOM对象之间的循环引用有关,而我们正在使用的JavaScript库静静地保存引用每个创建的JS对象,new Element(...)直到页面被卸载).

随着内存问题的解决,我们现在发现了一个基于CPU的问题:当用户需要查看大量数据时(100多个数据单元,相当于要创建的100个节点,以及每个单元的所有表格单元格)列),该进程占用CPU,直到Internet Explorer提示用户:

停止运行此脚本?
此页面上的脚本导致Internet Explorer运行缓慢.如果它继续运行,您的计算机可能会无响应.

似乎运行行和单元创建代码超过100多个数据是导致CPU使用率飙升的原因,这个函数需要"太长时间"(从IE的角度来看)才能运行,从而导致IE生成这个警告给用户.我还注意到,虽然"更新屏幕"功能运行100行,但IE不会重新呈现表内容,直到函数完成(因为JS解释器在该时间段内使用100%CPU,我假设) .

所以我的问题是:在JavaScript中是否有任何方法告诉浏览器暂停JS执行并重新呈现DOM?如果没有,是否有任何处理创建大量DOM节点和没有浏览器阻塞的策略?

我能想到的一种方法是异步处理"更新表"逻辑; 也就是说,一旦完成重新加载XML数据的Ajax方法,将数据放入某种数组,然后设置一个函数(使用setInterval())来运行,它将一次处理一个数组元素.然而,这似乎有点像在JavaScript环境中重新创建线程,这看起来可能变得非常复杂(即,如果在我仍然重新创建表的DOM节点时,另一个Ajax数据请求会发生什么?等等)


更新:只想解释为什么我接受RoBurg的答案.在做一些测试时,我发现new Element()我的框架中的方法(我使用的是mootools)大约document.createElement()是IE7中传统方法的2倍.我运行了一个测试来创建1000 并将它们添加到一个

,new Element()在IE7上运行大约1800ms(在Virtual PC上运行),传统方法大约需要800ms.

我的测试还揭示了一种更快的方法,至少对于像我这样的简单测试:使用John Resig所描述的DocumentFragments.使用IE7在同一台机器上运行相同的测试需要247毫秒,比我原来的方法提高了9倍!



1> Greg..:

百分之百不是那么多......你还在使用那个框架new Element()吗?这可能是它的原因.

你应该测试new Element()vs document.createElement()vs 的速度.innerHTML

还尝试在内存中构建dom树,然后在最后将其附加到文档中.

最后要注意你不要经常看到.length,或者那样的其他比特和bob.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有