Javascript 删除DOM元素后是否应该调用jQuery.off?

Javascript 删除DOM元素后是否应该调用jQuery.off?,javascript,jquery,html,dom,javascript-events,Javascript,Jquery,Html,Dom,Javascript Events,我正在通过jQuery.on()在DOM元素上注册一个点击监听器。如果稍后从DOM中删除该元素——可能是间接的,例如通过$(parent.html(…))替换某些父级内容,我还应该通过jQuery.off()删除我的处理程序吗 即使元素不再触发任何事件,我也担心潜在的内存泄漏。从DOM中删除元素后,jQuery或浏览器是否会处理这些问题并丢弃所有已注册的处理程序?最好在删除节点之前调用jQuery.off,尤其是如果它是一个单页应用程序,可能包含许多已注册的事件 即使元素不再触发任何事件,我也担

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


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

最好在删除节点之前调用jQuery.off,尤其是如果它是一个单页应用程序,可能包含许多已注册的事件

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

这是一个很好的担忧。要回答您的问题,请查看
$.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

,但是为什么浏览器会将它们保留在内存中呢?为什么我们需要显式地删除它们?@SubinJacob因为jQuery在中间对象中存储
数据
事件
数据。如果从DOM中删除元素,则相关数据可能会保留在内部缓存中(例如,您将事件绑定到上的
.on
,然后使用父级上的
removeChild
innerHTML='
删除元素)。jQuery的
html(“”)
empty()
remove()
,等等。确保从缓存中删除相应的元素数据。哦,就是这样。那么它只与jQuery相关,而不是浏览器,对吗?如果我们使用纯vanilla js绑定事件,那就很好了。是的,在本例中,这是与jQuery相关的特定泄漏。