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

标签 javascript

如果我在 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/

相关文章:

javascript - 如何使用 javascript 获取 firebase 3 的 accessToken

javascript - 动画递增数字并显示十进制值

javascript - 通过 javascript 从 AJAX 回调返回数据

javascript - EXTJS 4 - 网格过滤器或商店过滤器清除商店中的现有过滤器

c# - 有没有办法在外部 .js 上处理 .NET/C# 变量?

javascript - 指定的插件 0,提供了 "default"的无效属性(Jest React Native)

php - 通过iframe中的脚本检测父域名

Javascript JSON 字典对象

javascript - jquery-1.10.2.js :1472 Uncaught Error: Syntax error, 无法识别的表达式 : label[for ='team[]' ], 标签[for ='team[]'] *, #team[]-error

javascript - HTML//CSS//JavaScript : button or input doesn't show up on web