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

Vic*_*let 6 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');
Run Code Online (Sandbox Code Playgroud)

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

注:我知道的解决方案,如jQuery.live()clone(true)或使用appendTo没有去除.我正在寻找的是解释,而不是解决方案或解决方法.

编辑:我想这可能是DOM的任意和反直觉的设计决策.像"因为这是规范Y希望它的X部分的方式"的解释会很好.

Jam*_*mes 6

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

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


小智 5

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