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 相关文章推荐
让新消息在网页标题闪烁提示的jQuery代码
Nov 04 Javascript
jquery、js操作checkbox全选反选
Mar 12 Javascript
点击表单提交时出现jQuery没有权限的解决方法
Jul 23 Javascript
jQuery跨域问题解决方案
Aug 03 Javascript
javascript中substring()、substr()、slice()的区别
Aug 30 Javascript
AngularJS基础 ng-keypress 指令简单示例
Aug 02 Javascript
AngularJS $injector 依赖注入详解
Sep 14 Javascript
Bootstrap CSS布局之代码
Dec 17 Javascript
JavaScript用二分法查找数据的实例代码
Jun 17 Javascript
微信小程序常用简易小函数总结
Feb 01 Javascript
vue实现分页加载效果
Dec 24 Javascript
小程序点餐界面添加购物车左右摆动动画
Sep 23 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函数常用用法小结
2010/02/08 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
Vue插件打包与发布的方法示例
2018/08/20 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
python自动发送测试报告邮件功能的实现
2019/01/22 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
django创建超级用户过程解析
2019/09/18 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
利用CSS3实现文字折纸效果实例代码
2018/07/10 HTML / CSS
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
医学专业毕业生个人的求职信
2013/12/04 职场文书
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
民生工程实施方案
2014/03/22 职场文书
竞选卫生委员演讲稿
2014/04/28 职场文书
护理医院见习报告
2014/11/03 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫