2013-04-11 122 views
3

在jQuery + jQuery UI中,確實調用了.remove()上的一個元素,該元素上還調整了可調整大小/可拖動的元素,它固有地調用.resizable('destroy') + .draggable('destroy')或等效方法,可以正確清理所有內容?在調用remove之前,我是否必須銷燬可調整大小的/可拖動的?jQuery刪除是否也銷燬resizables/draggables?

回答

1

看起來你不需要在致電remove之前致電destroy函數。 jQuery .remove觸發器.destroy固有地。我無法在任何地方找到這個文件,我很驚訝地發現這一點。

當包含jQuery UI時,庫會覆蓋jQuery的cleanData函數以包含觸發.remove事件的代碼。 (https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.widget.js#L16

查看本演示 - http://jsfiddle.net/UMYzD - 調用.remove函數時調用.remove函數。現在從左側窗格(http://jsfiddle.net/UMYzD/1)取消了jQuery UI,你會看到,在調用.remove.remove事件處理程序不會被觸發了。

$.cleanData = function(elems) { 
    for (var i = 0, elem; (elem = elems[i]) != null; i++) { 
     try { 
     $(elem).triggerHandler("remove"); 
     // http://bugs.jquery.com/ticket/8235 
     } catch(e) {} 
    } 
    _cleanData(elems); 
}; 

$(elem).triggerHandler("remove");觸發微件和所有它調用的插件的.destroy固有的方式約束該元素在.remove事件。

下面是調用層次,

enter image description here

下面是小提琴http://jsfiddle.net/nxrzY/1/

enter image description here

+0

快照'我找不到這個記錄任何地方,我很驚訝地發現了這一點.'雖然沒有寫入「刪除通話消滅」的文檔(和你在堆棧顯示),它是寫'除了元素本身,所有綁定的事件和關聯數據的jQuery元素被刪除'。但無論如何,謝謝你展示了堆棧。 – RaphaelDDL 2013-04-24 21:10:35

+0

@RaphaelDDL不,文檔專門討論元素。這是不是刪除元素或它的事件。它觸發特定事件「刪除」,以內部調用控件銷燬功能。 – 2013-04-24 21:57:30

1

從jQuery的remove() docs摘自:

類似.empty(),該.remove()方法取出DOM元素。當您想要移除元素本身以及其中的所有元素時,請使用.remove()除了元素本身之外,所有與元素相關的綁定事件和jQuery數據都將被刪除。要刪除元素而不刪除數據和事件,請改爲使用.detach()

所以據說,它會刪除調整大小,拖動事件也是如此。在從DOM中移除之前,jQuery可能會調用unbind()off()