如果我在 javascript 中的任何元素上添加事件处理程序,例如
var link = document.createElement("a");
document.body.appendChild(link);
link.addEventListner("click",function(){
alert("do something");
});
然后我删除链接
link.parrentNode.removeChild(link);
那么我附加到链接的事件会被删除还是会保留在内存中(有点混淆事件在内存中的存储方式和多长时间)或者我应该先删除事件处理程序然后我删除链接节点。
最佳答案
几乎所有浏览器都会在调用垃圾收集器时从内存中删除事件处理程序。但是,IE6 及以下版本有一个已知错误,可能导致事件处理程序未被垃圾回收,从而导致页面内存泄漏。
过去,在删除元素之前清理事件处理程序被认为是一种很好的做法(实际上,像 YUI 和 JQuery 这样的库有这方面的功能)。但现在我想说的是,如果您关心 IE6,则只需担心这一点。
注意:如果您想知道该错误。这是因为IE的垃圾收集器如果涉及到DOM就无法处理循环引用(在旧的IE上即使不涉及DOM也无法处理循环引用)。
例如,如果您有这样的代码:
myDiv.onclick = function () { myDiv.style.backgroundColor = 'red' }
// ^
// |
// circular reference
然后 IE6 和更低版本无法释放事件处理程序。但是,如果您的事件处理程序不包含任何返回到它所附加的 DOM 对象的循环引用,那么 IE 将对其进行垃圾回收。
关于删除节点后的javascript事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19019723/