为什么从DOM中删除元素时注册事件会消失?

时间:2010-01-08 13:08:52

标签: javascript jquery dom javascript-events

这个jQuery 1.3.2代码为页面添加了一个元素,注册了一个“click”事件,然后删除并重新附加了该元素:

var button = $('<button>Click me!</button>')
  .click(function(){ alert("Hello") })
  .appendTo('body');

$('body').html('');

button.appendTo('body');

按钮按预期显示在页面上,但点击它不会执行任何操作。我想知道为什么从对象中删除了事件处理程序。

注意:我了解jQuery.live()clone(true)等解决方案或使用appendTo而无需删除的解决方案。我正在寻找的是解释,而不是解决方案或解决方法。

编辑:我认为这可能是DOM的任意且反直觉的设计决策。像“因为这就是规范Y希望它的X部分”的解释会很好。

2 个答案:

答案 0 :(得分:6)

使用jQuery从DOM中删除元素时,jQuery在该元素上保存的所有数据(包括事件处理程序)都将被销毁。这样做是为了避免内存泄漏。

这不是DOM API的功能(或错误)。这只是jQuery。

答案 1 :(得分:5)

如果您希望您的注册事件留在您的元素上,请使用.detach()而不是.remove()。使用它与使用.remove()的方式相同,它会将事件保留在元素上。