【发布时间】:2010-01-19 16:38:14
【问题描述】:
我正在使用 IE7 和一些 jQuery 对话框,每个打开的对话框都会出现大约 6meg 的泄漏。我假设它与闭包有关,但到目前为止,我为移除它们所做的一切都没有帮助。在这一点上,我认为我已经处理了所有的闭包,除了我传入的回调函数,但即使在对话框关闭和删除后它仍然泄漏 6 兆。相关源码为:
function DialogDestroyAndRemove(event) {
$(event.target).dialog("destroy").remove();
}
function CallbackAndCloseDialog(event) {
if (event.data.callback != undefined) {
event.data.callback(event.data.callbackResponse);
}
$("#" + event.data.dialogId).unbind('dialogbeforeclose').dialog('close');
}
// alert dialog modal with ok button
function AlertDialog(dialogTitle, dialogText, callbackFunction) {
// dynamically generate and add a div so we can create the pop-up
$('body').append("<div id=\"alertDialog\" style=\"display:none;\" title=\"" + dialogTitle + "\">" + dialogText + "</div>");
// define/configure the modal pop-up
$("#alertDialog").dialog({
draggable: false,
resizable: false,
modal: true,
autoOpen: true,
open: function() {
$("#alertDialog").parents('.ui-dialog-buttonpane button:eq(0)')
.focus() //focus so the button is highlighted by default
.bind('click', {
callback: callbackFunction,
callbackResponse: 'OK',
dialogId: 'alertDialog'
}, CallbackAndCloseDialog);
},
overlay: { backgroundColor: '#000', opacity: 0.5 },
buttons: { 'OK': function() { } }
}).bind('dialogbeforeclose', function(event, ui) {
// Close (X) button was clicked; NOT the OK button
if (callbackFunction != undefined) {
callbackFunction('cancel');
}
callbackFunction = null;
}).bind('dialogclose', DialogDestroyAndRemove);
}
我在上面做的一件事是我不确定是否需要它,而不是在定义 OK 按钮时定义它的回调(因此由于它引用回调而有一个闭包)来使用 .bind 定义它一次对话框打开。我希望能够将回调作为数据的一部分传递给点击事件可能有助于消除关闭。
任何想法我可以改变什么来摆脱这个泄漏?
【问题讨论】:
标签: jquery internet-explorer jquery-ui memory-leaks closures