2010-01-08 55 views
6

這個jQuery 1.3.2代碼將一個元素添加到頁面,註冊一個「click」事件,然後刪除和重新佩戴元素:爲什麼從DOM中刪除一個元素時註冊的事件消失了?

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節希望它是這樣」的解釋就沒有問題。

+0

您可以使用您正在使用的版本更新問題,也可以使用1.2.6,1.3.2和1.4 alpha版本更新問題。 – 2010-01-08 13:18:28

回答

6

當您使用jQuery從DOM中刪除元素時,jQuery在該元素上保存的所有數據(包括事件處理程序)將被銷燬。這樣做是爲了避免內存泄漏。

這不是DOM API的功能(或錯誤)。這只是jQuery。

+0

你的意思是,IE瀏覽器的DOM和JS循環引用錯誤?我懂了。出於好奇,jQuery如何檢測到元素已從DOM中移除?是否有這樣的事件? – 2010-01-08 14:39:41

+1

如果您使用jQuery方法之一移除元素,jQuery將只會「清理」數據。如果你只是使用'button [0] .parentNode.removeChild(button [0])',那麼jQuery不會知道它。 – James 2010-01-08 14:45:22

+1

對。那麼,在設置新內容之前,jQuery的'html()'還會對所有孩子運行刪除?聰明。還有另一個不使用'innerHtml'的原因:) – 2010-01-08 14:58:33

5

如果您希望您的註冊活動停留在您的元素上,請使用.detach()而不是.remove()。以與您使用.remove()相同的方式使用它,它會將您的事件保留在您的元素上。

+0

感謝您指出這個方向。完全是我需要的功能。 – Chris 2013-03-04 10:48:53

相關問題