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 相关文章推荐
createElement与createDocumentFragment的点点区别小结
Dec 19 Javascript
利用了jquery的ajax实现二级联互动菜单
Dec 02 Javascript
javascript中验证大写字母、数字和中文
Jan 15 Javascript
简单学习JavaScript中的for语句循环结构
Nov 10 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
Apr 17 Javascript
基于Turn.js 实现翻书效果实例解析
Jun 20 Javascript
js将滚动条滚动到指定位置的简单实现方法
Jun 25 Javascript
使用bat打开多个cmd窗口执行gulp、node
Feb 17 Javascript
js, jQuery实现全选、反选功能
Mar 08 Javascript
微信小程序实现下拉菜单切换效果
Mar 30 Javascript
node.js使用express框架进行文件上传详解
Mar 03 Javascript
ElementUI多个子组件表单的校验管理实现
Nov 07 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定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
图解JavaScript中的this关键字
2020/05/28 Javascript
超实用的JavaScript表单代码段
2016/02/26 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
2018/01/04 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
详解JS数值Number类型
2018/02/07 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
python list转dict示例分享
2014/01/28 Python
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
python字典快速保存于读取的方法
2018/03/23 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
pandas如何处理缺失值
2019/07/31 Python
python实现人机五子棋
2020/03/25 Python
python3 sleep 延时秒 毫秒实例
2020/05/04 Python
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
美国现代家具购物网站:LexMod
2019/01/09 全球购物
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
护士自荐信怎么写
2013/10/18 职场文书
护士自我评价
2014/02/01 职场文书
函授自我鉴定范文
2014/02/06 职场文书
小学教师寄语大全
2014/04/03 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android