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 相关文章推荐
显示、隐藏密码
Jul 01 Javascript
浅谈javascript中for in 和 for each in的区别
Apr 23 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
Jun 09 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
Sep 05 Javascript
easyui messager alert 三秒后自动关闭提示的实例
Nov 07 Javascript
Bootstrap 轮播(Carousel)插件
Dec 26 Javascript
微信小程序 POST请求的实例详解
Sep 29 Javascript
angular6的响应式表单的实现
Oct 10 Javascript
Vuex 使用 v-model 配合 state的方法
Nov 13 Javascript
JS原生瀑布流效果实现
Apr 26 Javascript
vue滚动固定顶部及修改样式的实例代码
May 30 Javascript
django中使用vue.js的要点总结
Jul 07 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判断服务器是否是HTTPS连接
2013/07/05 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
js 替换
2008/02/19 Javascript
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
autoIMG 基于jquery的图片自适应插件代码
2011/03/12 Javascript
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
用js编写留言板
2020/03/17 Javascript
python之DataFrame实现excel合并单元格
2021/02/22 Python
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
Python制作数据预测集成工具(值得收藏)
2020/08/21 Python
EJB3.1都有哪些改进
2012/11/17 面试题
秘书岗位职责
2013/11/18 职场文书
护士辞职信怎么写
2015/02/27 职场文书
六一儿童节园长致辞
2015/07/31 职场文书