kunkkaCoco
2012-05-15 19:13
浏览 545

动态创建iframe导致内存不足

我现在想做一个效果,就是主页里面嵌套一个iframe,根据左边的菜单栏选择的内容不同,iframe内的页面随之改变,现在采用的方式是点击一个菜单,然后动态创建一个iframe,加载一个jsp页面,然后点击另一个菜单加载另一个页面,为了提高速度,采用
了动态创建和动态销毁iframe的方式,这样却导致了ie最后内存泄露

[code="java"]
//创建
var iframe = document.createElement("iframe");
iframe.src = pageURL;
document.getElementById("contentDiv").appendChild(iframe);

//销毁 tempFrame.src = blankPageURL;
tempFrame.contentWindow.document.write('');
tempFrame.contentWindow.document.clear();
tempFrame.contentWindow.close();
document.getElementById('contentDiv').removeChild(tempFrame);
tempFrame = null;
CollectGarbage();
[/code]

请问有什么好的解决方法或者其他的方案来实现???

今天又尝试了直接在html中使用iframe,然后动态通过iframe.src来改变页面的方式,又出现了另一个问题:点击一次可以加载出来,再点击一次又加载不出来了,然后再点击又可以加载出来,请问这是为什么????

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

13条回答 默认 最新

  • hzylyl2402 2012-05-16 09:38
    已采纳

    IFRAME销毁是无法全部释放内存,所以最好不用IFRAME。如果确实要用IFRAME就使用你的第2种方式,尽量减少创建IFRAME。
    建议使用iframe.contentWindow.location.replace(url)这个没有history或者
    iframe.contentWindow.location = url.这个有history.

    已采纳该答案
    打赏 评论
  • iteye_5043 2012-05-16 11:12

    若菜单项不多的话可以每个菜单项对应一个iframe,第一次点击菜单项是新建iframe,点击其他菜单时隐藏此iframe(display:none),再次点击此菜单项的话显示此iframe,若需刷新只需重新给iframe.src属性赋值即可,至于你说的那个“点击一次可以加载出来,再点击一次又加载不出来了,然后再点击又可以加载出来”是不是缓存的事儿 ,若是的话可以增加随机数处理。

    打赏 评论
  • qiankun123456 2012-05-16 13:26

    直接改变iframe的src就可以了,创建销毁比较麻烦

    打赏 评论
  • gotta521 2012-05-17 14:34

    你可以尝试使用Sitemesh框架的渲染术,可以实现你需要的功能,网上相关资料很多,当然如果需要我这里也有。

    打赏 评论
  • liulijun_cn_2011 2012-05-18 09:54

    用ajax,jquery.load()方法都可以实现你的要求。
    把你本来想创建的iframe换成DIV。然后点击菜单的时候,调用ajax或者.load,调用后台,返回数据之后,直接填充到DIV里即可。
    后台返回可以直接指向一个JSP画面。那2个方法可以直接取到填充完数据的HTML代码。
    $.post("www.baidu.com", null, function(result) {
    $("#div").html(result);
    })

    打赏 评论
  • liulijun_cn_2011 2012-05-18 21:44

    [quote]这个方法我也试过,但是有一点,这个方法返回来的其实只是那个页面的一个字符串而已,里面的js代码那样就执行不了了 [/quote]
    里面的JS代码都是在父画面加载的时候全部加载进去的。。。。
    我给你说这个方法。都是我自己都曾经用过的。不是随口瞎说的。。。
    你参照DWZ框架的设计原理就行了

    打赏 评论
  • liulijun_cn_2011 2012-05-18 21:47

    [quote]这个方法我也试过,但是有一点,这个方法返回来的其实只是那个页面的一个字符串而已,里面的js代码那样就执行不了了 [/quote]
    用jquery.load的话。返回的画面跟普通的jsp一样。可以直接在里面用标签。
    而且也可以正常执行。

    打赏 评论
  • remotejsky 2012-05-20 19:10

    其实很简单。利用链接

    把菜单链接的target设置为iframe的name对应值就OK了

    打赏 评论
  • suzu88 2012-05-21 16:47

    为什么要动态创建呢。直接改变iframe的src不更好

    [code="java"]document.getElementById("myfirame").src=url[/code]

    打赏 评论
  • gdufstww 2012-05-23 13:56

    Jquery有很多tab插件就能够实现这个功能。

    打赏 评论
  • iteye_9008 2012-05-24 16:10

    iframe在IE6下有内存泄漏,我解决IE6是这样,但这样还是会有些内存泄漏,但没不处理严重
    /**
    * 跳转URL并回收资源
    */
    function gotoUrl( id, url ) {
    var el = document.getElementById( id ), iframe = el.contentWindow;
    if( el ) {
    if( $.browser.msie ) {
    el.src = 'about:blank';
    try {
    iframe.document.write( '' );
    iframe.close();
    } catch( e ) {
    }
    }
    el.src = url;
    }
    }

    打赏 评论
  • iteye_18589 2012-05-24 18:23
    打赏 评论
  • water84222 2012-05-28 14:15

    iframe不推荐使用。你要实现的功能,用ajax实现不可以吗。

    打赏 评论

相关推荐 更多相似问题