在删除Javascript事件侦听器所需的元素之前,是否需要先删除它们';你喜欢什么?

在删除Javascript事件侦听器所需的元素之前,是否需要先删除它们';你喜欢什么?,javascript,events,event-handling,prototypejs,dom-events,Javascript,Events,Event Handling,Prototypejs,Dom Events,假设我已将各种事件侦听器附加到各种表单元素。稍后,我想删除整个表单 是否有必要(或建议)注销表单及其元素上存在的任何事件处理程序?如果是这样,删除元素集合上所有侦听器的最简单方法是什么?不这样做的后果是什么?如果有必要的话,我正在使用原型 这是我实际上正在做的。我有一个简单的表格,像这样: <form id="form"> <input type="text" id="foo"/> <input type="text" id="bar"/> </

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

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

这是我实际上正在做的。我有一个简单的表格,像这样:

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


表单通过AJAX提交,响应是表单的新副本。我将旧表单替换为新表单的副本,执行类似于
$('form')。替换(newForm)
。我是否积累了大量事件积垢?

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


原型曾经有一个自动垃圾收集系统,但该方法已在1.6版中删除。这是有案可查的。删除该方法是否意味着不再进行垃圾收集,或者该方法不再公开,我不知道。还要注意的是,它只在页面卸载时被调用,这意味着如果用户在执行大量AJAX和DOM更新时长时间停留在同一页面上,即使在访问一页的过程中,内存也可能泄漏到不可接受的程度。

在Jonas下面提到的情况下,从DOM中删除的元素中删除任何事件侦听器总是好的。

是的,有一点。这还不足以成为一个大问题,但IE的旧版本在这种情况下会泄漏

从Prototype 1.6.1(目前在其最终版本候选中)开始,库在页面卸载时处理此清理。当您使用Prototype添加事件观察者时,它会在数组中保留对该元素的引用;在页面卸载中,它循环遍历该数组并删除所有观察者

但是,如果用户要在此页面上停留一段时间,内存使用将在页面的整个生命周期内累积。您有几个选择:

  • 倾听形体祖先上的事件,一个永远不会被替换的祖先。然后,在处理程序中,检查事件来自何处。(即“活动授权”)

  • 在调用
    元素#replace
    之前,显式取消注册所有调用。在您的示例中,您将执行以下操作:

    $('foo', 'bar').each(Element.stopObserving);
    
  • 这相当于调用不带参数的
    stopObserving
    ,其效果是删除给定元素上的所有处理程序

    我建议选择1

    (我们已经讨论过在未来的原型版本中作为
    元素#更新
    元素#替换
    的一部分进行自动侦听器删除,但这是一种性能权衡。)

    $('foo', 'bar').each(Element.stopObserving);