Sto lavorando con IE7 e alcune finestre di dialogo jQuery e sto correndo in una perdita di 6 meg per finestra di dialogo aperta. Suppongo che abbia a che fare con le chiusure, ma finora tutto ciò che ho fatto per rimuoverle non ha aiutato. A questo punto penso di aver preso cura di tutte le chiusure tranne che per una funzione di callback che ho passato, ma perdura ancora 6 mega anche dopo che la finestra di dialogo è stata chiusa e rimossa. Il codice sorgente di riferimento è:Perdite di memoria della finestra di dialogo jQuery-UI
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);
}
Una cosa che ho fatto in precedenza che non sono sicuro se è necessario era invece di definire la richiamata per il pulsante OK quando è definito (e quindi avere una chiusura dal momento che è riferimento alla callback) per definirlo usando .bind una volta aperta la finestra di dialogo. Speravo che riuscire a passare il callback come parte dei dati all'evento click potesse aiutare a rimuovere la chiusura.
Qualche idea su cos'altro posso cambiare per eliminare questa perdita?
Questo ha a che fare con IE come gestisce la trasparenza PNG, che è ... orribilmente. Se vai con un semplice filtro IE colorato invece di un'immagine, puoi ottenere un effetto senza il colpo di memoria. Nel tuo jQuery.UI.css cambia la classe '.ui-widget-overlay' e rimuovi everythig da' url ('avanti nella dichiarazione' background: ', questo si tradurrà in un overlay traslucido a un solo colore –
Sembra essere con In che modo IE si occupa della trasparenza in generale, ho rimosso l'aspetto dell'URL dello sfondo (lasciando solo il colore solido) e lo ha fatto ancora: non è stato fino a quando non ho rimosso il filtro di opacità che scompariva. – Parrots
Rimuovere effettivamente la modal: true dalla mia finestra di dialogo ho troncato l'utilizzo della memoria di IE 8 a metà (da 150 MB a 70). – daschl