簡體   English   中英

基於iframe的IE6 javascript內存泄漏?

[英]iframe based IE6 javascript memory leak?

我正在使用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采用了非標准屬性,但這是一個內部Intranet應用程序,運行在其中一個Microsoft HTA中,它們確實意味着什么。)

無論如何,菜單項只是調用javascript:loadPage('whatever.php'),以便加載所需的任何內容。

我面臨的問題是,在每個后續頁面上單擊菜單框架都會泄漏內存,直到最終整個應用程序慢慢爬行。 sIEve報告如下: -

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

每次點擊(21 - > 44 - > 65)等,泄漏列在這里上升。

檢查泄漏檢查員顯示:

檢查員http://img527.imageshack.us/img527/4430/inspector.png

在我看來,這只是泄漏的整個iframed內容。

反正有沒有避免這個? 我錯過了什么嗎? 我在這里找到了類似的問題,dojo框架已經有了,但嘗試建議的解決方案似乎沒有用。 我也嘗試過粘貼在這里的其他一些東西,但沒有決心。

這似乎(驚喜)影響IE6,它實際上是應用程序的唯一目標受眾。

有一點時間,嘗試了jQuery較少的變種。 根據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。

一些閱讀鏈接

了解和解決Internet Explorer泄漏模式

修復泄漏

Internet Explorer中的內存泄漏 - 重新訪問


只是一個想法,AFAIK在將src設置為不同值時的行為在W3C HTML DOM規范中沒有真正規定,或者是它(鏈接任何人?)?

我建議你在iframe上設置一個初始的src="main.php"值,而不是使用loadPage('main.php'); 並為iframe設置名稱。

理想情況下,您的菜單項是<a>標簽,然后您可以使用<a href="notmain.php" target="nameOfYourIFrame">FooBar</a>而不是基於JavaScript的解決方案進行測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM