假设我有一个内部有各种元素的容器。反过来,任何元素都可以有各种事件监听器。
<div id="container">
<video src="movie.mp4"></video>
<a>Some button</a>
</div>
使用Prototype JS,如何从内存中正确删除每个元素及其事件侦听器?以下是清理所有内容的明确方法:
$('container').childElements().each(
function(child) {
Event.stopObserving(child);
child.remove();
}
);
以下是清除容器的更快捷的方法:
$('container').update();
但它会导致内存泄漏吗?大多数javascript引擎会理解如果我清除innerHTML,我还想清除每个元素上的事件监听器吗?
答案 0 :(得分:4)
通常,当元素消失时,事件处理程序将消失。清除容器的innerHTML
会破坏所有包含的元素,从而破坏附加的事件处理程序。
旧版本的Internet Explorer(&lt; = IE8)在拥有元素被销毁时从事件处理程序重新声明内存时出现问题。为了适应它们,您应该使用Event.stopObserving
。
要绝对确定,您可以像这样扩展Element
:
Element.addMethods({
clear: function(element) {
element = $(element);
element.descendants().each(function(elem) {
Event.stopObserving(elem);
});
return element.update();
}
});
在重新设置元素内容本身之前,这会从所有后代中删除所有事件。它似乎不是Event.stopObserving()
本身就是重复的,所以如果没有这一步,可能仍然存在“进一步向下”的元素泄漏。像这样使用它:
$('container').clear();
免责声明:我对原型不熟悉。如果上述内容不正确,请发表评论。
相关阅读:
答案 1 :(得分:2)
如果您定期在稳定容器中添加和删除元素,那么如果您使用Event.on
,则可能会节省时间和内存担忧。
$('container').on('click', 'a', function() {
// button is clicked
});
这样,无论元素如何,事件处理程序都是持久的,并且不会创建新的处理程序,因此不会泄漏任何泄漏。