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+Ajax+Json的高效分页实现代码
Oct 29 Javascript
json实现前后台的相互传值详解
Jan 05 Javascript
Javascript动画的实现原理浅析
Mar 02 Javascript
jquery制作图片时钟特效
Mar 30 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
Mar 06 Javascript
学习使用bootstrap3栅格系统
Apr 12 Javascript
js实现div在页面拖动效果
May 04 Javascript
javascript 中的继承实例详解
May 05 Javascript
小程序实现列表删除功能
Oct 30 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 Javascript
ssm+vue前后端分离框架整合实现(附源码)
Jul 08 Javascript
帮你提高开发效率的JavaScript20个技巧
Jun 18 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
apache中为php 设置虚拟目录
2014/12/17 PHP
php按字符无乱码截取中文的方法
2015/03/27 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
javascript中直接写php代码的方法
2013/07/31 Javascript
innerText 使用示例
2014/01/23 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
2017/01/03 Javascript
Javascript设计模式之装饰者模式详解篇
2017/01/17 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
2018/09/18 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
create-react-app中添加less支持的实现
2019/11/15 Javascript
Vue实现Layui的集成方法步骤
2020/04/10 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
Python算法应用实战之栈详解
2017/02/04 Python
python实现ID3决策树算法
2017/12/20 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
解决Python内层for循环如何break出外层的循环的问题
2019/06/24 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
Python Merge函数原理及用法解析
2020/09/16 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
保证书范文大全
2014/04/28 职场文书
新书发布会策划方案
2014/06/09 职场文书
教师职位说明书
2014/07/29 职场文书
教师求职简历自我评价
2015/03/10 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技