天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

JQuery Dialog的內(nèi)存泄露問題解決方法

對于頁面來說,JQuery中的Dialog從效果上來說還可以,而且使用簡單,只要短短幾行綁定的代碼就可以實現(xiàn)彈出效果。
代碼
復制代碼 代碼如下:
$('#dialog').dialog({
autoOpen: false,
width: 600,
buttons: {
"Ok": function() {
$(this).dialog("close");
},
"Cancel": function() {
$(this).dialog("close");
}
}
});

在一些JS交互性不多的一般頁面來說,沒有任何問題!但是對于交互性強的,需要動態(tài)加載與釋放DOM的頁面來說,它就是一個悲劇的東西!為什么這樣說?大家看下下面的例子:
  一段簡單的代碼,一個DIV是通過動態(tài)加載到頁面上,然后對該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();這行簡單的代碼就完成了!這樣有效嗎?!當執(zhí)行完這樣代碼后,你再用$('#dialog')來獲取dialog元素,郁悶的事情發(fā)生了,既然獲取到了!為什么!不是已經(jīng)empty了嗎!
  下面我們來看下這一悲劇是如何造成的,
  我們把注意點放到$('#dialog').dialog上面,然后看看JQuery的實現(xiàn)代碼是如何寫的,當我們跟蹤代碼到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);
}),

  它既然也動態(tài)創(chuàng)建一個div,而且把該div加到了Body上面,然后把dialog中的元素從<div id=test>中移除,加入到該新的div中.....
  這就是為什么我們$("#test").empty()后,卻對內(nèi)部的dialog沒有起作用了!而且這有一個最不好的一個地方,也是最容易出現(xiàn)內(nèi)存泄露的地方:它動態(tài)的在Body中創(chuàng)建了一個div,這樣如果窗體不關閉的話,而你又在不察覺的情況下不斷的使用上面的TestAppend方法來動態(tài)加載DOM,就會創(chuàng)建N個這樣的div!
  其實這個問題郁悶的地方不是在如何解決,而且隱藏的很深,很難發(fā)現(xiàn)!那么發(fā)現(xiàn)之后解決起來就變的簡單多了:
復制代碼 代碼如下:
if ($('#dialog')[0]) {
$('#dialog').parent().empty();
$('#dialog').parent().remove();
}

當前加上這段后代碼后,再做$("#dialog")來測試下,期望的結果終于出現(xiàn)了!dialog元素消失了!

JavaScript技術JQuery Dialog的內(nèi)存泄露問題解決方法,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: yy8090理论三级在线看 | 一边捏奶头一边啪高潮会怎么样 | 十九岁韩国电影在线观看 | 亚洲婷婷天堂综合国产剧情 | 久草热8精品视频在线观看 久草青青在线 | 999zyz色资源站在线观看 | ava云直播| 国产精品爽爽久久久久久蜜桃网站 | 亚洲国产精品自在自线观看 | 久久久久久久久女黄9999 | 午夜片无码区在线观看 | 国产精品69人妻无码久久久 | 日日日夜夜在线视频 | 一个人免费完整在线观看影院 | yellow在线观看免费高清的日本 | 日本高清免费观看 | 国产av在线播放 | 99久久精品免费精品国产 | 亚洲AV无码乱码在线观看浪潮 | 国产午夜精品理论片影院 | 国产永久免费观看视频软件 | chinesedaddy80老年人 | 久久中文骚妇内射 | 久久合 | 国产成人精品久久久久婷婷 | 大香网伊人久久综合观看 | 中文字幕欧美日韩VA免费视频 | 中文字幕一区二区三区在线观看 | 正在播放国产精品 | 久久国产乱子伦精品免费不卡 | 精品久久99麻豆蜜桃666 | 女侠含泪巨臀迎合79 | 日本阿v在线资源无码免费 日本阿v片在线播放免费 | 亞洲人妻AV無碼在線視頻 | 亚洲综合香蕉在线视频 | 国产精品嫩草影院 | 俄罗斯性孕妇孕交 | 在线亚洲色拍偷拍在线视频 | 性色爽爱性色爽爱网站 | 日韩视频中文在线一区 | 麻豆高清区在线 |