我有一种奇怪的行为。我正在使用一个相当繁重的页面(4000个节点),用于显示交付操作的调度系统。每30秒。我正在刷新jquery,操作列表(超过4000的3000个节点)。它运行得非常好,但是......每次,firefox和chrome的内存都会增加3到6ko。当然,过了一会儿,浏览器崩溃......
有人有什么想法吗?这是内存泄漏吗? javascript无法到达某个地方吗?我检查过,每次刷新后我都有相同数量的节点,这意味着更换工作正常。
每次刷新操作后,我重置了几个事件:这是一个例子
$("#orders_list .list_table_row").hover(
function(){
// mouse over
$(this).children().css("background-color","#E0E0E0");
},
function(){
// mouse out
$(this).children().css("background-color","");
});
任何建议都非常受欢迎,提示,任何事情......
我发现了两个有趣的链接: http://www.javascriptkit.com/javatutors/closuresleak/index3.shtml和 http://www.jibbering.com/faq/faq_notes/closures.html
谢谢, 保罗
修订版1 - 添加了代码示例和链接
答案 0 :(得分:4)
您的问题可能是事件处理程序。每次刷新时管理所有这些节点的绑定和解除绑定可能过于复杂。
尝试使用事件委派。 jQuery的.live()
方法就是你想要的。它将使刷新更快并消除事件处理程序的复杂性和泄漏。
而不是$(".myclass").click(/*...*/)
使用$(".myclass").live("click", /*...*/)
。您只需在页面加载时执行一次,即使在ajax刷新后,它也可以用于该类的所有未来元素。
答案 1 :(得分:2)
在删除那些事件绑定的节点之前,您必须解除绑定(并最好是销毁)事件处理程序。如果不这样做会泄漏记忆
IE在使用闭包时也存在泄漏内存的问题,如果闭包在某些时候是孤立的并且没有被正确销毁,在某些情况下垃圾收集器将无法拾取它。
有一些工具可用于跟踪内存泄漏(上面的注释中提到了Firefox一个),IE Leak Detector,JavaScript Memory Leak Detector
有关浏览器中内存泄漏的更多信息(主要是IE):
Understanding and Solving Internet Explorer Leak Patterns
Closures Leaks in IE