解决IE浏览器IFrame对象内存不释放问题

最近项目组发现在使用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>

  

解决IE浏览器IFrame对象内存不释放问题

时间: 2024-11-07 08:44:23

解决IE浏览器IFrame对象内存不释放问题的相关文章

C++基类指针指向的派生类对象内存的释放

C++由于基类指针可以指向不同的派生类对象,因此当赋予基类指针不同的地址时,要注意之前的派生类对象的内存释放. int main(){ Parent* ptr = new Child1; Child2 myChild2; Child3 myChild3; ptr->show(); delete ptr; //位置1 ptr = &myChild2; ptr->show(); delete ptr; //位置2 ptr = &myChild3; ptr->show(); d

Objective-C 【单个对象内存管理】

------------------------------------------- 单个对象内存管理 (1)野指针 ①定义了一个指针变量,但是并没有赋初值,它随机指向一个东西 ②某指针变量指向的内存空间被释放掉了(指向僵尸对象的指针) (2)僵尸对象 已经被销毁的对象(无法被使用的对象) (3)空指针 没有指向存储空间的指针(里面存的是nil,也就是0) 给空指针发消息是没有任何反应的,不会提示出错 代码: #import <Foundation/Foundation.h> @interf

c++对象内存模型之虚析构函数篇(2)

现在讨论第二种情况: (第一种情况传送门,单独一个类,有虚析构函数,虚函数) (2)有继承关系,单一继承,父类无虚析构函数,子类有(子类没有就没必要说了) 这种情况让我相当晕,照例先贴代码 : 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 int ia; 7 public: 8 A ():ia(15) 9 { 10 } 11 ~A () 12 { 13 cout << "~A" &l

iframe动态创建及释放内存

最近参与一个项目的开发,由于项目是基于浏览器的胖客户端(RIA)应用程序,页面中大量调用iframe.后期测试发现浏览器内存一直居高不下,而且打开iframe页面越多内存占用越大,在IE系列浏览器中尤其明显.所有打开的iframe页面即使关闭了,内存使用也没有明显的下降,IE浏览器在内存占用达到400M左右就变得很卡.分析发现是iframe没有释放造成的,于是对所有已关闭的iframe所占用的内存进行释放,虽然不能完全释放,但是iframe内存占用量不会一直增长,整个应用内存使用量控制在150M

iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放?

1.前言 本来以为在改成ARC以后,不再需要考虑内存问题了,可是在实践中还是发现有一些内存问题需要注意,今天我不谈block的循环引用的问题,主要说说一些对象.数组不内存得不到释放的情况. 2.数组内存得不到释放的情况 //组织字典数据 - (NSMutableDictionary *)setupDicData{ NSMutableDictionary *dict = [NSMutableDictionary dictionary]; for (int i = 0; i <= 30; i++)

Objective-C:ARC自动释放对象内存

ARC是cocoa系统帮你完成对象内存释放的引用计数机制 .h文件 1 // Person.h 2 // 01-ARC 3 // 4 // Created by ma c on 15/8/13. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 // 7 8 #import <Foundation/Foundation.h> 9 10 @interface Person : NSObject 11 @property(nonatomi

Unit03 - 对象内存管理 、 继承的意义(上)

Unit03 - 对象内存管理 . 继承的意义(上) 1.内存管理:由JVM来管理的  1)堆:    1.1)存储所有new出来的对象(包含成员变量)    1.2)没有任何引用所指向的对象就是垃圾,        垃圾回收器(GC)不定时清理垃圾,        回收过程是透明的(看不到的),        调用System.gc()建议GC尽快来回收    1.3)成员变量的生命周期:          创建对象时存在堆中,对象被回收时一并被回收    1.4)内存泄露:不再使用的对象没有

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工

【cocos2d-x 3.x 学习笔记】对象内存管理

内存管理 内存管理一直是一个不易处理的问题,开发者必须考虑分配回收的方式和时机,针对堆和栈做不同的优化处理,等等.内存管理的核心是动态分配的对象必须保证在使用完毕后有效地释放内存,即管理对象的生命周期.由于C++是一个较为底层的语言,其设计上不包含任何智能管理内存的机制.一个对象在使用完毕后必须被回收,然而在复杂的程序中,对象所有权在不同程序片段间传递或共享,使得确定回收的时机十分困难,因此内存管理成为了程序员十分头疼的问题. 另一方面,过于零散的对象分配回收可能导致堆中的内存碎片化,降低内存的