JQuery Dialog的内存泄露问题解决方法


Posted in Javascript onJune 18, 2010

对于页面来说,JQuery中的Dialog从效果上来说还可以,而且使用简单,只要短短几行绑定的代码就可以实现弹出效果。
代码

$('#dialog').dialog({ 
autoOpen: false, 
width: 600, 
buttons: { 
"Ok": function() { 
$(this).dialog("close"); 
}, 
"Cancel": function() { 
$(this).dialog("close"); 
} 
} 
});

在一些JS交互性不多的一般页面来说,没有任何问题!但是对于交互性强的,需要动态加载与释放DOM的页面来说,它就是一个悲剧的东西!为什么这样说?大家看下下面的例子:

一段简单的代码,一个DIV是通过动态加载到页面上,然后对该DIV用Dialog进行绑定,以达到弹出的目的!下面的test元素就是<div id="test"></div>。
代码

function TestAppend() { 
$("#test").append('<div id="dialog"><div id="fileQueue"></div> <input type="file" name="uploadify" id="uploadify" />' + 
'<a href="javascript:upload();">上传</a>' + 
'<a href="javascript:$(#uploadify).uploadifyClearQueue()">取消上传</a><div>'); 
$('#dialog').dialog({ 
autoOpen: false, 
width: 600, 
buttons: { 
"Ok": function() { 
$(this).dialog("close"); 
}, 
"Cancel": function() { 
$(this).dialog("close"); 
} 
} 
}); 
return false; 
}

接着,我需要删除该DOM元素,一般来说,正常的做法都是$("#test").empty();这行简单的代码就完成了!这样有效吗?!当执行完这样代码后,你再用$('#dialog')来获取dialog元素,郁闷的事情发生了,既然获取到了!为什么!不是已经empty了吗!

下面我们来看下这一悲剧是如何造成的,

我们把注意点放到$('#dialog').dialog上面,然后看看JQuery的实现代码是如何写的,当我们跟踪代码到dialog类中的_create方法的时候,问题的原因找到了,看下面这段代码:

uiDialog = (self.uiDialog = $('<div></div>')) 
.appendTo(document.body) 
.hide() 
.addClass(uiDialogClasses + options.dialogClass) 
.css({ 
zIndex: options.zIndex 
}) 
// setting tabIndex makes the div focusable 
// setting outline to 0 prevents a border on focus in Mozilla 
.attr('tabIndex', -1).css('outline', 0).keydown(function(event) { 
if (options.closeOnEscape && event.keyCode && 
event.keyCode === $.ui.keyCode.ESCAPE) { 
self.close(event); 
event.preventDefault(); 
} 
}) 
.attr({ 
role: 'dialog', 
'aria-labelledby': titleId 
}) 
.mousedown(function(event) { 
self.moveToTop(false, event); 
}),

它既然也动态创建一个div,而且把该div加到了Body上面,然后把dialog中的元素从<div id=test>中移除,加入到该新的div中.....

这就是为什么我们$("#test").empty()后,却对内部的dialog没有起作用了!而且这有一个最不好的一个地方,也是最容易出现内存泄露的地方:它动态的在Body中创建了一个div,这样如果窗体不关闭的话,而你又在不察觉的情况下不断的使用上面的TestAppend方法来动态加载DOM,就会创建N个这样的div!

其实这个问题郁闷的地方不是在如何解决,而且隐藏的很深,很难发现!那么发现之后解决起来就变的简单多了:

if ($('#dialog')[0]) { 
$('#dialog').parent().empty(); 
$('#dialog').parent().remove(); 
}

当前加上这段后代码后,再做$("#dialog")来测试下,期望的结果终于出现了!dialog元素消失了!
Javascript 相关文章推荐
arguments对象
Nov 20 Javascript
用javascript实现画板的代码
Sep 05 Javascript
picChange 图片切换特效的函数代码
May 06 Javascript
Wordpress ThickBox 点击图片显示下一张图的修改方法
Dec 11 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
Dec 25 Javascript
jQuery技巧总结
Jan 01 Javascript
js实现倒计时(距离结束还有)示例代码
Jul 24 Javascript
jquery实现鼠标滑过小图时显示大图的方法
Jan 14 Javascript
vue几个常用跨域处理方式介绍
Feb 07 Javascript
使用Vuex实现一个笔记应用的方法
Mar 13 Javascript
微信小程序跨页面传递data数据方法解析
Dec 13 Javascript
JavaScript前端面试组合函数
Jun 21 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
Jun 18 #Javascript
jquery ready()的几种实现方法小结
Jun 18 #Javascript
JQuery在光标位置插入内容的实现代码
Jun 18 #Javascript
JavaScript Chart 插件整理
Jun 18 #Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
Jun 18 #Javascript
Javascript下IE与Firefox下的差异兼容写法总结
Jun 18 #Javascript
js打印纸函数代码(递归)
Jun 18 #Javascript
You might like
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
php生成图片缩略图的方法
2015/04/07 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
2018/05/23 PHP
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
微信小程序 scroll-view组件实现列表页实例代码
2016/12/14 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
vue数字类型过滤器的示例代码
2017/09/07 Javascript
JavaScript实现区块链
2018/03/14 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
Python比较两个图片相似度的方法
2015/03/13 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
python与字符编码问题
2019/05/24 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
python开发一款翻译工具
2020/10/10 Python
中国高端家电购物商城:顺电
2018/03/04 全球购物
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
求职信的最佳写作思路
2014/02/01 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏