IE浏览器IFrame对象内存不释放问题解决方法
2023-06-13 09:15:44 时间
最近项目组发现在使用showModalDialog弹出窗体中如果包含IFrame对象,则IFrame对象占用的内存资源在窗体关闭后不会释放。弹出关闭反复多次后,IE浏览器内存占用可超过数百M,严重时IE浏览器报错,且无法关闭,只能通过杀进程的方式重启浏览器。经测试,使用open方式弹出也存在该问题。
在IE8浏览器中,open和showModalDialog弹出的内存占用有差异:
open方式弹出的窗体占用的是一个独立的iexplorer.exe进程;
showModalDialog方式弹出的窗体使用和父窗体相同的iexplorer.exe进程;
经过搜索,发现解决办法是在窗体关闭前,从窗体中删除IFrame对象,代码如下:
<spanstyle="font-size:18px"> varel=document.getElementById("scanIf"); el.src=""; el.contentWindow.document.write(""); el.contentWindow.document.clear(); varp=el.parentNode; p.removeChild(el); </span>
但是测试的时候,发现有两个限制:
1.el.src可能还没有执行完,就执行后面的语句,如果IFrame中包含的是跨域内容,则会提示没有权限;
2.窗体关闭的比脚本执行的快,内存仍然没有释放;
经过修改,最终脚本如下:
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN"> <HTML><HEAD><TITLE></TITLE> <BODYonbeforeunload="returnunloadHandler();"> <IFRAMEid="scanIf"width="800px"height="600px"src="http://www.baidu.com"></IFRAME> <SCRIPTtype="text/javascript"> functionunloadHandler(notip){ //取消窗口关闭时的监听事件 document.getElementsByTagName("BODY")[0].onbeforeunload=null; varel=document.getElementById("scanIf"); if(el){ el.src=""; setTimeout(cycleClear,100); return"提示:请点击取消按钮,当前窗口会自动关闭。"; } returntrue; } functioncycleClear(){ try{ varel=document.getElementById("scanIf"); if(el){ el.contentWindow.document.write(""); el.contentWindow.document.clear(); varp=el.parentNode; p.removeChild(el); } window.close(); }catch(e){ setTimeout(cycleClear,100); } } //window.onunload=unloadHandler; </SCRIPT> <inputtype="button"value="remove"onclick="unloadHandler();"> </BODY></HTML>
相关文章
- 【说站】Java对象在内存中的结构
- HugePages(大内存页)实现完全解析
- JMM内存模型
- 汇编和内存
- OOM内存溢出原因分析
- Resin内存马逆袭之路
- 什么是内存泄漏?防止内存泄露的方法?
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( Bitmap_compress 方法解析 | Skia 二维图形库 | libjpeg 函数库 | libpng 函数库 )
- MySQL占用内存过大解决方案图文详解
- android内存优化详解手机开发
- 查看Tomcat内存使用情况的JSP代码详解编程语言
- MongoDB:解放内存的好帮手(mongodb释放内存)
- Linux内存控制技巧精选(linux内存控制)
- Node.js中的内存泄漏分析
- Linux 内存管理法 Slab 实现更有效的资源使用(linux slab)
- Linux下快速刷新内存的方法(linux刷新内存)
- Oracle内存最低配置要求分析(oracle内存最低要求)
- 优化Oracle系统内存占用率的方法研究(oracle 内存占用率)
- 分析Oracle数据库的内存与交换空间(oracle内存swap)
- 16G内存安装Oracle,性能有多大提升(16g内存装oracle)
- 使用探究Redis内存利用的技巧(如何看redis里的内存)
- w3wp.exe进程占用内存过高解决方法
- 基于.NETBitmapImage内存释放问题的解决方法详解
- iOS内存错误EXC_BAD_ACCESS的解决方法
- jvm内存溢出解决方法(jvm内存溢出怎么解决)
- tomcat6.0/7.0安装版内存溢出设置方法
- asp.net中C#实现手动回收内存的方法
- VB读取线程、句柄及写入内存的API代码实例
- PHP脚本内存泄露导致Apache频繁宕机解决方法