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 相关文章推荐
JavaScript 创建对象和构造类实现代码
Jul 30 Javascript
jQuery Tools Dateinput使用介绍
Jul 14 Javascript
jquery 插件学习(一)
Aug 06 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
Jan 08 Javascript
javascript 表格内容排序 简单操作示例代码
Jan 03 Javascript
avalon js实现仿微博拖动图片排序
Aug 14 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
Jun 08 Javascript
基于JavaScript实现瀑布流效果
Mar 29 Javascript
vue组件发布到npm简单步骤
Nov 30 Javascript
layui多iframe页面控制定时器运行的方法
Sep 05 Javascript
js实现页面导航层级指示效果
Aug 25 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
Oct 28 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数据过滤的方法
2013/10/30 PHP
php不用正则验证真假身份证
2013/11/06 PHP
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
php中memcache 基本操作实例
2015/05/17 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
PHP实现获取并生成数据库字典的方法
2016/05/04 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
javascript 进度条 实现代码
2009/07/30 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
ie浏览器使用js导出网页到excel并打印
2014/03/11 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
python求列表交集的方法汇总
2014/11/10 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
工厂保安员岗位职责
2014/01/31 职场文书
《争吵》教学反思
2014/02/15 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
刑事附带民事代理词
2015/05/25 职场文书
毕业感言怎么写
2015/07/31 职场文书
靠谱准确的求职信
2019/04/02 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python