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实现计算加载页面所用的时间
Apr 02 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
Sep 29 Javascript
js判断字符是否是汉字的两种方法小结
Jan 03 Javascript
jQuery实现判断滚动条到底部
Jun 23 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
Aug 27 Javascript
React.js中常用的ES6写法总结(推荐)
May 09 Javascript
Angular获取手机验证码实现移动端登录注册功能
May 17 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
Feb 11 Javascript
js DOM的事件常见操作实例详解
Dec 16 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
May 20 Javascript
微信小程序实现简单的select下拉框
Nov 23 Javascript
element tree树形组件回显数据问题解决
Aug 14 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实现统计网站在线人数的方法
2015/05/12 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
一个tab标签切换效果代码
2009/03/27 Javascript
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
小程序分享模块超级详解(推荐)
2019/04/10 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
js面试题之异步问题的深入理解
2020/09/20 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
python获取指定网页上所有超链接的方法
2015/04/04 Python
python numpy格式化打印的实例
2018/05/14 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
2014国培学习感言
2014/03/05 职场文书
意向协议书范本
2014/04/23 职场文书
治超工作实施方案
2014/05/04 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
闪闪的红星观后感
2015/06/08 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
理解python中装饰器的作用
2021/07/21 Python