我应该在删除 DOM 元素后调用 jQuery.off 吗?

Should I call jQuery.off after removing the DOM element?

本文关键字:jQuery off 调用 删除 DOM 元素 我应该      更新时间:2023-09-26

我正在通过 jQuery.on() 在 DOM 元素上注册一个点击侦听器。如果稍后从 DOM 中删除该元素 - 可能是间接的,例如通过 $(parent).html(...) 替换某些父级的内容,我是否仍然应该费心通过 jQuery.off() 删除我的处理程序?

即使该元素不再触发任何事件,我也担心潜在的内存泄漏。jQuery或浏览器是否会处理这个问题,并在从DOM中删除元素后丢弃所有注册的处理程序?

即使该元素不再触发任何事件,我也担心潜在的内存泄漏。

这是非常好的问题。要回答您的问题,请查看$.fn.html实现。从那里您将了解到html将尝试清理存储的事件数据:

// Remove element nodes and prevent memory leaks
if (elem.nodeType === 1) {
    jQuery.cleanData(getAll(elem, false));
    elem.innerHTML = value;
}

因此,在这种情况下,不需要手动调用.off()。然而。。

您需要记住,您永远不应该尝试使用本机方法(如 removeChild 或 设置 innerHTML 删除元素,因为在这种情况下肯定会有内存泄漏(如果存储了一些数据,事件由 jQuery 注册等(。在这种情况下,使用 .off 方法实际取消注册事件处理程序会更可靠。或者最好使用事件传播,而不是或html('')使用$.fn.remove

最好在删除节点之前调用jQuery.off,特别是如果它是一个可以包含大量注册事件的单页应用程序。