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 02 Javascript
js setTimeout 常见问题小结
Aug 13 Javascript
node.js中的fs.unlinkSync方法使用说明
Dec 15 Javascript
深入理解JS中的substr和substring
Apr 26 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
May 30 Javascript
jQuery原理系列-css选择器的简单实现
Jun 07 Javascript
JavaScript检测原始值、引用值、属性
Jun 20 Javascript
angular和BootStrap3实现购物车功能
Jan 25 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
Aug 14 Javascript
layui 弹出层回调获取弹出层数据的例子
Sep 02 Javascript
在node环境下parse Smarty模板的使用示例代码
Nov 15 Javascript
vuex入门最详细整理
Mar 04 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安全技术之 实现php基本安全
2010/09/04 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
10款实用的PHP开源工具
2015/10/23 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
详解vue.js根据不同环境(正式、测试)打包到不同目录
2018/07/13 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
详解Python3中字符串中的数字提取方法
2017/01/14 Python
Python实现的计算器功能示例
2018/04/26 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
印尼旅游网站:via
2017/11/12 全球购物
波兰购物网站:MALL.PL
2019/05/01 全球购物
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
总经理助理的职责
2014/03/14 职场文书
爱国演讲稿500字
2014/05/04 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
无房证明样本
2015/06/17 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
创业方案:赚钱的烧烤店该怎样做?
2019/07/05 职场文书
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS
P站美图推荐——变身女主角特辑
2022/03/20 日漫