【问题标题】:If I bind a JavaScript event to an element, then delete the element, what happens to the event?如果我将 JavaScript 事件绑定到一个元素,然后删除该元素,该事件会发生什么?
【发布时间】:2016-03-15 07:56:13
【问题描述】:

假设我有一个元素:

<section id="container">
    <div id="curious">hey, there</div>
</section>

然后,在 DOM 加载后,我将一个事件绑定到元素,如下所示:

$('#curious').click(function (){
  alert('Are you curious?');
});

稍后,该元素被删除:

$('#container').html('');

绑定的事件会发生什么?是不是也删了?它会徘徊吗?清理它是一个好习惯吗?

【问题讨论】:

  • 好问题。我想当您在内部执行.html('') 时,js 引擎会遍历节点并将它们与事件处理程序一起删除。如果不是,那么这就是内存泄漏的来源。哎呀!
  • @JoshCrozier 我猜 jQuery 已经决定使用“绑定事件”作为简写;评论已编辑。

标签: javascript jquery html dom javascript-events


【解决方案1】:

根据.html() method 的 jQuery 文档,事件处理程序已被删除。

这样做是为了防止内存泄漏。

.html() 用于设置元素的内容时,该元素中的任何内容都会被新内容完全替换。此外,jQuery 会从子元素中删除其他构造,例如数据和事件处理程序,然后再将这些元素替换为新内容。

同样,在使用.empty()/.remove() 方法时也是如此:

与元素关联的所有绑定事件和 jQuery 数据都将被删除。

如果您想保留数据和事件侦听器,请改用.detach() method.detach() 方法与 .remove() 方法基本相同,除了它保留与已删除元素关联的所有 jQuery 数据(这意味着您可以在分离后附加相同的元素,并且事件仍然是边界)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2011-02-13
    • 2016-07-01
    相关资源
    最近更新 更多