I帧和内存管理的Javascript(Iframes and memory management i

2019-06-27 09:23发布

我有一个页面加载至iframe中的链接。 我一直在使用谷歌Chrome浏览器的内存堆探查监测数据的积累在内存中,我注意到,在一些内存泄漏。

我载入网页并把它添加到第一个快照2.69 MB 。 我点击打开一个网页链接到一个iframe,又过了快照给我14.58 MB的总额。 我用下面的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.28 MB这表明的偏差2.59 MB从初始值,根据我的理解这表明内存leackage。

现在,我的问题是:如果我删除一个iframe(包括在它加载的文件)没有垃圾收集器发现有必要还删除包含从存储在该文件中的所有对象? 或者将我必须手动做到这一点?

我想,如果我打开一个页面到iframe,它的大小不会影响父页的内存使用。 不过,我觉得这将被视为一个单独的窗口,但显然这不是我的一个消息灵通的假设。

任何建议如何解决呢?

谢谢。

Answer 1:

在iframe中,删除之前触发重新加载,然后将其删除。

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

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

DEMO这里 。

Addionally,你可以做一个手工清理过 - 也就是说,如果你在你的cookies或HTML5 localStorage的数据。

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
}


Answer 2:

如果从iframe的任何对象在主窗口​​中的对象引用该对象将不会从DOM删除,因此,如果你有这样的事情:

主窗口:

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

IFRAME:

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

出现这种情况,特别是如果你是指DOM对象。



Answer 3:

var frame = document.getElementById("myframe");
frame.src = "about:blank";

这从我的工作和防止内存泄漏。 IG您必须销毁iframe的父母,不要将其与一些延迟,以防止内存泄漏



文章来源: Iframes and memory management in Javascript