Node_pro Asked:2020-03-13 05:38:15 +0000 UTC2020-03-13 05:38:15 +0000 UTC 2020-03-13 05:38:15 +0000 UTC 我应该在删除之前从元素中删除事件吗?[复制] 772 在一个视频中,我听说在删除有事件的元素时,我们不会删除处理程序本身。换句话说,事件处理程序继续运行,尽管该元素不存在。我希望收到对这些话的确认或反驳。谢谢! javascript 1 个回答 Voted Best Answer Qwertiy 2020-03-13T07:22:17Z2020-03-13T07:22:17Z 删除有事件的元素,我们不删除处理程序本身 是的,当从 dom 树中删除一个元素时,它上面的所有处理程序都会保留: document.querySelector('button').addEventListener('click', function (e) { e.target.remove(); setTimeout(function () { document.body.appendChild(e.target) }, 500); }); <button>Click me</button> 好吧,据我了解,事件可以在内存中,但不会执行 也可以这样做: document.querySelector('button').addEventListener('click', function(e) { if (e.target.parentElement) { e.target.remove(); setTimeout(function() { e.target.click() }, 500); } else { document.body.appendChild(e.target); } }); <button>Click me</button> 我应该在删除之前从元素中删除事件吗? 在大多数情况下,没有。如果没有其他对该元素的引用,那么垃圾收集器仍然会与处理程序一起收集它: ~function add() { var btn = document.createElement('button'); btn.textContent = "Click me"; btn.addEventListener('click', function (e) { btn.remove(); setTimeout(add, 500); }); document.body.appendChild(btn); }(); 正如您在分析器中看到的那样,除了最后一个之外,点击中没有幸存的对象: 但是,在某些情况下,IE8 确实存在泄漏问题。 但是,如果处理程序或元素以某种方式被外部代码持有,那么它将被保留,直到该持有被删除。如果有任何订阅时间较长的对象或事件,那么您需要取消订阅。 因此,在使用具有组件生命周期的框架时,建议在组件销毁时,手动取消订阅您订阅的所有内容。
是的,当从 dom 树中删除一个元素时,它上面的所有处理程序都会保留:
也可以这样做:
在大多数情况下,没有。如果没有其他对该元素的引用,那么垃圾收集器仍然会与处理程序一起收集它:
正如您在分析器中看到的那样,除了最后一个之外,点击中没有幸存的对象:
但是,在某些情况下,IE8 确实存在泄漏问题。
但是,如果处理程序或元素以某种方式被外部代码持有,那么它将被保留,直到该持有被删除。如果有任何订阅时间较长的对象或事件,那么您需要取消订阅。
因此,在使用具有组件生命周期的框架时,建议在组件销毁时,手动取消订阅您订阅的所有内容。