easy-ui控件加载Tab导致内存溢出

今天测试部提了个故障,我负责的模块使用 easy-ui 控件的 tab 方式实现的,会出现内存溢出,在 IE6 上尤为明显。当一次加载大量 tab 的时候,连续刷新,浏览器会很快崩溃。后来查了些资料,发现很少有这方面的解决方案,我这里今天总结了一下。

首先,我这边的 tab 是两层 Tab,为了解决 select 组件在 IE6 上会被覆盖的 Bug,采用了 $("#id").html("<iframe ............/>");的方式实现,(中间懒得写,打架应该都明白的 呵呵),iframe是为了显示 tab 页的内容。在关闭或者刷新整个 Tab 的时候,iframe 所占用的内存并不能完全释放,当操作的 Tab 越多,内存占用越大,随时可能导致浏览器崩溃。现在给出一个有效的解决方法。

1、在jquery.tabs.js 中查找 panel("options").tab.remove();(需要根据 easyui 的版本来确定此段代码所在的 js 文件,可以借助 eclipse 的 search 功能查找)。在此段代码后,添加如下代码片段:
var frame = $('iframe',tab);
if(frame.length>0){
frame[0].contentWindow.document.write('');
frame[0].contentWindow.close();
frame.remove();
if($browser.msize){
CollectGarbage();
}
}
2、此时可以使用 Sieve 进行测试,工具可以到下面的网站下载。
http://home.wanadoo.nl/jsrosman/
3、如果上述方式已经修改还是会存在内存溢出的情况,说明 iframe 还是没有完全释放,此时,可以在加载 Tab 的 jsp 文件中,添加如下函数

function reClearIframe(id){
var el= $("#id");
var frame = el.contentWindow;
if(el){
el.src='abort:blank';
try{
iframe.document.write('');
iframe.documnet.clear();
iframe.remove();
}catch(e){}
document.body.removeChild;
}
}
然后再次jsp页面的 body 属性中添加 onunload属性。如:<body οnunlοad="clearIframe">
并在函数中实现:
function clearIframe(){
reClearIframe(iframe1);
reClearIframe(iframe2);
reClearIframe(iframe3);
........
}
其中 iframe1、iframe2、 iframe3 为加载 Tab 页的 ifarme 的id。

以上第一和第三步任一一种实现方式单独都可以有效的解决加载 Tab 内存溢出的情况,但是。有时,会受到其他引入的 js 的影响。也可以两个都用,但是会,给人觉得有重复释放 iframe 的感觉。呵呵...本来 iframe 在 IE6 就存在很多 Bug 。
最后,希望能对大家有帮助吧。期待高手们有更好的解决方法,如果有,可以发送到我邮箱 liuyang101021@163.com 谢谢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值