删除节点后的 JavaScript 事件处理程序
javascript event handler after removing node
>如果我在 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 内存管理
检查垃圾回收部分。
相关文章:
- keyup事件处理程序更改焦点不适用于快速键入
- 提示使用服务器端事件处理程序激活JavaScript
- 将事件处理程序绑定到任何可能的事件
- 正在将事件处理程序添加到不存在的类
- 在循环中附加事件处理程序时出现浏览器性能问题
- 在同一个javascript事件处理程序中调用不同的函数
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 检查事件处理程序参数
- 实现延迟的jquery更改事件处理程序
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 如何使jQuery的“bind”或“on”事件处理程序幂等
- 带有参数的Javascript事件处理程序
- Jquery事件处理程序仅适用于匿名函数
- 如何从另一个处理程序内部取消JavaScript事件处理程序函数的执行
- 如何在jQuery事件处理程序中存储和重用超时
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 异步处理所有事件处理程序的方法
- jsplumb中的Click事件处理程序丢失“;这个“;对象
- 构造函数中的事件处理程序与构造函数外的事件处理函数的行为不同
- 如何在事件处理程序的回调中防止Default