0 0

动态创建iframe导致内存不足20

我现在想做一个效果,就是主页里面嵌套一个iframe,根据左边的菜单栏选择的内容不同,iframe内的页面随之改变,现在采用的方式是点击一个菜单,然后动态创建一个iframe,加载一个jsp页面,然后点击另一个菜单加载另一个页面,为了提高速度,采用
了动态创建和动态销毁iframe的方式,这样却导致了ie最后内存泄露

//创建
 var iframe = document.createElement("iframe"); 
iframe.src = pageURL; 
document.getElementById("contentDiv").appendChild(iframe);

 //销毁 tempFrame.src = blankPageURL; 
tempFrame.contentWindow.document.write(''); 
tempFrame.contentWindow.document.clear(); 
tempFrame.contentWindow.close(); 
document.getElementById('contentDiv').removeChild(tempFrame); 
tempFrame = null;
 CollectGarbage();

   

请问有什么好的解决方法或者其他的方案来实现???

今天又尝试了直接在html中使用iframe,然后动态通过iframe.src来改变页面的方式,又出现了另一个问题:点击一次可以加载出来,再点击一次又加载不出来了,然后再点击又可以加载出来,请问这是为什么????

问题补充:
qiankun 写道
直接改变iframe的src就可以了,创建销毁比较麻烦

我写了个简单的例子是可以直接改变的,但是应用到项目里出现的情况就是:点击一次可以加载出来,再点击一次又加载不出来了,然后再点击又可以加载出来

问题补充:
xiaod0510 写道
若菜单项不多的话可以每个菜单项对应一个iframe,第一次点击菜单项是新建iframe,点击其他菜单时隐藏此iframe(display:none),再次点击此菜单项的话显示此iframe,若需刷新只需重新给iframe.src属性赋值即可,至于你说的那个“点击一次可以加载出来,再点击一次又加载不出来了,然后再点击又可以加载出来”是不是缓存的事儿 ,若是的话可以增加随机数处理。

试过了,确实还是不行呢,而且我的菜单项算是比较多的,这个论坛就是比csdn给力,很快就有了答复

问题补充:
lyndon.lin 写道
IFRAME销毁是无法全部释放内存,所以最好不用IFRAME。如果确实要用IFRAME就使用你的第2种方式,尽量减少创建IFRAME。
建议使用iframe.contentWindow.location.replace(url)这个没有history或者
iframe.contentWindow.location = url.这个有history.

感谢你的回答,不过貌似还是不行

问题补充:
gotta521 写道
你可以尝试使用Sitemesh框架的渲染术,可以实现你需要的功能,网上相关资料很多,当然如果需要我这里也有。

你好,请问一下有类似的demo参考一下吗

问题补充:
liulijun.cn.2011 写道
用ajax,jquery.load()方法都可以实现你的要求。
把你本来想创建的iframe换成DIV。然后点击菜单的时候,调用ajax或者.load,调用后台,返回数据之后,直接填充到DIV里即可。
后台返回可以直接指向一个JSP画面。那2个方法可以直接取到填充完数据的HTML代码。
$.post("www.baidu.com", null, function(result) {
$("#div").html(result);
})

这个方法我也试过,但是有一点,这个方法返回来的其实只是那个页面的一个字符串而已,里面的js代码那样就执行不了了

问题补充:第二个问题已经解决了,是我iframe里面加载页面的问题,和iframe没有关系

问题补充:
dingdang_j 写道
iframe在IE6下有内存泄漏,我解决IE6是这样,但这样还是会有些内存泄漏,但没不处理严重
/**
* 跳转URL并回收资源
*/
function gotoUrl( id, url ) {
var el = document.getElementById( id ), iframe = el.contentWindow;
if( el ) {
if( $.browser.msie ) {
el.src = 'about:blank';
try {
iframe.document.write( '' );
iframe.close();
} catch( e ) {
}
}
el.src = url;
}
}

这些我都处理了阿,确实iframe内存泄露的问题无法避免阿

问题补充:
nycas 写道
<iframe name="myiframe" name="myiframe"></iframe>

<a href="" target="myiframe">menu</a>

这种方式是不是还是没有脱离使用iframe呢?内存能够得到解决吗?

问题补充:我发现当我打开一个模态对话框之后再关闭,IE的内存还是处于上升趋势,网上查了一下资料发现模态对话框不会导致内存增加的,这是怎么回事呢????
2012年5月15日 19:13

13个答案 按时间排序 按投票排序

0 0

采纳的答案

IFRAME销毁是无法全部释放内存,所以最好不用IFRAME。如果确实要用IFRAME就使用你的第2种方式,尽量减少创建IFRAME。
建议使用iframe.contentWindow.location.replace(url)这个没有history或者
iframe.contentWindow.location = url.这个有history.

2012年5月16日 09:38
0 0

iframe不推荐使用。你要实现的功能,用ajax实现不可以吗。

2012年5月28日 14:15
0 0

<iframe name="myiframe" name="myiframe"></iframe>

<a href="" target="myiframe">menu</a>

2012年5月24日 18:23
0 0

iframe在IE6下有内存泄漏,我解决IE6是这样,但这样还是会有些内存泄漏,但没不处理严重
/**
* 跳转URL并回收资源
*/
function gotoUrl( id, url ) {
var el = document.getElementById( id ), iframe = el.contentWindow;
if( el ) {
if( $.browser.msie ) {
el.src = 'about:blank';
try {
iframe.document.write( '' );
iframe.close();
} catch( e ) {
}
}
el.src = url;
}
}

2012年5月24日 16:10
0 0

Jquery有很多tab插件就能够实现这个功能。

2012年5月23日 13:56
0 0

为什么要动态创建呢。直接改变iframe的src不更好

document.getElementById("myfirame").src=url

2012年5月21日 16:47
0 0

其实很简单。利用<a href = "*.jsp" target="iframeName">链接</a>

把菜单链接的target设置为iframe的name对应值就OK了

2012年5月20日 19:10
0 0

引用
这个方法我也试过,但是有一点,这个方法返回来的其实只是那个页面的一个字符串而已,里面的js代码那样就执行不了了

用jquery.load的话。返回的画面跟普通的jsp一样。可以直接在里面用<script....>标签。
而且也可以正常执行。

2012年5月18日 21:47
0 0

引用
这个方法我也试过,但是有一点,这个方法返回来的其实只是那个页面的一个字符串而已,里面的js代码那样就执行不了了

里面的JS代码都是在父画面加载的时候全部加载进去的。。。。
我给你说这个方法。都是我自己都曾经用过的。不是随口瞎说的。。。
你参照DWZ框架的设计原理就行了

2012年5月18日 21:44
0 0

用ajax,jquery.load()方法都可以实现你的要求。
把你本来想创建的iframe换成DIV。然后点击菜单的时候,调用ajax或者.load,调用后台,返回数据之后,直接填充到DIV里即可。
后台返回可以直接指向一个JSP画面。那2个方法可以直接取到填充完数据的HTML代码。
$.post("www.baidu.com", null, function(result) {
$("#div").html(result);
})

2012年5月18日 09:54
0 0

你可以尝试使用Sitemesh框架的渲染术,可以实现你需要的功能,网上相关资料很多,当然如果需要我这里也有。

2012年5月17日 14:34
0 0

直接改变iframe的src就可以了,创建销毁比较麻烦

2012年5月16日 13:26
0 0

若菜单项不多的话可以每个菜单项对应一个iframe,第一次点击菜单项是新建iframe,点击其他菜单时隐藏此iframe(display:none),再次点击此菜单项的话显示此iframe,若需刷新只需重新给iframe.src属性赋值即可,至于你说的那个“点击一次可以加载出来,再点击一次又加载不出来了,然后再点击又可以加载出来”是不是缓存的事儿 ,若是的话可以增加随机数处理。

2012年5月16日 11:12

相关推荐

    Iframe内存泄露分析

    1. 在离开 iframe 里的页面之前,删除所有的事件绑定和动态创建的 DOM。 2. 刷新 iframe 内容之前,调用 iframe.contentWindow.document.write(''); iframe.contentWindow.document.close(); 强制释放 iframe 里的...

    iframe如何动态创建及释放其所占内存

    本文将探讨如何动态创建`iframe`以及如何有效地释放其占用的内存。 首先,我们来看如何动态创建`iframe`。动态创建`iframe`的方法通常是通过JavaScript来完成的,这样可以在需要时创建,不需要时销毁,以减少不必要...

    通过JavaScript+IFRAME实现页面分屏加载

    - **动态创建IFRAME**:使用 `document.createElement('iframe')` 创建IFRAME,并设置其属性。 - **插入IFRAME**:将IFRAME插入到DOM的适当位置,例如 `document.body.appendChild(iframe)`。 - **设置IFRAME源**:...

    vue 页面tabs切换,替换iframe

    在Vue.js应用中,开发人员经常需要实现动态的页面切换效果,例如在多个Tab之间进行导航。在这种场景下,原始的iframe技术可能会显得过时,因为它通常不支持单页应用(SPA)的特性,如路由管理和组件状态管理。标题...

    什么是内联框架(iframe)?.pdf

    - **性能问题**:每个iframe都需要额外的内存和处理器资源,大量使用可能导致页面加载速度变慢。 - **第三方内容控制**:由于iframe的内容可能来自外部源,所以对内容的质量和安全性难以完全掌控。 - **响应式设计...

    iframe的src设置为about:blank之后细节探讨

    3. **IE6 的内存问题**:在 Internet Explorer 6 (IE6) 这个古老的浏览器中,动态创建的 `iframe` 会消耗一定的内存,即使在设置 `src` 为 `about:blank` 并清除内容后,仍然会有大约 500-1000K 的内存残留。...

    Vue中对iframe实现keep alive无刷新的方法

    即使你保存了iframe节点的信息,在需要渲染时,iframe页面还是会作为一个新的窗口打开,导致内容刷新。 针对这一问题,我们可以考虑采用以下策略: 1. 使用Vue路由进行页面切换时,对于非iframe页面,正常使用`...

    javascript浮动div,可拖拽div,遮罩层(div和iframe实现)

    1. **使用 Div 实现**:创建一个全屏覆盖的黑色半透明 Div 作为遮罩层,设置 `z-index` 属性确保遮罩层位于其他元素之上。 2. **使用 Iframe 实现**:如果需要支持跨域内容的加载,可以使用 Iframe 来构建遮罩层。...

    jQuery实现的简单网页打印功能插件printPage(通过隐藏的iframe实现).zip

    5. **清理**:打印操作完成后,插件可能会删除那个临时创建的iframe,以减少内存占用和避免不必要的副作用。 在实际使用"printPage"插件时,开发者需要确保以下几点: - **兼容性**:虽然jQuery库本身有良好的...

    JS 框架 设计

    4. **性能优化**:合理使用iframe,避免过多的iframe导致的性能问题,比如内存占用过大、渲染延迟等。 四、模块化与组件化 现代JavaScript框架往往采用模块化和组件化的思想。模块化使得代码组织清晰,易于复用和...

    ajax无刷新上传图片

    1. 创建IFrame:在HTML中创建一个隐藏的IFrame元素,用于承载文件上传的表单提交结果。 2. 构建表单:创建一个动态的HTML表单,将图片文件添加到表单的input[type="file"]元素中,并设置表单的target属性为IFrame的...

    DETACH-WITHIN-FRAME

    通过理解和应用"DETACH-WITHIN-FRAME"策略,开发者可以创建更健壮、性能更佳的Web应用程序,同时避免因内存泄漏导致的用户体验下降。在实际开发中,结合最佳实践和适当的工具,我们可以确保JavaScript代码高效且无...

    JS面试.pdf

    闭包的主要好处是可以保持变量的状态,创建私有变量和方法,但过度使用可能导致内存消耗增加,甚至引发内存泄漏。 3. **this的指向** `this`在JavaScript中总是指向函数的直接调用者。当使用`new`关键字创建对象时...

    浅谈Vue页面级缓存解决方案feb-alive (下)

    总的来说,`feb-alive` 是为了弥补 `keep-alive` 在处理页面级缓存上的不足,它提供了一种更优雅的方式来管理页面切换时的状态,特别是在动态路由场景下。通过利用 `history.state`,`feb-alive` 可以在不改变URL的...

    ueditor通过js动态添加,移除编辑器

    - 动态添加ueditor时,需确保ueditor的所有相关资源已正确加载,否则可能导致初始化失败。 总结,ueditor通过JavaScript动态添加和移除是一项实用的技术,它可以提高网页的灵活性和用户体验。在实际开发中,结合...

    infinitely-nested-iframes:入会

    - 无限嵌套iFrame可能导致浏览器性能急剧下降,因为每个iFrame都会占用资源,包括内存和CPU。因此,在实际应用中,谨慎使用嵌套iFrame,尤其是在多个层级的情况下。 - 同源策略是浏览器的一个安全机制,它限制了不...

    收集记录一些使用Javascript,JQuery时遇到的问题

    4. **闭包**:JavaScript的闭包是函数可以访问并操作其外部作用域变量的特性,常用于实现私有变量、记忆化等功能,但不当使用可能导致内存泄漏。 5. **异步编程**:JavaScript是单线程的,因此处理耗时操作(如网络...

    ExtAspNet_v2.3.2_dll

    +修正动态创建Grid列的BUG(feedback:gxpan)。 -增加示例(data/grid_dynamic_columns.aspx)。 -修正Form不能自适应浏览器大小的改变(feedback:kaywood)(WorkItem#6309)。 -增加重载方法Alert.Show(message, ...

    javascript 实例应用

    1. JSONP:通过动态创建script标签实现跨域请求。 2. CORS:跨源资源共享,服务器设置特定响应头允许跨域请求。 3. postMessage:窗口、iframe间的跨域通信工具。 八、JavaScript安全 1. 防止XSS攻击:对用户输入...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    +修正动态创建Grid列的BUG(feedback:gxpan)。 -增加示例(data/grid_dynamic_columns.aspx)。 -修正Form不能自适应浏览器大小的改变(feedback:kaywood)(WorkItem#6309)。 -增加重载方法Alert.Show(message, ...

Global site tag (gtag.js) - Google Analytics