我知道在具有大量UI元素的应用程序中正确管理内存并且完全基于Ajax并不容易(在我的应用程序中,页面永远不会重新加载).但我想了解以下行为:
我有一个根元素,一次只能附加一个子元素(将其视为根元素是app容器,子元素是单个页面).每当我在子内容之间切换时,我都会使用jQuery.remove()删除以前的内容,但我发现内容实际上是从DOM中分离出来的,但它仍保留在内存中.
child1代码(包含对child1 DOM的引用):
function testaccess(){
load_and_remove(child2);
var child1DOM = get_this_dom();
}
Run Code Online (Sandbox Code Playgroud)
child1DOM仍然存在,我可以操作它,好像它仍然附加到DOM.
好吧,我想jQuery.remove()和GC将无法释放内存,直到我有代码可以访问它,但即使我没有调用get_this_dom(),即使退出testaccess(),我看到FF内存不会减少......
当我退出child1时,我想知道如何让GC释放所有内存.
这里的代码没有返回预期的内容:
jQuery('<div>Look here: [ jQuery0="null" ]</div>').html()
Run Code Online (Sandbox Code Playgroud)
相反,你得到:
Look here: [ ]
Run Code Online (Sandbox Code Playgroud)
有问题的jQuery源代码:
html: function( value ) {
return value === undefined ?
(this[0] ?
this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
null) :
this.empty().append( value );
},
Run Code Online (Sandbox Code Playgroud)
这背后的动机是.replace什么?我没有时间来讨论jQuery的其余部分,但这样的代码让我想知道我是否应该在生产中使用jQuery.
想象一下,我有以下代码:
...
<div id="div1">
<div id="div2">Original div2</div>
</div>
<div id="div3"></div>
...
Run Code Online (Sandbox Code Playgroud)
如果我跑
$('#div1').html('');
$('#div3').html('<div id="div2">New div2</div>');
Run Code Online (Sandbox Code Playgroud)
我最终会遇到问题,因为我没有使用.remove()从dom中删除#div2,或者以这种方式清除html对我这样做了吗?
如果div2包含一些附加了处理程序的javascript,比如说
$('#div2').on('click',function() { ... });
Run Code Online (Sandbox Code Playgroud)
会被删除,还是我需要关闭()它?
我正在制作灯箱,我是否需要使用
$(window.top).unload(function() { .. });
Run Code Online (Sandbox Code Playgroud)
要清理变量,还是所有浏览器都会自动清理所有内容并重置内存,什么不是?
我需要打扰还是浏览器会为我做这件事?什么与所有内存泄漏和所有..
编辑:我将大量数据附加到div元素.所以我需要在卸载时执行removeData吗?