2012-07-12 23 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)