从 DOM 中移除的元素中取消绑定事件

Posted

技术标签:

【中文标题】从 DOM 中移除的元素中取消绑定事件【英文标题】:Unbind events from elements that are removed from the DOM 【发布时间】:2014-05-22 15:32:50 【问题描述】:

我正在与一位开发人员讨论我们在 ios 设备上使用网络应用时遇到的问题。它大量使用事件和 jQuery。我们目前存在应用使用一定时间后运行缓慢的问题。

我的同事认为问题在于我们将事件处理程序绑定到特定元素上,例如

$("div#id123").on("click", function(....)....);

而且,因为每当我们将新元素加载到 DOM 时都会这样做,这些事件处理程序最终会“污染”浏览器,使其变慢。

一旦加载了新元素,旧元素就完全来自 DOM 的 $("div#id456").remove()d,直到它们可以再次加载(完全新的,没有任何类型的缓存)。

我不能反驳他,但我很确定一旦旧元素被删除,事件处理程序也会被浏览器删除。毕竟:他为什么要保留它们?

他建议我重写所有处理程序以具有以下形式

$(document).on("click", "div.commonclass", function(....)...);

在文档级别拥有事件处理程序,绑定到我们处理的所有元素共有的类。

这对我来说意味着一些重大的重写,我想避免因为在我看来不是我们问题的根本原因的事情。

我对已移除元素上的事件的假设是否正确,如果正确,我如何向我的同事表明重写事件处理程序会不必要地浪费工作时间?

【问题讨论】:

使用.remove() 也会删除任何绑定的处理程序。按照建议使用委托将避免有许多处理程序,具体取决于多少元素。所以我建议你也试试。现在您的问题可能来自其他地方 使用 .detach() 而不是 remove() 因为 .detach() 充当临时删除但事件处理程序没有删除请尝试 【参考方案1】:

我发现,当您专门为 iOS 应用程序使用 javascript 时,由于内存开销,您在使用 jQuery 时需要非常小心。我经常不得不用原生 javascript 重写 jQuery 大量的 javascript 部分,以减少内存占用并确保它在 iOS 环境中有效工作。我发现在这种情况下进行调试的最佳方法是在 google chrome 中使用分析器。刚刚回答了一个类似的问题,请参阅此处了解更多信息:Is there any possible danger of using "JQuery.on()" profusely

使用 chrome 分析器时,拍摄堆快照,进行更改,然后拍摄另一个堆快照并进行比较。这样可以查看脚本更改对内存的影响。

【讨论】:

以上是关于从 DOM 中移除的元素中取消绑定事件的主要内容,如果未能解决你的问题,请参考以下文章

jquery移除绑定触发元素事件

vue.js怎样移除绑定的点击事件

jquery之remove(),detach()方法详解

js事件绑定总结

JDA:如何检测成员是如何从公会中移除的?

web前端练习28----Dom4,事件(事件对象,事件冒泡,事件委派,事件传播,事件绑定,事件移除及案例练习)