基于iframe的IE6 javascript内存泄漏?

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

代码如下: –

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

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

  

(旁注:我意识到这里的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; } 

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

一些阅读链接

了解和解决Internet Explorer泄漏模式

修复泄漏

Internet Explorer中的内存泄漏 – 重新访问


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

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

理想情况下,您的菜单项是标签,然后您可以使用FooBar而不是基于JavaScript的解决方案进行测试