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 相关文章推荐
dwz 如何去掉ajaxloading具体代码
May 22 Javascript
用jquery写的一个万年历(自写)
Jan 20 Javascript
JavaScript 基本概念
Jan 20 Javascript
DOM操作一些常用的属性汇总
Mar 13 Javascript
JavaScript动态加载样式表的方法
Mar 21 Javascript
微信小程序 devtool隐藏的秘密
Jan 21 Javascript
js 开发之autocomplete=&quot;off&quot;在chrom中失效的解决办法
Sep 28 Javascript
基于zepto.js实现登录界面
Oct 09 Javascript
使用vue for时为什么要key【推荐】
Jul 11 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
Aug 03 Javascript
vue + elementUI实现省市县三级联动的方法示例
Oct 29 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
Feb 15 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执行linux系统命令的常用函数使用说明
2010/04/27 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
Extjs在exlipse中设置自动提示的方法
2010/04/07 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
[01:14]3.19DOTA2发布会 三代刀塔人第二代
2014/03/25 DOTA
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
详解Python在七牛云平台的应用(一)
2017/12/05 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
python处理数据,存进hive表的方法
2018/07/04 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
scrapy头部修改的方法详解
2020/12/06 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
彪马美国官网:PUMA美国
2017/03/09 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
老师给学生的表扬信
2014/01/17 职场文书
抄作业检讨书
2014/02/17 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
Go语言中的UTF-8实现
2021/04/26 Golang
vue 自定义组件添加原生事件
2022/04/21 Vue.js