zoukankan      html  css  js  c++  java
  • easyui中jquery重复引用问题(tab内存泄露问题)

    今天认真测试了下easyui的一些兼容性问题,发现在ie9 ie10 首次加载的时候,会出现如下bug。如图所示:

    11

    认真看了下,我估计是脚本重复引用的问题,我用的iframe框架的模式。登陆系统后,桌面首页也加载了同样的jquery的脚本。

    后来,我把加载首页的代码加了1毫秒的延迟,问题就解决了。代码如下:

    setTimeout(function () {
                $("#tabs").tabs('add', {
                    title: '个人桌面',
                    content: createFrameByTab('/home/desktop.aspx'),
                    iconCls: 'home'
                });
    }, 1);

    现在想想也有可能是tab内存泄露的问题。具体怎么解决呢?

    easyui源码:

    tab.panel("options").tab.remove();
    //新增
    var frame = $('iframe',tab);
         if(frame.length>0){
               frame[0].contentWindow.document.write('');
               frame[0].contentWindow.close();
               frame.attr('src', "about:blank");
               frame.remove();
         }
    //
    tab.panel("destroy");

    参考:

    IE9下用jquery tabs ,easyui tabs  等报SCRIPT5009错误
    最近在做一个项目时用到了Jquery UI Tabs这个插件,在添加新标签时手工往tabs append了iframe页面,然后在iframe里用$("#tab").tabs('remove', selectedindex);方法移除标签时,IE9就会报SCRIPT5009错误,错误代码指向jquery.js 6784行,报“isNaN” 未定义,isNaN是JS原生函数,怎么会未定义呢?经过一番研究,终于发现了原来是iframe惹的祸,原因是IE在iframe元素的回收方面存在着bug,在通常情况下应该将该元素的src属性值修改为”abort:blank”,并手工将其从DOM树上移除,不然会造成内存泄露。打开jquery tabs的源码发现,Tabs插件在remove标签时直接将DIV panels移除,并没有对iframe做相应的处理,而iframe是div panels的子元素,直接删除就会造成上述的问题,于是修改源码加入以下代码:

    var ifrm = panls.find("iframe"); //首先查找iframe
     
      if( ifrm.length > 0){//有iframe时
     
       var el = ifrm.get(0);
     
       el.contentWindow.document.write('');//清空iframe的内容
     
       el.contentWindow.close();//避免iframe内存泄漏
     
       ifrm.attr('src', "about:blank");
     
       ifrm.remove();
     
      }
     
    问题 解决:)

    web技术分享

  • 相关阅读:
    C++中使用stringstream进行类型转换操作
    代理模式
    观察者模式 VS 责任链模式
    10.模板方法模式
    2.里氏替换原则
    单一职责原则
    规格模式
    策略模式的扩展——策略枚举
    策略模式 VS 桥梁模式
    原型模式【下】
  • 原文地址:https://www.cnblogs.com/youqu/p/3300277.html
Copyright © 2011-2022 走看看