基于iframe的IE6 javascript内存泄漏?

时间:2009-12-08 10:03:57

标签: javascript jquery iframe memory-leaks internet-explorer-6

我正在使用iframe通过带有更新的jquery的菜单加载内容 iframe的'src'属性然后加载到所需的页面中。每一个 页面有自己的javascript包含和繁重的内容。

代码如下: -

$(document).ready(function() {
    loadPage('main.php');
});

function loadPage(url) {
    $('#applicationFrame').attr('src', url);
}

索引页面上的iframe如下所示: -

<iframe id="applicationFrame" application="yes" trusted="yes" frameborder="0" />

(旁注:我意识到这里的iframe采用非标准属性,但是 这是在其中一个Microsoft中运行的内部Intranet应用程序 他们认为HTA意味着什么。)

无论如何,菜单项只是调用javascript:loadPage('whatever.php') 为了加载所需的任何内容。

我面临的问题是,在每个后续页面上点击菜单 帧正在泄漏内存,直到最终整个应用程序慢慢爬行。 sIEve报告以下内容: -

leaks http://img37.imageshack.us/img37/3997/leaks.png

每次点击(21 - > 44 - > 65)等,泄漏列在此处升序。

检查泄漏检查员显示:

inspector http://img527.imageshack.us/img527/4430/inspector.png

在我看来,这只是整个iframed内容已经泄露。

无论如何要避免这种情况吗?我错过了什么吗?我发现了一个类似的问题 here dojo框架已经有了,但尝试建议的解决方案却没有 似乎工作。我还尝试过粘贴其他一些东西 here但是没有决心。

这似乎(惊喜)影响IE6,它实际上是唯一的目标 应用程序的受众。

1 个答案:

答案 0 :(得分:2)

手头有一点时间,尝试了一个jQuery less变种。根据SIEve,似乎不再泄漏。

function pos(obj) {
    var curleft = 0;
    var curtop = 0;
    if (obj.offsetParent) {
        do {
            curleft += obj.offsetLeft;
            curtop += obj.offsetTop;
        } while (obj = obj.offsetParent);
    }
    obj = null;
    return {left:curleft, top:curtop};
}

function loadPage(url) {
    var y = document.getElementById('container');
    var x = document.getElementById('applicationFrame');
    var p = pos(y);
    if (x.src) {
        var tmp = y.cloneNode(false);
        var tmpIF = x.cloneNode(false);
        tmpIF.src = url;
        tmp.appendChild(tmpIF);
        tmp.style.position = 'absolute';
        tmp.style.visibility = 'hidden';
        tmp.style["z-index"] = 20;
        tmp.style.top = p.top;
        tmp.style.left = p.left;
        y.id = "delete";
        x.id = "deleteApplicationFrame";
        document.getElementsByTagName("body")[0].appendChild(tmp);
        tmpIF = null; tmp = null;
    }
    setTimeout("document.getElementById('applicationFrame').style.visibility = 'visible'; var i = document.getElementById('deleteApplicationFrame'); i = i.contentDocument || i.contentWindow.document; i.documentElement.parentNode.removeChild(i.documentElement); i=null; i=document.getElementById('delete'); i.parentNode.removeChild(i); i=null;", 500);
    y = null; x = null; p = null;
}

<div id="container">
    <iframe id="applicationFrame" application="yes" trusted="yes" frameborder="0" src="main.php"/>
</div>

很难说在不知道整个应用程序的情况下可能会发生什么。特别是IE6是一个内存泄漏的b..ch。

一些阅读链接

Understanding and Solving Internet Explorer Leak Patterns

Fixing Leaks

Memory Leakage in Internet Explorer - revisited


只是一个想法,AFAIK在将src设置为不同的值时的行为在W3C HTML DOM规范中没有真正指定,或者是它(链接任何人?)?

我建议您在iframe上设置初始src="main.php"值,而不是使用loadPage('main.php');,并为iframe设置名称。

理想情况下,您的菜单项为<a>标签,然后您可以使用<a href="notmain.php" target="nameOfYourIFrame">FooBar</a>而非基于javascript的解决方案进行测试