javascript - Javascript 事件监听器是否需要在删除它们所附加的元素之前被删除?

标签 javascript events event-handling prototypejs dom-events

假设我已将各种事件监听器附加到各种表单元素。后来,我想删除整个表格。

是否有必要(或建议)注销存在于表单及其元素上的任何事件处理程序?如果是这样,删除元素集合上所有监听器的最简单方法是什么?不这样做的后果是什么?如果重要的话,我正在使用 Prototype。

这就是我实际在做的事情。我有一个简单的表格,如下所示:

<form id="form">
  <input type="text" id="foo"/>
  <input type="text" id="bar"/>
</form>

我观察输入的各种事件,例如:

$('foo').observe('keypress', onFooKeypress);
$('bar').observe('keypress', onBarKeypress);

等等

表单通过 AJAX 提交,响应是表单的新副本。我用新表单的副本替换旧表单,执行类似 $('form').replace(newForm) 的操作。我是不是积累了一堆事件垃圾?

最佳答案

未注销的事件可能不会自动释放内存。这在旧版本的 IE 中尤其是一个问题。

Prototype 曾经为此有一个自动垃圾收集系统,但该方法在 1.6 版本中已被删除。已记录 here .删除该方法是否意味着不再进行垃圾收集,或者该方法不再公开可用,我不知道。另请注意,它仅在页面卸载时调用,这意味着如果您的用户在执行大量 AJAX 和 DOM 更新时长时间停留在同一页面上,即使在该页面访问期间,内存也可能泄漏到 Not Acceptable 程度。

关于javascript - Javascript 事件监听器是否需要在删除它们所附加的元素之前被删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1138565/

相关文章:

javascript - 你应该在 for-in 循环中创建一个 var 吗?

javascript - 将 MVC 模型数据传递给客户端 TypeScript 代码

iphone - 事件不能拖到新的一天。比如说,将其放在屏幕一侧几秒钟就可以实现这一点

architecture - 事件处理程序和回调之间的区别

vb.net - 您如何在自己的类(class)中处理类(class)中提出的事件?

javascript - 在 puppeteer 请求中使用不同的 ip 地址

javascript - 为什么我的指定表格没有被退回?

c# - 如何防止事件导致其自身的事件在 C# 中触发?

c# - 关于自定义事件的问题

javascript - 同步相互依赖的 Dojo 小部件/值