2012-05-23 83 views
8

我真的好奇,如果jQuery remove函數真的從DOM中刪除元素。
首先,我看了here但答案並不令人信服。
當我注意到我仍然可以操作我稱之爲刪除函數的元素時,我遇到了這個問題。
jQuery刪除函數是否真的刪除Dom元素?

我的代碼:

<div id="container"> 
    <div id="div"> 
     This is a div 
    </div> 
</div> 

var div = $('#div'); 
$('#div').remove(); 
$('#container').append(div); 

注:我的問題是不如何解決這個問題?但我想了解這裏發生了什麼!

實際上,這段代碼並沒有從dom中刪除#div,但是如果我有任何數據設置爲#div,它將會丟失。我現在很困惑,刪除功能的行爲。任何人都可以解釋這個嗎? DEMO

我深信,DIV變量不僅僅是一個DOM元素的克隆,是對它的引用,因爲當我操縱DIV變量(如div.html('something'))DOM中的DIV得到更新。
還是我錯了?

+3

是的,也許http://api.jquery.com/remove/解開謎團:) ) –

+3

只要某個東西引用該對象(存儲在變量中),它就會從DOM中移除,但不會從內存中移除。 – Joseph

+2

@Tats_innit Dude,你真的覺得我之前沒有讀過嗎? – skafandri

回答

14

remove()確實從DOM中刪除元素。

但是在您的示例中,元素已被緩存在內存中,因爲您已將其分配給div變量。因此,您仍然可以使用它並重新附加它,並且它仍然會包含原來所做的所有事件。

如果你說的是正確的,爲什麼我放棄綁定到div的數據呢?

如果檢查source for remove()你會看到,它調用內部cleanData功能,刪除事件和清除data緩存的元素。這就是你失去信息的原因。

如果要從DOM中刪除元素,但保留元素,請改用detach()

下面就以示區別小提琴:http://jsfiddle.net/2VbmX/

+0

確實壞男孩緩存!+1 –

+0

mmmm似乎很奇怪...... div =參考Dom!他從DOM中刪除了這些項目。所以如果他試圖讀取div - 他應該將div - >引用爲null! –

+1

如果你說的是對的,爲什麼我放棄綁定到div的** data **呢? – skafandri

2

不得不刪除指定的變量:

delete div;