[英]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中的內存泄漏 - 重新訪問
只是一個想法,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.