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 相关文章推荐
myFocus slide3D v1.1.0 使用方法与下载
Jan 12 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
Feb 23 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
Nov 25 Javascript
JavaScript中的console.trace()函数介绍
Dec 29 Javascript
jQuery树形下拉菜单特效代码分享
Aug 15 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
Mar 08 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
Jul 13 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
Sep 21 Javascript
VsCode与Node.js知识点详解
Sep 05 Javascript
vue路由切换之淡入淡出的简单实现
Oct 31 Javascript
vue页面引入three.js实现3d动画场景操作
Aug 10 Javascript
JavaScript实现表单验证功能
Dec 09 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
JSON 和 JavaScript eval使用说明
2010/06/13 Javascript
javascript forEach通用循环遍历方法
2010/10/11 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
Python中暂存上传图片的方法
2015/02/18 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
2019/06/27 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
基于HTML5 WebGL的3D机房的示例
2018/03/16 HTML / CSS
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
2014年元旦感言
2014/03/06 职场文书
电台编导求职信
2014/05/06 职场文书
优秀求职信
2014/05/29 职场文书
2014年电话客服工作总结
2014/12/09 职场文书
一般纳税人申请报告
2015/05/18 职场文书
小学运动会开幕词
2016/03/04 职场文书
优秀员工演讲稿
2019/06/21 职场文书
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript
Redis中一个String类型引发的惨案
2021/07/25 Redis
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server