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代码混淆综合解决方案-Javascript在线混淆器
Dec 18 Javascript
js下通过getList函数实现分页效果的代码
Sep 17 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
May 08 Javascript
模拟多级复选框效果的jquery代码
Aug 13 Javascript
Extjs grid添加一个图片状态或者按钮的方法
Apr 03 Javascript
jquery通过ajax加载一段文本内容的方法
Jan 15 Javascript
原生js图片轮播效果实现代码
Oct 19 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
May 18 Javascript
利用node.js实现自动生成前端项目组件的方法详解
Jul 12 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
Aug 09 jQuery
Vue加载json文件的方法简单示例
Jan 28 Javascript
实用的Vue开发技巧
May 30 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 Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
php递归创建目录的方法
2015/02/02 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
2017/05/20 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
js函数调用的方式
2014/05/06 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
jQuery过滤选择器经典应用
2016/08/18 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
微信开发 消息推送实现代码
2016/10/21 Javascript
基于BootstrapValidator的Form表单验证(24)
2016/12/12 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
JavaScript省市级联下拉菜单实例
2017/02/14 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
通过Pandas读取大文件的实例
2018/06/07 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
python实现简单颜色识别程序
2020/02/19 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
python从Oracle读取数据生成图表
2020/10/14 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
三月学雷锋活动总结
2014/06/26 职场文书
材料化学专业求职信
2014/07/15 职场文书
村班子对照检查材料
2014/08/18 职场文书
2016新年慰问信范文
2015/03/25 职场文书
同事欢送会致辞
2015/07/31 职场文书
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers