【问题标题】:JQuery replaceWith() function and event handlers in memory内存中的 JQuery replaceWith() 函数和事件处理程序
【发布时间】:2018-08-16 04:42:35
【问题描述】:

假设你有这个 html 代码:

<button id="click-me" type="button">Click Me!</button>

然后你运行这个 jQuery sn-p:

var button = $('#click-me');

button.on('click', function() {
    console.log('Clicked !');
});

button.replaceWith('<button id="click-me" type="button">Click Me (Replaced)!</button>');

当然该按钮不会做任何事情,因为它被另一个没有绑定点击事件处理程序的按钮替换,对吧?。

我的问题是: click 事件处理程序是否仍然存在于内存中的某处?或者,它是否被垃圾收集过程删除了?

【问题讨论】:

  • replaceWith定义的JQuery API:The .replaceWith() method removes all data and event handlers associated with the removed nodes.
  • @Sphinx 非常感谢,这样我就不用担心内存泄漏了?

标签: javascript jquery memory


【解决方案1】:

点击事件处理程序是否仍然存在于内存中的某处?或者,它是否被垃圾收集过程删除了?

不,该事件再也没有被绑定,因为函数 replaceWith 删除了前一个元素 button 的完整 DOM。

您可以使用事件委托将该事件“绑定”到元素#click-me

var button = $('#click-me');

$(document).on('click', '#click-me', function() {
    console.log('Clicked !');
});

button.replaceWith('<button id="click-me" type="button">Click Me (Replaced)!</button>');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="click-me" type="button">Click Me!</button>

【讨论】:

  • 谢谢@Ele,这样我就不用担心内存泄漏了?
  • @CryptoBird 不,JS引擎为我们释放未引用的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2014-09-10
  • 1970-01-01
相关资源
最近更新 更多