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

Lui*_*spo 3 html javascript jquery dom javascript-events

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

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

dfs*_*fsq 5

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

这是一个非常好的关注.要回答您的问题,请查看$.fn.html 实施情况.从那里你将学习html将尝试清理存储的事件数据:

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

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

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

  • @SubinJacob因为jQuery在中间对象中存储`data`和`event`数据.如果元素从DOM中删除,可能会发生相关数据将保留在内部缓存中(例如,您使用`.on`绑定事件,然后在父项上删除带有'removeChild`或`innerHTML =''的元素).jQuery的`html('')`,`empty()`,`remove()`等确保从缓存中删除相应的元素数据. (2认同)