jQuery.remove(),分离DOM元素,但我仍然可以从代码访问元素.如何避免泄漏
jQuery.remove(), detach DOM elements, but I still can access the elements from code. How to avoid leaks?
我知道,在一个有很多UI元素的应用程序中正确管理内存并不容易,完全基于Ajax(在我的应用程序中,页面从未重新加载)。但是我想了解以下行为:
我有一个根元素,其中一个单一的子元素在一个时间必须附加(认为它的根元素是应用程序的容器和子单个页面)。每当我在子内容之间切换时,我使用jQuery.remove()删除以前的内容,但我看到内容实际上与DOM分离,但它仍留在内存中。
- 根目录和两个子目录(child1和child2)
- 从child1切换到child2,要求我的应用程序管理器在附加child2之前删除child1
- child2正在被附加(我可以看到它),但我仍然可以使用child1元素从管理child1 的代码
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删除
相关文章:
- 元素在我的代码中不会.fadeTo.Don'I don’我不知道;s错误的JavaScript、JQuery、H
- 访问代码生成的输入元素上的keyup事件
- HTML 标记未在 AngularJS ckEditor 中应用,而是在 Ediator 中显示 HTML 元素标记代码
- 使用javascript代码将HTML元素复制到剪贴板
- 制作 JavaScript 代码适用于任何元素
- 如何获取dom元素的代码行号
- 如何停止“;固定的“;元素,使用以下代码
- jQuery和AJAX对元素的调用有JavaScript代码
- 用于修改文档元素的 PHP 代码
- 如何在样式元素中获取 CSS 代码
- 为什么谷歌跟踪代码管理器不能安装在正文下的另一个HTML元素中
- findout js代码遍历DOM中的哪个元素
- 什么'这段用javascript移动css元素的代码错了
- 用于查找JS代码中引用的DOM元素的工具
- 如果我只想从数组中打印任何一个元素.任何数组.那么代码会是什么
- jQuery没有为具有新id的新元素执行代码
- 重用用于淡入淡出元素的代码,这样我就不会'我不必重复我的代码
- JavaScript:删除一部分代码,并在单击时删除一个元素
- 使用美丽汤获取“视图元素”代码,而不是“查看源代码”代码
- 从另外两个元素创建一个jquery元素(代码解释请求)