2012-07-12 24 views
1

我在IE中有一些内存泄漏问题。Unhooking事件处理程序需要避免内存泄漏IE中

我一直在阅读,那在IE中不解开事件处理程序,可能会导致内存泄漏。这是真的?
我的内存泄漏是由于用户离开页面时未分离事件处理程序导致的吗?

+0

当你尝试解开处理程序时,是否修复了泄漏? – 2012-07-12 22:23:04

+0

这是一段很大的代码,我需要一段时间才能完成所有事件并尝试完成。我不是原作者 – ama2 2012-07-12 22:24:02

+0

如果处理程序关闭了包含接收处理程序的相同元素的变量作用域,则可能会发生内存泄漏。 – 2012-07-12 22:26:10

回答

1

道格拉斯Crockford的有excellent post on JSscript memory leaks(JScript是IE浏览器的JavaScript实现/的ECMAScript)。它基本上归结为:IE对DOM和JScript有单独的内存管理(因此垃圾收集)。因此,IE无法清理DOM对象和事件处理程序之间的循环引用。

解决此问题的方法是确保在丢弃DOM对象之前始终从DOM对象中删除事件处理程序(或将它们设置为null)。

+0

这是否也发生在IE9? – ama2 2012-07-12 22:44:12

+0

@ ama2是的,IE9以及无论是标准模式还是怪癖模式都会发生。 – 2012-08-01 16:19:45

0

一些较旧的浏览器对此有问题。当有注册的事件处理程序时,请考虑这一点;在脚本引擎

1)回调注册表保持,事件在这里绑定有两件事情,一个的DOMNode和函数指针

2)的DOMNode可能“dissapear” - 和同样的事情“发生”到该功能(虽然不太可能)。

<a onclick="a = (a?a+1:0);" id="getme">...这样的代码会产生一个匿名函数,您将通过参考var anchor = document.getElementById('getme'); anchor.onclick'要完全清除它,必须除delete anchor.onclick以外还要分离eventlistener。

有些人可能wrant这段代码,但它肯定会擦出锚的onclick远

var a=document.getElementById('getme') 
window.detachEvent("onclick", a.onclick); 
delete a.onclick; 
a.parentNode.removeChild(a)