【问题标题】:Should I remove events before changing a div content?我应该在更改 div 内容之前删除事件吗?
【发布时间】:2011-11-13 16:04:06
【问题描述】:

我继承了一个 jQuery 应用程序,它通过在不离开页面的情况下调用 AJAX 服务来完成其工作。

有一个项目列表,当您单击一个项目时,会显示项目的详细信息,附加到按钮的事件,然后处理 html 并创建新的 html,附加新的事件等等。等等。

我想知道 JavaScript 垃圾回收是否会自动清理这些事件,或者它们是否会进入类似 Map 的数据结构中并造成内存泄漏。我应该明确地清理它们吗?

【问题讨论】:

    标签: javascript jquery memory-leaks


    【解决方案1】:

    如果你总是绑定相同的事件,你也可以使用 jQuery live() 之类的东西,而不是总是绑定/取消绑定它们。

    【讨论】:

    • 很有趣,所以您是说使用 live() 我将它附加到 document.ready() 一次,然后 jQuery 将为我处理绑定/取消绑定。即使当我调用 live 时元素还不存在,它也会起作用吗?
    • live() 所做的是将事件绑定到 body 标签而不是实际元素,然后在事件目标冒泡到 body 标签时检查它是否与您的选择器匹配。这样,您的元素在您绑定事件时不必存在。
    • 我有already experimented and it works,谢谢,还想知道你提到的实现技巧。
    【解决方案2】:

    Javascript 垃圾回收不会删除绑定到已删除元素的事件。 jQuery 函数通常执行,具体取决于您使用的方法。

    例如,.html().remove() 将删除事件而不泄漏内存。如有疑问,您可以随时使用.empty()


    在我看来,.live() 的讨论与内存泄漏无关。从架构的角度来看,应该使用.live()。除非您需要将事件绑定 before 元素被添加到 DOM,或者存在 after 元素被移除(因为它可能会再次添加)然后.bind()确实是正确且快速的使用方法。 .live().bind() 慢,因为每个事件都必须在元素上触发,冒泡到 document 然后冒泡回到元素以便由 .live() 处理,而使用 .bind 它可以执行马上。

    另外,仅供参考,.bind().live() 在最新版本的 jQuery (1.7) 中已弃用。它们仍将起作用,但新语法为.on(),使用委托替换.live()。这是因为过多的.live() 确实会减慢页面速度,因为每个.live 都会将另一个事件绑定到document,每个事件都必须监听和处理该事件。

    【讨论】:

      【解决方案3】:

      如果你想让 GC 更容易并且不让他搜索它是否有引用,那么你应该取消绑定/删除所有事件到 div。

      【讨论】:

      • 好吧,你这么说只是为了让它更容易,不存在泄漏问题。尽管如此,我还是可以做到的。使用 jquery,我将单击事件绑定为 $('selector').click()。如何解绑?
      • $('selector').click() 是 $('selector').bind('click',function () {}) 的别名;所以:$('selector').unbind('click');
      猜你喜欢
      • 2012-12-11
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      相关资源
      最近更新 更多