2013-11-04 32 views
7

Questa è fondamentalmente una domanda successiva a questo: Can't pass event to addEventListener: closure issue.Come rimuovere EventListener che è stato aggiunto utilizzando la chiusura?

Ho letto quasi tutte le domande correlate e non riesco a trovare la risposta a questo.

La funzione seguente viene eseguita all'interno di un loop in cui i parametri vengono estratti da una matrice di dati. Con questa funzione sono in grado di passare diversi/nuovi parametri a ciascuna istanza di un listener di eventi. La funzione esterna consente di incapsulare i valori dei parametri all'interno della chiusura in modo che i valori effettivi siano disponibili, non solo i riferimenti ai titolari. Inoltre, la funzione passevent passa l'evento alla funzione response. Infine, la funzione response ha tutte le informazioni appropriate per rispondere all'evento click. Funziona alla grande Il problema è che non riesco a capire come rimuovere il listener di eventi in un secondo momento. Ho provato tutto quello che riesco a pensare. Per favore aiuto. Come posso: removeEventListener?

(function outerfunction(i, f) { 
    elementname.addEventListener("click", function passeventfunction(e) { 
     responsefunction(e, f, i); });})(parameter1, parameter2); 

anche, se qualcuno potrebbe contribuire a chiarire ciò che sta accadendo qui. Si tratta di una chiusura all'interno di una chiusura? C'è il pericolo di lasciare una perdita di memoria o qualcosa del genere? Grazie!

+0

è necessario salvare un riferimento a 'passeventfunction' qualche parte in modo che è possibile passare che in' removeEventListener'. – Bergi

risposta

8

devi tenere i riferimenti ai vostri ascoltatori:

var listeners = {}; 
for(/* ... */) { 
    (function outerfunction(i, f) { 
     var listener = function(e) { 
      responsefunction(e, f, i); 
     } 
     elementname.addEventListener("click", listener); 
     listeners[elementname.id] = listener; // use something meaningful 
               // as your keys 
    })(parameter1, parameter2); 
} 

// Removing the listener later: 
elementname.removeEventListener("click", listeners[elementname.id]);