日期:2014-05-18  浏览次数:20545 次

求iframe的子页面中使用jquery造成内存泄漏的解决方案
为了将增强用户的体验,我把B/S尽量模拟成C/S的样子,软件中,通过iframe载入一个子页面,来模拟窗口、多页面等,效果可参见:
http://www.oa0578.com/win/
  软件使用了大量js代码,为简化操作,使用了jQuery框架,使用一段时间后,发现内存泄漏还是很严重的,尤其是页面回传后,内存消耗更是直线上升,为此,我通过各种办法防止内存泄漏,但测试结果却发现,导致内存泄漏的罪魁祸首居然是jquery!测试方法如下(很简单的几步,自己不写任何js代码!):

1.新建一个ASP.NET网站,默认已经有一个页面了,名为:default.aspx,我们以此为主页面,即启动页面
2.添加一个新页面,用于嵌入到iframe里面,取名为:child.aspx
3.在主页面(default.aspx)中,添加一个iframe(用于载入子页面child.aspx),如下:
  <iframe style='width:100%;height:500px' src="Child.aspx"></iframe>
4.在子页面(Child.aspx)中,放一个提交按钮,目的是产生页面回传:
  <input type="submit" value="子页面回传" />

  以上几步非常简单,除了在主页面添加一个iframe和在子页面添加一个按钮外,没有任何其他东西,下面开始测试,运行网站后,在s-Ieve中查看,不断点击按钮,s-Ieve显示如下:
 
图中可以看出,每点一次按钮,产生页面回传,基本不增加内存损耗,也不会产生内存泄漏

  接下来,我们在子页面里引入jquery框架,即在<header></header>添加如下引用:
  <script src="jquery_min_1.4.js" type="text/javascript"></script>
  当然jquery必须添加到项目中,这是常识,不再赘述,按上面的办法,同样在s-ieve中查看,点击按钮,我们发现,每次页面回传都会有20个DOM元素丢失,而且都增加内存消耗600-800K:

点“show Leaks”,效果如下:
 
  如果子页面里面有大量其他控件,内存泄漏更加严重,使用时间一长,客户端电脑就跑不动了,在上面的测试中,我们没有任何自己写的代码,泄漏都这么严重,我实在不知道该如何处理,网上搜了N久,也不行,哪位高手能帮我解决?

------解决方案--------------------
ie 有个回收内存的
CollectGarbage(); //清理浏览器内存 

我的CMS 用iframe 模拟tab式的操作界面,一直都没有泄漏问题。
------解决方案--------------------
哎。。 我最近一直为了这事情浪费了很多时间,。,,不知道是不是jQuery的一个bug。。 

上面有朋友说:winxp+ie6,如果jQuery在IE6上使用效果比较好的话, 那么为什么在vs2010上微软会集成jQuery呢?哎、、真怀疑。。微软也不咋地、

还请求各位大哥帮帮忙, 一起找找
------解决方案--------------------
这个应该是jQuery中的BUG吧,我用的时候也常丢失dom,搞的系统出现很诡异的bug,

且这些bug无法定位跟踪,期待高人
------解决方案--------------------
做的挺好的,看不出来有什么问题
------解决方案--------------------
持续关注学习中……