2013-04-11 117 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()