Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的iFrame和内存管理_Javascript_Jquery_Memory Management_Iframe - Fatal编程技术网

Javascript中的iFrame和内存管理

Javascript中的iFrame和内存管理,javascript,jquery,memory-management,iframe,Javascript,Jquery,Memory Management,Iframe,我有将页面加载到iFrame的链接。我一直在使用Google Chrome的内存堆分析器监控内存中的数据积累,我注意到内存中存在一些漏洞 我加载了页面并拍摄了第一张快照,总计为2.69MB。我点击了在iframe中打开页面的链接,并拍摄了另一张快照,总共有14.58MB。我使用以下jquery片段删除了iframe: $('#myframe').unbind(); $('#myframe').remove(); /* * By the way, I also tried $('#myframe

我有将页面加载到iFrame的链接。我一直在使用Google Chrome的内存堆分析器监控内存中的数据积累,我注意到内存中存在一些漏洞

我加载了页面并拍摄了第一张快照,总计为
2.69MB
。我点击了在iframe中打开页面的链接,并拍摄了另一张快照,总共有
14.58MB
。我使用以下jquery片段删除了iframe:

$('#myframe').unbind();
$('#myframe').remove();
/*
* By the way, I also tried $('#myframe > *') as a selector. 
* It still didn't work. Even if it would, it doesn't look like a viable solution to me.
* It looks too resource intensive.
*
* I forgot to mention that I am not using Ajax to load my pages
*/
我又拍了一张快照,得到了
5.28MB
,这表明与初始值的偏差
2.59MB
,据我所知,这表明内存流失

现在,我的问题是:如果我删除一个iframe(其中包括加载在其中的文档),垃圾回收器不觉得也有必要从内存中删除该文档中包含的所有对象吗?还是我必须手动执行此操作

我认为如果我将文档加载到iframe中,它的大小不会影响父页面上的内存使用。我认为这将被视为一个单独的窗口,但很明显,这并不是我的一个充分了解情况的假设

有没有关于如何解决这个问题的建议


谢谢。

如果主窗口中的某个对象引用了iframe中的任何对象,则该对象不会从DOM中删除,因此,如果您有以下内容:

主窗口:

var object = {};
function iframe_call(data){
    object.iframe_data = data.something
}
iframe:

function onClick(){
    parent_object.iframe_call(this);
}

如果引用DOM对象,尤其会发生这种情况。

在iframe中,在删除它之前触发重新加载,然后再删除它

<a href="#">Remove</a>
<iframe src="url" />​

$('a').click(function(){
    $('iframe')[0].contentWindow.location.reload();
    setTimeout(function(){
       $('iframe').remove();
    }, 1000);
});​

这在我身上起了作用,防止了内存泄漏。Ig您必须销毁iframe的父级,延迟一段时间以防止内存泄漏

此线程似乎是解决此问题的良好切入点:。卸载父级窗口后内存会发生什么变化?谢谢。如果我刷新父窗口,内存将返回到
2.69MB
谢谢Cuzzea。我明白你的意思,但在这个阶段,我不会与iframe中的任何东西进行交互。我刚刚加载了随机页面。现在我还没有在iframe和父窗口之间建立任何连接。此外,我还删除了iframe及其内容。通过比较这两个配置文件,您可以查看到底发生了什么变化。您可以看到winmerge逐行执行操作。别忘了按构造函数排序,所以顺序是相同的。幸运的是,我没有解决我的iOS web视图内存泄漏问题。感谢Robin,您共享的第一个选项非常棒,而且很有效。我打开了8个iFrame,获得了20MB,在关闭所有iFrame并按照您解释的方式清理之后,我可以收回所有20MB。超级棒的罗宾先生…你知道当我的Iframe没有加载实际的URL,而是将HTML、JS和CSS脚本注入到生成的Iframe中时,我怎么能做这样的事情吗?解决方法对我很有效!从2012年到现在可能没有人开过谷歌的机票。。。
window.onbeforeunload = function(){
    $(document).unbind().die();    //remove listeners on document
    $(document).find('*').unbind().die(); //remove listeners on all nodes
    //clean up cookies
    /remove items from localStorage
}
var frame = document.getElementById("myframe");
frame.src = "about:blank";