Par*_*ots 5 jquery internet-explorer closures memory-leaks jquery-ui
我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)
我上面做的一件事我不确定是否需要它而不是定义OK按钮的回调(因为它引用回调因此有一个闭包),一旦对话框是一个.bind就定义它.打开.我希望能够将回调作为数据的一部分传递给click事件可能有助于删除闭包.
还有什么想法可以改变以摆脱这种泄漏?
它实际上最终是由于jQuery UI框架在显示模式时如何处理灰色背景.如果我删除modal = true和覆盖属性,内存泄漏会降低到~100k.
为了解决这个问题,我不得不在没有模态选项的情况下进行对话,然后在页面上添加一个div(固定位置顶部,左侧,底部,右侧全部为0,交替灰色像素,然后是透明像素背景)并显示和隐藏在对话框下面有一个zindex.
虽然它不理想(默认的模态叠加是漂亮和平滑的外观),但它比我弹出的每个对话框泄漏那么多内存更好.
归档时间: |
|
查看次数: |
4335 次 |
最近记录: |