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正确获取元素样式详解
Aug 07 Javascript
javascript实现画不相交的圆
Apr 07 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
Nov 30 Javascript
js HTML5 Ajax实现文件上传进度条功能
Feb 13 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
Jun 13 jQuery
vue使用stompjs实现mqtt消息推送通知
Jun 22 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
Aug 03 Javascript
菊花转动的jquery加载动画效果
Aug 19 jQuery
node和vue实现商城用户地址模块
Dec 05 Javascript
详解写好JS条件语句的5条守则
Feb 28 Javascript
vue项目打包后怎样优雅的解决跨域
May 26 Javascript
使用axios请求时,发送formData请求的示例
Oct 29 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
php二维码生成
2015/10/19 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
IE与FireFox中的childNodes区别
2011/10/20 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
boostrap模态框二次弹出清空原有内容的方法
2018/08/10 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
零基础写python爬虫之神器正则表达式
2014/11/06 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
python如何实现excel数据添加到mongodb
2015/07/30 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
利用python list完成最简单的DB连接池方法
2019/08/09 Python
python numpy库np.percentile用法说明
2020/06/08 Python
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
销售员岗位职责范本
2014/02/03 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
公司表扬稿范文
2015/05/05 职场文书
工作服管理制度范本
2015/08/06 职场文书
用Python远程登陆服务器的步骤
2021/04/16 Python
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
Jupyter notebook 更改文件打开的默认路径操作
2021/05/21 Python
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python
Redis集群的关闭与重启操作
2021/07/07 Redis