2012-07-23 64 views
6

在「空」功能的jQuery的文檔(http://api.jquery.com/empty/)有如下語句:jQuery的虛函數和事件處理

"To avoid memory leaks, jQuery removes other constructs such as data and event handlers 
from the child elements before removing the elements themselves." 

在文中說: 「... jQuery從!CHILD!元素中移除事件處理程序...」。但我希望事件處理程序也從div標籤($(「#mydiv」)。empty)中移除。我知道有「刪除」功能,但我的意圖是不刪除div標籤。完成這件事的最好方法是什麼?

另一件事是:
當他們說「刪除事件處理程序」。他們是否只移除使用「綁定」創建的構造,還是移除使用「委託」創建的構造?很多提前

感謝

回答

8

從一個元素中刪除所有綁定的事件處理程序,您可以將特殊值"*"傳遞給off()方法:

$("#mydiv").empty().off("*"); 

當文件說remove events handlers,它只講綁定事件處理程序,而不是委託 ones,因爲它們綁定到不受刪除影響的祖先元素(或文檔本身)。

如果稍後恢復已刪除的元素,這允許委託處理程序繼續按預期工作。

+1

澄清:*當他們說「刪除事件處理程序」。他們是否只移除使用「綁定」創建的構造,還是移除使用「委託」創建的構造?*它從元素中刪除所有事件處理程序,委派與否。 I.E.如果你有'$(「#mydiv」)。委託(「div」,「click」,fn).off(「*」)''.delegate'附加的處理程序被刪除,因爲它在元素上。 – Esailija 2012-07-23 08:52:42

0

如果我正確讀取你不想div標籤去掉,你只是想刪除在這種情況下所有的數據和處理與結合.empty():

http://api.jquery.com/unbind/ 

但是請注意: 「附加.bind()的事件處理程序可以使用.unbind()來刪除。(從jQuery 1.7開始,優先使用.on()和.off()方法附加和刪除元素上的事件處理程序。)在最簡單的情況下,沒有參數,.unbind()刪除附加到元素的所有處理程序:「

使用與綁定事件相對應的刪除工具。

如果您想要調用的元素也被移除,請不要使用.empty(),而應使用.remove()。

http://api.jquery.com/remove/ 

「類似.empty(),在一個.remove()方法將元素從DOM的。使用一個.remove()當你想刪除它裏面的元素本身,以及一切。除了元素本身之外,所有與元素相關的綁定事件和jQuery數據都將被刪除。要刪除元素而不刪除數據和事件,請改爲使用.detach()。「

1

試試這個jQuery代碼;

jQuery('#element').bind('click',function(){ 
    console.log('clicked'); 
    }).on('remove',function(){ 
     console.log('element removed'); 
     jQuery(this).unbind('click').off('remove'); 
    }); 

    jQuery('#element').remove();