假设我的文档中有一系列元素,它们是单个对象的子元素。这些元素中的每一个都注册一个具有不同参数的新事件监听器。如果我丢弃父对象,是否需要手动取消注册所有eventListeners?或者浏览器是否跟踪所有事件侦听器并在从DOM中删除元素时丢弃它们? 我问的原因是因为跟踪所有事件非常痛苦,然后调用removeEventListeners。似乎浏览器应该足够聪明才能弄清楚这一点,但如果我不这样做,我恐怕会泄漏内存。
举个例子:
var elements = parent.childNodes;
var listeners = [];
for (var i = 0; i<elements.length; i++) {
listeners.push(elements[i].addEventListener('click',function() { alert(i); }));
}
以后:
for (var i = 0; i<elements.length; i++) {
elements[i].removeEventListener(listeners[i]); // is this really required?
}
parent.parentNode.removeChild(parent);
典型方法是什么?我意识到一个简单的方法是将事件监听器引用存储在元素本身上,但我想知道修改元素的类型是否会导致额外的性能问题?
答案 0 :(得分:7)
在现代浏览器中,您不需要在从DOM中删除元素之前删除事件侦听器。如果您的javascript中没有直接引用该特定DOM元素(例如存储在JS变量中的DOM元素引用),则删除后将对DOM元素进行垃圾回收。
DOM GC足够聪明,知道一旦从DOM中删除了DOM事件,事件监听器就不会被视为对该DOM元素的引用(因为DOM事件从DOM中删除时不会发生)。