代码之家  ›  专栏  ›  技术社区  ›  Gavin Gilmour

基于iframe的ie6javascript内存泄漏?

  •  3
  • Gavin Gilmour  · 技术社区  · 16 年前

    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采用了非标准属性,但是 在HTA中,它们确实有意义。)

    以便加载所需的任何内容。

    我面临的问题是,在随后的每一页上,单击菜单 sIEve报告如下:-

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

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

    检查泄漏检查员显示:

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

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

    有没有办法避免这种情况?我错过什么了吗?我发现了一个类似的问题 here here 但是没有决心。

    这似乎只会(令人惊讶地)影响IE6,而IE6实际上是唯一的目标

    1 回复  |  直到 16 年前
        1
  •  2
  •   jitter    16 年前

    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


    src W3CHTMLDOM规范中没有真正指定不同的值,或者是(链接任何人?)?

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

    理想情况下,您的菜单项是 <a> 然后您可以使用 <a href="notmain.php" target="nameOfYourIFrame">FooBar</a> 而不是基于javascript的解决方案