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 相关文章推荐
游戏人文件夹程序 ver 3.0
Jul 14 Javascript
对字符串进行HTML编码和解码的JavaScript函数
Feb 01 Javascript
js全屏显示显示代码的三种方法
Nov 11 Javascript
javascript面向对象程序设计(一)
Jan 29 Javascript
jQuery多级联动下拉插件chained用法示例
Aug 20 Javascript
JavaScript 中Date对象的格式化代码方法汇总
Sep 06 Javascript
元素全屏的设置与监听实例
Nov 28 Javascript
详解vue 数据传递的方法
Apr 19 Javascript
C#程序员入门学习微信小程序的笔记
Mar 05 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
Mar 15 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 Javascript
小程序分享链接onShareAppMessage的具体用法
May 22 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面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
PHP 引用文件技巧
2010/03/02 PHP
php产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
php使用GD创建保持宽高比缩略图的方法
2015/04/17 PHP
THINKPHP在添加数据的时候获取主键id的值方法
2017/04/03 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
关于JavaScript的一些看法
2009/05/27 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
2013/12/23 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
实现js保留小数点后N位的代码
2014/11/13 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
利用node.js实现自动生成前端项目组件的方法详解
2017/07/12 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python 接收处理外带的参数方法
2018/12/03 Python
python中的django是做什么的
2020/07/31 Python
企业为何需要商业计划书
2013/12/26 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
期中考试反思800字
2014/05/01 职场文书
环保倡议书怎么写
2014/05/16 职场文书
教师三严三实心得体会
2014/10/11 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
2015年教师节活动总结
2015/03/20 职场文书
百年孤独读书笔记
2015/06/29 职场文书
2016国庆促销广告语
2016/01/28 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书