IE下使用jQuery重置iframe地址时内存泄露问题解决办法


Posted in Javascript onFebruary 05, 2015

页面中有个iframe:

 <iframe src='a.html'></iframe>

<button>测试IFRAME泄露</button>

其中a.html内容如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<script type="text/javascript" src="jquery/jquery.min.js"></script>

<style>

.hack{

 /* 1.所有浏览器都有效 */

 background-color:green;

 /* 2.IE8~IE10,Opera有效,但是Opera兼容性可以不考虑 */

 background-color:blue\0;

 /* 3.IE9~IE10有效,与2组合,在2中先写针对IE8的,在此条中针对IE9|IE10 */

 background-color:red\9\0;

 /* 4.IE7有效,与23组合能区分出IE7/IE8/(IE9|IE10) */

 +background-color:yellow;

}

/* 针对IE10+ */

@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {  

 .hack{

  background-color:pink;

 } 

}

  

</style>

</head>

<body>

后缀"\9"  IE6/IE7/IE8/IE9/IE10都生效
后缀"\0"  IE8/IE9/IE10都生效,是IE8/9/10的hack
后缀"\9\0"  只对IE9/IE10生效,是IE9/10的hack
前缀"*"  对IE7有效
前缀"+"  对IE7有效
选择器前缀 @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none)
   针对IE10有效

<input type='text' value='中文'></input>

<div class='hack' style="width:100px;

 height:100px;"></div>

<div id="1" style="padding:5px;position:relative;background-color:green;margin:10px;border:20px solid red;width:100%;height:200px;">

</div>

<div id="2"></div>

<span>SPAN</span>

</body>

</html>

b.html内容如下:
<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<script type="text/javascript" src="jquery/jquery.min.js"></script>

</head>

<body>

<span>SPAN</span>

</body>

</html>

网上有传,如下写法可降低内存泄露:

 var frameDom = $('iframe:eq(0)')[0];

 var frameWin = frameDom.contentWindow;

 

 try{ 

      frameWin.document.write(''); 

      frameWin.document.clear(); 

 }catch(e){}; 

 frameDom.src = 'b.html';

那么效果怎样呢?

写法一:直接设置URL

var flag = true;

 var frameDom = $('iframe:eq(0)')[0];

 $('button').on('click',function(){

  if(flag){

   var frameDom = $('iframe:eq(0)')[0];

   var frameWin = frameDom.contentWindow;

   /*

   try{ 

    frameWin.document.write(''); 

    frameWin.document.clear(); 

      }catch(e){}; 

      */

      frameDom.src = 'b.html';

   flag = false;

  }else{

   var frameDom = $('iframe:eq(0)')[0];

   var frameWin = frameDom.contentWindow;

   /*

   try{ 

    frameWin.document.write(''); 

    frameWin.document.clear(); 

      }catch(e){}; 

      */

      frameDom.src = 'a.html';

   flag = true;

  }

  //$('#console').append(flag ? '切换到a.html':'切换到b.html');

 });

使用sIEve测试:每切换一次,#leaks增加28左右。

IE下使用jQuery重置iframe地址时内存泄露问题解决办法

写法二:按网传写法

<script>

 var flag = true;

 var frameDom = $('iframe:eq(0)')[0];

 $('button').on('click',function(){

  if(flag){

       var frameDom = $('iframe:eq(0)')[0];

       var frameWin = frameDom.contentWindow;

       try{ 

           frameWin.document.write(''); 

           frameWin.document.clear(); 

       }catch(e){}; 

       frameDom.src = 'b.html';

       flag = false;

  }else{

       var frameDom = $('iframe:eq(0)')[0];

       var frameWin = frameDom.contentWindow;

       try{ 

          frameWin.document.write(''); 

          frameWin.document.clear(); 

       }catch(e){}; 

       frameDom.src = 'a.html';

       flag = true;

  }

  //$('#console').append(flag ? '切换到a.html':'切换到b.html');

 });

</script>

使用sIEve测试:每切换一次,#leaks增加28左右。与写法一并没有什么差别

IE下使用jQuery重置iframe地址时内存泄露问题解决办法

写法三:

var flag = true;

 var frameDom = $('iframe:eq(0)')[0];

 $('button').on('click',function(){

  if(flag){

   /*

   try{ 

    frameDom.contentWindow.document.write(''); 

    frameDom.contentWindow.document.clear(); 

    frameDom.contentWindow.close(); 

      }catch(e){};

      */

      $('iframe:eq(0)').remove();

      $('body').append("<iframe src='b.html'></iframe>");

   flag = false;

  }else{

   /*

   try{ 

    frameDom.contentWindow.document.write(''); 

    frameDom.contentWindow.document.clear(); 

    frameDom.contentWindow.close(); 

      }catch(e){};

      */

      $('iframe:eq(0)').remove();

      $('body').append("<iframe src='a.html'></iframe>");

   flag = true;

  }

 });

使用sIEve测试:#leaks平均为 3,与前两种相差巨大

IE下使用jQuery重置iframe地址时内存泄露问题解决办法

写法四:注意到,写法三中注释了一段代码,去掉注释会怎样?

var flag = true;

 var frameDom = $('iframe:eq(0)')[0];

 $('button').on('click',function(){

  if(flag){

   try{ 

    frameDom.contentWindow.document.write(''); 

    frameDom.contentWindow.document.clear(); 

    frameDom.contentWindow.close(); 

      }catch(e){};

      $('iframe:eq(0)').remove();

      $('body').append("<iframe src='b.html'></iframe>");

   flag = false;

  }else{

   try{ 

    frameDom.contentWindow.document.write(''); 

    frameDom.contentWindow.document.clear(); 

    frameDom.contentWindow.close(); 

      }catch(e){};

      $('iframe:eq(0)').remove();

      $('body').append("<iframe src='a.html'></iframe>");

   flag = true;

  }

 });

IE下使用jQuery重置iframe地址时内存泄露问题解决办法

此写法与写法3并没有明显差别,每次切换#leaks仍然增加3左右

因此可以得出结论,最好的解决重置iframe地址内存泄露办法就是 把它干掉,再添加一个!

网传不一定靠谱啊

注:本机测试环境为 WIN7 x64 IE9

Javascript 相关文章推荐
CSS+JS构建的图片查看器
Jul 22 Javascript
几款极品的javascript压缩混淆工具
May 16 Javascript
jquery isEmptyObject判断是否为空对象的函数
Feb 14 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
May 19 Javascript
JavaScript实现重置表单(reset)的方法
Apr 02 Javascript
JavaScript设置表单上传时文件个数的方法
Aug 11 Javascript
jQuery EasyUI Pagination实现分页的常用方法
May 21 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
Nov 10 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
Jan 06 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
Jul 13 Javascript
jQuery实现弹幕特效
Nov 29 jQuery
vuejs中父子组件之间通信方法实例详解
Jan 17 Javascript
js关于命名空间的函数实例
Feb 05 #Javascript
js实现数字每三位加逗号的方法
Feb 05 #Javascript
javascript实现字符串反转的方法
Feb 05 #Javascript
Javascript中拼接大量字符串的方法
Feb 05 #Javascript
jquery操作select方法汇总
Feb 05 #Javascript
高性能JavaScript模板引擎实现原理详解
Feb 05 #Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 #Javascript
You might like
ZF等常用php框架中存在的问题
2008/01/10 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
php封装一个异常的处理类
2017/06/08 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
tagName的使用,留一笔
2006/06/26 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
2015/03/19 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
实现一个简单的vue无限加载指令方法
2017/01/10 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
vue组件生命周期详解
2017/11/07 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
户外宣传策划方案
2014/05/25 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
党的群众路线教育实践活动总结
2014/10/30 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
MySQL 如何限制一张表的记录数
2021/09/14 MySQL
MySQL数据管理操作示例讲解
2022/12/24 MySQL