Я работаю с IE7 и некоторыми диалоговыми окнами jQuery, и я сталкиваюсь о 6meg утечка на открытое диалоговое окно. Я предполагаю, что это относится к закрытиям, но до сих пор все, что я сделал для удаления их, не помогло. В этой точке я думаю, что заботился обо всех закрытиях за исключением для функции обратного вызова, в которой я передаю, но она все еще пропускает 6 megs даже после того, как диалоговое окно закрыто и удалено. Соответствующий исходный код:
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 UI имеет дело с серым фоном при отображении модального. Если я удалю модаль = True и атрибуты наложения, утечка памяти снижается до ~ 100k.
Чтобы обойти это, мне пришлось сделать диалог без модального варианта, а затем добавить Div себя на страницу (фиксированная верхняя часть положения, слева, снизу, вправо все 0 с чередующимся серым пикселем, а затем прозрачный пиксельный фон) и показывая и скрывая это с Zindex только под диалоговым окном.
Несмотря на то, что он не идеален (модальное наложение по умолчанию было хорошим и гладким видом), что лучше, чем утечка, что много памяти на диалог, который я всплыл.
Надеюсь, что это поможет, я создал расширение для этой проблемы, в котором я использую инструменты jQuery (flowplayer), выставляя плагин, когда модал = true для диалогового окна jQuery ui.
Я бы включил folhttp: //jsfiddle.net/yz56q/6que.newing код в отдельном файле .js и обязательно включить инструменты jQuery Exents Plugin PROCE, с этого сайта ... http: // flowplayer.org/tools/download.html.
(function($) {
var _init = $.ui.dialog.prototype._init;
$.ui.dialog.prototype._init = function() {
var self = this;
_init.apply(this, arguments);
// Remove the default modal behavior and exhibit the new one
if (self.options.modal) {
self.options.modal = false;
self.options.isModal = true;
}
this.uiDialog.bind('dialogopen', function(event, ui) {
if (self.options.isModal) {
if ($(this).expose == null)
window.alert("Dialog box depends on the expose plugin to be modal. Please include the jquery tools Javascript include.");
else {
$(this).expose({ opacity: 0.3
, color: '#CCCCCC'
, loadSpeed: 0
, closeSpeed: 0
, closeOnClick: false
, closeOnEsc: false
, api: true
}).load();
}
}
});
this.uiDialog.bind('dialogfocus', function(event, ui) {
if (self.options.isModal) {
$(this).css('z-index', '9999');
}
});
this.uiDialog.bind('dialogclose', function(event, ui) {
if (self.options.isModal) {
if ($(this).expose != null) {
$(this).expose({ api: true }).close();
}
}
});
};
$.ui.dialog.defaults.isModal = false;
})(jQuery);