我正在使用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,它实际上是唯一的目标 应用程序的受众。
答案 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
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的解决方案进行测试