Supponiamo di avere una pagina con un layout a due colonne in cui la colonna di sinistra è un insieme di collegamenti e carica la pagina/modello html associato nella colonna destra quando viene fatto clic su quel collegamento.Eventi ed elementi DOM
Una volta caricato un modello, c'è un gestore di template che viene inizializzato come un singleton tramite requirejs e definisce alcuni metodi ei gestori come:
SomePage.prototype.saveHandler: function(e) { ... }; // Page handler has a handler
SomePage.prototype.initialize: function() {
$('#btnSave').on('click', saveHandler);
}
Poi, sto allegando eventi DOM attraverso un metodo initialize ogni il tempo di caricamento della pagina.
SomePage.initialize(); // This attaches the click event
Ora, quando clicco un altro link sulla sinistra, una pagina di modello diverso viene caricata e il processo di cui sopra si ripete per quella pagina.
Mi chiedo cosa succede all'evento click che è stato allegato in precedenza all'elemento btnSave? È ora un gestore di eventi penzoloni nella cache jQuery?
Se tento di rimuoverlo quando la stessa pagina si carica nuovamente, rimuoverà effettivamente l'evento originale?
$('#btnSave').off('click', saveHandler);
L'esecuzione del seguente blocco impedisce perdite di memoria/riferimenti ciondoli?
// The potential problem here is that btnSave is part of the newly loaded template
// and not the element i attached the handler to earlier (which doesn't exist anymore)
$('#btnSave').off('click', saveHandler);
$('#btnSave').on('click', saveHandler);
Qual è il modo migliore per garantire che non si ottengano riferimenti pendenti e perdite di memoria. Questa è una potenziale domanda anche per plain javascript. La mia comprensione è che quanto sopra non funzionerà quando la pagina di modello viene aggiornata. Nel frattempo sto andando a sperimentarlo, ma sarebbe bello sapere come lo gestiscono gli esperti. Grazie!
Io sicuramente uso 'off' e poi' on' subito dopo, come hai fatto tu. Ma esiste un modo per chiamare "off" * prima * di ricaricare il template? – dthree
Ho pensato a questo schema come soluzione, ma non sono sicuro di averne ancora bisogno perché jQuery potrebbe gestirlo internamente.Se ogni pagina implementava un'interfaccia e al momento del caricamento si registrava come la pagina corrente, allora un gestore globale di collegamenti poteva fare qualcosa come app.cache.currentPage.cleanup() che poteva contenere tutte le alternative. – theoutlander
Penso che tu abbia ragione nel senso che crea un elemento fantasma non facendolo ... – dthree