IE浏览器IFrame对象内存不释放问题解决方法


Posted in Javascript onAugust 22, 2014

最近项目组发现在使用showModalDialog弹出窗体中如果包含IFrame对象,则IFrame对象占用的内存资源在窗体关闭后不会释放。弹出关闭反复多次后,IE浏览器内存占用可超过数百M,严重时IE浏览器报错,且无法关闭,只能通过杀进程的方式重启浏览器。经测试,使用open方式弹出也存在该问题。

在IE8浏览器中,open和showModalDialog弹出的内存占用有差异:

open方式弹出的窗体占用的是一个独立的iexplorer.exe进程;

showModalDialog方式弹出的窗体使用和父窗体相同的iexplorer.exe进程;

经过搜索,发现解决办法是在窗体关闭前,从窗体中删除IFrame对象,代码如下:

<span style="font-size:18px">
var el = document.getElementById("scanIf");
el.src="";
el.contentWindow.document.write('');
el.contentWindow.document.clear();
var p = el.parentNode;
p.removeChild(el);
</span>

但是测试的时候,发现有两个限制:

1. el.src可能还没有执行完,就执行后面的语句,如果IFrame中包含的是跨域内容,则会提示没有权限;

2. 窗体关闭的比脚本执行的快,内存仍然没有释放;

经过修改,最终脚本如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE></TITLE>
<BODY onbeforeunload="return unloadHandler();">
<IFRAME id="scanIf" width="800px" height="600px" src = "http://www.baidu.com"></IFRAME>
<SCRIPT type="text/javascript">
function unloadHandler(notip) {
// 取消窗口关闭时的监听事件
document.getElementsByTagName("BODY")[0].onbeforeunload = null;
var el = document.getElementById("scanIf");
if (el) {
el.src = "";
setTimeout(cycleClear, 100);
return "提示:请点击取消按钮,当前窗口会自动关闭。";
}
return true;
}

function cycleClear() {
try {
var el = document.getElementById("scanIf");
if (el) {
el.contentWindow.document.write('');
el.contentWindow.document.clear();
var p = el.parentNode;
p.removeChild(el);
}
window.close();
} catch (e) {
setTimeout(cycleClear, 100);
}
}
//window.onunload = unloadHandler;
</SCRIPT>
<input type="button" value="remove" onclick="unloadHandler();">
</BODY></HTML>
Javascript 相关文章推荐
JS实现淘宝幻灯片效果的实现方法
Mar 22 Javascript
js调用css属性写法
Sep 21 Javascript
IE中getElementsByName()对有些元素无效的解决方案
Sep 28 Javascript
jquery实现左右滑动菜单效果代码
Aug 27 Javascript
JavaScript操作HTML DOM节点的基础教程
Mar 11 Javascript
jquery自适应布局的简单实例
May 28 Javascript
原生js实现放大镜
Feb 20 Javascript
axios学习教程全攻略
Mar 26 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
Mar 06 Javascript
javascript实现自由编辑图片代码详解
Jun 21 Javascript
vue+axios实现post文件下载
Sep 25 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
May 09 Javascript
js中实现多态采用和继承类似的方法
Aug 22 #Javascript
js中运算符&amp;&amp; 和 || 的使用记录
Aug 21 #Javascript
字段太多jquey快速清空表单内容方法
Aug 21 #Javascript
jQuery .tmpl() 用法示例介绍
Aug 21 #Javascript
jQuery控制TR显示隐藏的三种常用方法
Aug 21 #Javascript
jQuery截取指定长度字符串代码
Aug 21 #Javascript
jquery实现的下拉和收缩效果示例
Aug 21 #Javascript
You might like
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
2015/10/16 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
python中将字典转换成其json字符串
2014/07/16 Python
总结Python编程中三条常用的技巧
2015/05/11 Python
Python中用max()方法求最大值的介绍
2015/05/15 Python
Python根据区号生成手机号码的方法
2015/07/08 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
Python如何用filter函数筛选数据
2020/03/05 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
2020/04/28 Python
打印tensorflow恢复模型中所有变量与操作节点方式
2020/05/26 Python
Europcar英国:英国汽车和货车租赁
2017/01/21 全球购物
PAUL HEWITT手表美国站:德国北部时尚生活配饰品牌,船锚元素
2017/11/18 全球购物
俄罗斯马克西多姆家居用品网上商店:Максидом
2020/02/06 全球购物
申论倡议书范文
2014/05/13 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
2015年党小组工作总结
2015/05/26 职场文书
生死牛玉儒观后感
2015/06/11 职场文书