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 相关文章推荐
在IE中调用javascript打开Excel的代码(downmoon原作)
Apr 02 Javascript
javascript 打印内容方法小结
Nov 04 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 Javascript
自动化测试读写64位操作系统的注册表
Aug 15 Javascript
Bootstrap源码解读排版(1)
Dec 23 Javascript
javascript实现秒表计时器的制作方法
Feb 16 Javascript
关于Javascript中document.cookie的使用
Mar 08 Javascript
angular.js+node.js实现下载图片处理详解
Mar 31 Javascript
关于页面刷新vuex数据消失问题解决方案
Jul 03 Javascript
详解微信小程序中var、let、const用法与区别
Jan 11 Javascript
vue 防止页面加载时看到花括号的解决操作
Nov 09 Javascript
javascript实现倒计时提示框
Mar 02 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
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
php中session定期自动清理的方法
2015/11/12 PHP
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
2013/11/03 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
javascript实现2048游戏示例
2014/05/04 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
python创建文件时去掉非法字符的方法
2018/10/31 Python
详解python列表(list)的使用技巧及高级操作
2019/08/15 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
python openpyxl模块的使用详解
2021/02/25 Python
美国著名的团购网站:Woot
2016/08/02 全球购物
SQL注入攻击的种类有哪些
2013/12/30 面试题
2014年上半年工作自我评价
2014/01/18 职场文书
信访工作经验交流材料
2014/05/23 职场文书
出售房屋委托书范本
2014/09/24 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
公司2015年终工作总结
2015/05/26 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书