我应该用jQuery的数据()来查看哪种内存泄漏?

Kei*_*rup 7 javascript memory jquery dom memory-leaks

我应该将每个data()调用与稍后的removeData()调用配对吗?

我的假设:jQuery的remove()将从DOM中删除元素,如果我没有任何其他删除引用,我不需要再做任何清理.

但是,如果我有一些javascript var或object引用其中一个元素被删除,我需要清理它,我假设它也适用于jQuery的数据函数,因为它以某种方式引用元素.

因此,如果我确实需要在删除之前调用removeData,是否有删除与元素关联的所有数据的快捷方式,或者我必须通过名称显式调用每个数据?

编辑:我查看了源代码并确认了Borgar和roosteronacid所说的内容.删除从dom中取出元素并删除与它们一起存储的任何事件和数据 - 这很方便,但让我想知道何时使用removeData().可能不经常.

Bor*_*gar 14

jQuery的数据没有保留对元素的引用,因此您不必担心内存泄漏.其预期目的是解决这个确切的问题.

略微简化其工作原理:

将id成员添加到每个"触摸"的DOM节点.涉及该DOM元素的所有后续操作都使用该id.

var theNode = document.getElementById('examplenode');
theNode[ 'jQuery' + timestamp ] = someInternalNodeID;
Run Code Online (Sandbox Code Playgroud)

您可以使用jQuery使用的相同函数访问id:

someInternalID = jQuery.data( document.body );
Run Code Online (Sandbox Code Playgroud)

将数据附加到节点时,它会将数据存储在jQuery对象上,并在节点的内部标识下进行归档.您在$(element).data(key,value)内部翻译为:

jQuery.cache[ someInternalNodeID ][ theKey ] = theValue;
Run Code Online (Sandbox Code Playgroud)

一切都进入相同的结构,包括事件处理程序:

jQuery.cache[ someInternalNodeID ][ 'events' ][ 'click' ] = theHandler;
Run Code Online (Sandbox Code Playgroud)

删除元素后,jQuery可以通过一个简单的操作丢弃所有数据(和事件处理程序):

delete jQuery.cache[ someInternalNodeID ];
Run Code Online (Sandbox Code Playgroud)

从理论上讲,您也可以删除jQuery而不会从任何引用中发生泄漏.jQuery甚至支持库的多个独立实例,每个实例都拥有自己的一组数据或事件.

您可以在"The DOM Is a Mess"演示文稿中看到John Resig解释这些内容.

  • 读者应该注意,只有使用jQuery的`.remove()`方法才能安全,这会导致清理存储的数据.如果您自己从DOM中删除元素,jQuery将无法清除它,并且在页面关闭之前您将发生泄漏. (5认同)