jQuery.remove(),分离DOM元素,但我仍然可以从代码访问元素.如何避免泄漏

jQuery.remove(), detach DOM elements, but I still can access the elements from code. How to avoid leaks?

本文关键字:元素 代码 访问 泄漏 何避免 remove 分离 DOM jQuery      更新时间:2023-09-26

我知道,在一个有很多UI元素的应用程序中正确管理内存并不容易,完全基于Ajax(在我的应用程序中,页面从未重新加载)。但是我想了解以下行为:

我有一个根元素,其中一个单一的子元素在一个时间必须附加(认为它的根元素是应用程序的容器和子单个页面)。每当我在子内容之间切换时,我使用jQuery.remove()删除以前的内容,但我看到内容实际上与DOM分离,但它仍留在内存中。

  1. 根目录和两个子目录(child1和child2)
  2. 从child1切换到child2,要求我的应用程序管理器在附加child2之前删除child1
  3. child2正在被附加(我可以看到它),但我仍然可以使用child1元素从管理child1
  4. 的代码

child1代码(保存对child1 DOM的引用):

function testaccess(){
   load_and_remove(child2);
   var child1DOM = get_this_dom();
}

child1DOM仍然存在,我可以操作它,就好像它仍然连接到DOM。

好吧,我想jQuery.remove()和GC将无法释放内存,直到我有代码,将访问它,但即使我不调用get_this_dom(),即使退出testaccess()后,我看到FF内存不减少…

我想知道如何让GC释放所有的内存,当我退出child1。

直到对它的所有引用都被释放后,它才会从DOM中删除。

你应该尝试删除JS DOM和渲染DOM之间的所有循环引用-它们都有单独的垃圾收集器并且单独工作。这就是为什么JS的标记和清除垃圾收集器不能捕获这些。

你可以尝试重写你的代码来打破循环引用:

var mything = something();
mything = null;

这里有几篇文章可能会有所帮助:

http://msdn.microsoft.com/en-us/library/Bb250448

http://www.javascriptkit.com/javatutors/closuresleak/index.shtml

http://javascript.info/tutorial/memory-leaks

我很肯定你可以很快找到更多关于这个的。

此外,您可以尝试.empty()释放所有子节点,但它调用.remove()来做一些工作。

请注意,其中一些问题在较新的jQuery版本中已经修复,例如1.5比1.4好。

另一篇关于这个的帖子:jQuery内存泄漏与DOM删除