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 相关文章推荐
JS解决ie6下png透明的方法实例
Aug 02 Javascript
JSON字符串转JSON对象
Jul 31 Javascript
JS实现“隐藏与显示”功能(多种方法)
Nov 24 Javascript
Webpack打包慢问题的完美解决方法
Mar 16 Javascript
node+vue实现用户注册和头像上传的实例代码
Jul 20 Javascript
微信小程序App生命周期详解
Jan 31 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
Jun 04 Javascript
基于Vue实现微信小程序的图文编辑器
Jul 25 Javascript
koa-router源码学习小结
Sep 07 Javascript
Jquery的Ajax技术使用方法
Jan 21 jQuery
Node.js 实现简单的无侵入式缓存框架的方法
Jul 21 Javascript
vscode调试node.js的实现方法
Mar 22 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时的知识积累总结
2013/06/07 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
基于json的jquery地区联动效果代码
2011/07/06 Javascript
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
JS获取时间的方法
2015/01/21 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
vue中$refs的用法及作用详解
2018/04/24 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
2019/08/02 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
js实现圆形菜单选择器
2020/12/03 Javascript
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
关于Python解包知识点总结
2020/05/05 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
详解Python中的Lock和Rlock
2021/01/26 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
学期自我鉴定
2013/11/04 职场文书
班组长岗位职责
2014/03/03 职场文书
霸气队列口号
2014/06/18 职场文书
郭明义电影观后感
2015/06/08 职场文书
贫困生证明范文
2015/06/16 职场文书