删除节点后的 JavaScript 事件处理程序

javascript event handler after removing node

本文关键字:事件处理 程序 JavaScript 节点 删除      更新时间:2023-09-26

>如果我在 JavaScript 中的任何元素上添加事件处理程序,例如

var link = document.createElement("a");
document.body.appendChild(link);

link.addEventListner("click",function(){
     alert("do something");
});

然后我删除链接

link.parrentNode.removeChild(link);

那么我附加到链接的事件也会被删除还是会保留在内存中(对事件在内存中的存储方式和存储时间有点困惑(,还是应该先删除事件处理程序,然后再删除链接节点。

几乎所有浏览器都会在调用垃圾回收器时从内存中删除事件处理程序。但是,IE6 及更低版本有一个已知的 bug,可能会导致事件处理程序不被垃圾回收,从而导致页面泄漏内存。

在删除元素之前清理事件处理程序曾经被认为是一种很好的做法(事实上,像 YUI 和 JQuery 这样的库都有这方面的功能(。但是现在我想说的是,如果你关心IE6,只担心这一点。


注意:如果您想知道该错误。这是因为如果IE的垃圾收集器涉及DOM,则无法处理循环引用(在较旧的IE上,即使不涉及DOM,也无法处理循环引用(。

例如,如果您有这样的代码:

myDiv.onclick = function () { myDiv.style.backgroundColor = 'red' }
//                               ^
//                               |
//                     circular reference

则 IE6 及更低版本无法释放事件处理程序。但是,如果您的事件处理程序不包含任何对它附加到的 DOM 对象的循环引用,则 IE 将对其进行垃圾回收。

在javascript函数表达式中(在你的例子中是事件绑定(分配一个对象,因此消耗内存。您应该正确删除或处理它。查看此链接,其中详细解释了内存管理。

Js 内存管理

检查垃圾回收部分。