代码之家  ›  专栏  ›  技术社区  ›  Jeremy Kauffman

在删除javascript事件侦听器所附加的元素之前,是否需要删除它们?

  •  8
  • Jeremy Kauffman  · 技术社区  · 15 年前

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

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

    <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)

    3 回复  |  直到 5 年前
        1
  •  4
  •   Jonas Høgh    15 年前

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

    here . 删除该方法是否意味着不再进行垃圾收集,或者该方法不再公开,我不知道。还请注意,它只在页面卸载时被调用,这意味着如果用户在执行大量AJAX和DOM更新时长时间停留在同一页面上,即使在一次页面访问期间,内存也可能泄漏到不可接受的程度。

        2
  •  3
  •   savetheclocktower    15 年前

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

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

    1. 收听网络上的事件 祖宗 一种永远不会被取代的形式。然后,在处理程序中,检查事件来自何处。(即“活动授权”)

    2. Element#replace . 在您的示例中,您将执行以下操作:

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

    这相当于打电话 stopObserving 没有参数,具有删除的效果 全部的 给定元素上的处理程序。

    我建议选择1。

    (我们已经讨论过在Prototype的未来版本中自动删除侦听器,这是Prototype的一部分。) Element#update ,但这是一种性能权衡。)

        3
  •  0
  •   Lark    15 年前

    在Jonas下面提到的场景中,从DOM中移除的元素中移除任何事件监听器总是很好的。