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 相关文章推荐
jquery trim() 功能源代码
Feb 14 Javascript
js获取对象为null的解决方法
Nov 21 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
JS 清除字符串数组中,重复元素的实现方法
May 24 Javascript
JQuery控制DIV的选取实现方法
Sep 18 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
Jun 17 Javascript
JavaScript数组的5种迭代方法
Sep 29 Javascript
详解layui弹窗父子窗口之间传参数的方法
Jan 16 Javascript
vue项目每30秒刷新1次接口的实现方法
Dec 04 Javascript
JS求1到任意数之间的所有质数的方法详解
May 20 Javascript
Vue3 中的数据侦测的实现
Oct 09 Javascript
vue之组件内监控$store中定义变量的变化详解
Nov 08 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
PHP完整的日历类(CLASS)
2006/11/27 PHP
php短域名转换为实际域名函数
2011/01/17 PHP
php数组编码转换示例详解
2014/03/11 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
JavaScript简单表格编辑功能实现方法
2015/04/16 Javascript
判断JS对象是否拥有某属性的方法推荐
2016/05/12 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
使用JavaScript破解web
2018/09/28 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
django删除表重建的实现方法
2019/08/28 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
python opencv进行图像拼接
2020/03/27 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
图书室标语
2014/06/21 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
劳资员岗位职责
2015/02/13 职场文书
如何书写授权委托书?
2019/06/25 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
python对文档中元素删除,替换操作
2022/04/02 Python