我在IE中有一些內存泄漏問題。Unhooking事件處理程序需要避免內存泄漏IE中
我一直在閱讀,那在IE中不解開事件處理程序,可能會導致內存泄漏。這是真的?
我的內存泄漏是由於用戶離開頁面時未分離事件處理程序導致的嗎?
我在IE中有一些內存泄漏問題。Unhooking事件處理程序需要避免內存泄漏IE中
我一直在閱讀,那在IE中不解開事件處理程序,可能會導致內存泄漏。這是真的?
我的內存泄漏是由於用戶離開頁面時未分離事件處理程序導致的嗎?
道格拉斯Crockford的有excellent post on JSscript memory leaks(JScript是IE瀏覽器的JavaScript實現/的ECMAScript)。它基本上歸結爲:IE對DOM和JScript有單獨的內存管理(因此垃圾收集)。因此,IE無法清理DOM對象和事件處理程序之間的循環引用。
解決此問題的方法是確保在丟棄DOM對象之前始終從DOM對象中刪除事件處理程序(或將它們設置爲null
)。
這是否也發生在IE9? – ama2 2012-07-12 22:44:12
@ ama2是的,IE9以及無論是標準模式還是怪癖模式都會發生。 – 2012-08-01 16:19:45
一些較舊的瀏覽器對此有問題。當有註冊的事件處理程序時,請考慮這一點;在腳本引擎
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)
當你嘗試解開處理程序時,是否修復了泄漏? – 2012-07-12 22:23:04
這是一段很大的代碼,我需要一段時間才能完成所有事件並嘗試完成。我不是原作者 – ama2 2012-07-12 22:24:02
如果處理程序關閉了包含接收處理程序的相同元素的變量作用域,則可能會發生內存泄漏。 – 2012-07-12 22:26:10