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 年月日联动实现核心代码
Dec 21 Javascript
JS实现商品倒计时实现代码
May 03 Javascript
JS 实现导航栏悬停效果(续)
Sep 24 Javascript
JS获取url链接字符串 location.href
Dec 23 Javascript
JS 删除字符串最后一个字符的实现代码
Feb 20 Javascript
页面刷新时记住滚动条的位置jquery代码
Jun 17 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
Mar 04 Javascript
JavaScript+HTML5实现的日期比较功能示例
Jul 12 Javascript
Vue.js样式动态绑定实现小结
Jan 24 Javascript
原生JS 实现的input输入时表格过滤操作示例
Aug 03 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
Aug 28 Javascript
Vue实现push数组并删除的例子
Nov 01 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
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
很实用的一个完整email发送程序
2006/10/09 PHP
php 信息采集程序代码
2009/03/17 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
JavaScript 的方法重载效果
2009/08/07 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
jQuery对Select的操作大集合(收藏)
2013/12/28 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
2015/11/21 Javascript
node.js实现快速截图
2016/08/27 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
mocha的时序规则讲解
2019/02/16 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
Fetch超时设置与终止请求详解
2019/05/18 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
Django URL传递参数的方法总结
2016/08/28 Python
Python生成随机密码的方法
2017/06/16 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
python代码xml转txt实例
2020/03/10 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
优秀团支部事迹材料
2014/02/08 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
商铺租赁意向书
2014/04/01 职场文书
表扬稿范文
2015/01/17 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
老员工辞职信范文
2015/05/12 职场文书
2016猴年春节问候语
2015/11/11 职场文书