iframe动态创建及释放内存

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

/**
 * 动态创建iframe
 * @param dom 创建iframe的容器,即在dom中创建iframe。dom可以是div、span或者其他标签。
 * @param src iframe中打开的网页路径
 * @param onload iframe加载完后触发该事件,可以为空
 * @return 返回创建的iframe对象
*/
function createIframe(dom, src, onload){
	//在document中创建iframe
	var iframe = document.createElement("iframe");

	//设置iframe的样式
	iframe.style.width = '100%';
	iframe.style.height = '100%';
	iframe.style.margin = '0';
	iframe.style.padding = '0';
	iframe.style.overflow = 'hidden';
	iframe.style.border = 'none';

	//绑定iframe的onload事件
	if(onload && Object.prototype.toString.call(onload) === '[object Function]'){
		if(iframe.attachEvent){
			iframe.attachEvent('onload', onload);
		}else if(iframe.addEventListener){
			iframe.addEventListener('load', onload);
		}else{
			iframe.onload = onload;
		}
	}

	iframe.src = src;
	//把iframe加载到dom下面
	dom.appendChild(iframe);
	return iframe;
}

/**
 * 销毁iframe,释放iframe所占用的内存。
 * @param iframe 需要销毁的iframe对象
*/
function destroyIframe(iframe){
	//把iframe指向空白页面,这样可以释放大部分内存。
	iframe.src = 'about:blank';
	try{
		iframe.contentWindow.document.write('');
		iframe.contentWindow.document.clear();
	}catch(e){}
	//把iframe从页面移除
	iframe.parentNode.removeChild(iframe);
}
时间: 2024-10-26 15:16:05

iframe动态创建及释放内存的相关文章

不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 对象的动态创建和释放 对象的赋值和复制 静态属性和静态函数 类模板 示例1.CppEmployee 类CppEmployee.h #pragma once #include <string> using namespace std; namespace NativeDll { class CppEmployee { int Number; // 默认为 private private: // 以下都是

指针与变量(或数组)的动态创建与释放

1.变量内存的动态分配(创建)与释放:通过指针,动态间接赋值.取值 指针变量名=new 数据类型(初始值); 初始值可省略,后边再赋值. delete 指针变量名: #include<iostream> using namespace std; int main() { //int *p = new int; *p = 5; int *p = new int(5);//new运算符,动态创建一个int型变量(无变量名),值为5. cout << *p;//输出所指地址的值 dele

DELPHI 动态 创建和释放 多个 EDIT 控件

unit Unit1;   interface   uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls, ExtCtrls;   type   TForm1 = class(TForm)     pnl1: TPanel;     btn1: TButton;     btn2: TButton;     procedure btn1Click(

Delphi动态创建组件,并释放内存

开发所用delphi版本是xe2,效果图如下: 代码如下: ----------------------------------------------------------------------------------------------------------------- unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Class

new和delete创建和释放动态数组

1.动态创建和释放一维数组 #include<iostream> using namespace std; int main() { int n; cin>>n; //分配动态一维数组 int *arr=new int[n]; for(int i=0;i<n;i++) cin>>arr[i]; for(int i=0;i<n;i++) cout<<arr[i]<<" "; //释放arr数组 delete[] ar

C++中new和delete来创建和释放动态数组

在C++编程中,使用new创建数组然后用delete来释放. 一.创建并释放一维数组 #include<iostream> using namespace std; int main() { int n; cin>>n; //分配动态一维数组 int *arr=new int[n]; for(int i=0;i<n;i++) cin>>arr[i]; for(int i=0;i<n;i++) cout<<arr[i]<<"

c++跨动态库DLL的内存分配与释放问题

先说结论: 1.如果两个DLL(或者EXE调用DLL)的CRT链接均为MD,则可以跨动态库分配和释放,如果一个是MT,另外一个是MD则会有问题. 2.利用虚函数的动态绑定技术,动态绑定分配释放内存的new和delete等,可以解决这个问题,例如shared_ptr.但如果shared_ptr包装是vector等类型,在调用和被调用中都涉及到vector的修改的话,仍然会有问题,因为两个地方都会有释放和分配. 似乎最好的办法还是用原始指针加数组长度的方式传递. 参见下面两个文章. 1.跨DLL的内

C++函数中,两个自动释放内存的动态内存申请类

最近做一个事情,实现一个流程交互,其中主交互流程函数中,涉及较多的内存申请, 而健康的函数,都是在函数退出前将手动申请不再需要的内存释放掉, 使用很多方法,都避免不了较多的出错分支时,一堆的if free/delete,代码长而且不好管理 因此,利用C++对象离开作用域会自动调用析构函数的特点,在这儿实现了两个自动释放内存的动态内存申请类 第一个类,只管理内存,不并管理对象 #include <vector> class XAutoFreeMem { protected: std::vecto

内存(堆)的动态申请和释放

两个函数:malloc和free 需要头文件:stdlib.h void *malloc(size_t size); void free(void *ptr); 需要说明的是: 申请: 1).参数是申请内存的字节数. 2).申请的是一块连续的内存. 3).返回值是void *类型,因此,要将他的返回值付给一个指针的时候,一定要类型转换. 释放: 1).参数是要是要释放内存的其实地址. 2).不允许重复的释放. 3).只能释放堆空间. 对链表中有数据有指针的一个节点的情况,在删除一个节点的时候,直