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 广告后加载,加载完页面再加载广告
Nov 25 Javascript
js动画(animate)简单引擎代码示例
Dec 04 Javascript
JS实现模仿微博发布效果实例代码
Dec 16 Javascript
jQuery.event兼容各浏览器的event详细解析
Dec 18 Javascript
Node.js中的模块机制学习笔记
Nov 04 Javascript
Windows系统下安装Node.js的步骤图文详解
Nov 15 Javascript
Node.js中用D3.js的方法示例
Jan 16 Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 Javascript
浅析从vue源码看观察者模式
Jan 29 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
Oct 09 Javascript
vue父子组件的通信方法(实例详解)
Nov 10 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
Mar 20 jQuery
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实现获取图片颜色值的方法
2014/07/11 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
php中addslashes函数与sql防注入
2014/11/17 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
2010/04/25 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
AngularJS改变元素显示状态
2017/04/20 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
详解python中的装饰器
2018/07/10 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
史泰博(Staples)中国官方网站:办公用品一站式采购
2016/09/05 全球购物
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
会计应聘求职信范文
2013/12/17 职场文书
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
学习十八大报告感言
2014/02/28 职场文书
《动手做做看》教学反思
2014/04/09 职场文书
植树节新闻稿
2015/07/17 职场文书
2016年十一促销广告语
2016/01/28 职场文书
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL