Implementare eventi personalizzati non è difficile. Puoi implementarlo in molti modi. Ultimamente mi sto facendo in questo modo:
/***************************************************************
*
* Observable
*
***************************************************************/
var Observable;
(Observable = function() {
}).prototype = {
listen: function(type, method, scope, context) {
var listeners, handlers;
if (!(listeners = this.listeners)) {
listeners = this.listeners = {};
}
if (!(handlers = listeners[type])){
handlers = listeners[type] = [];
}
scope = (scope ? scope : window);
handlers.push({
method: method,
scope: scope,
context: (context ? context : scope)
});
},
fireEvent: function(type, data, context) {
var listeners, handlers, i, n, handler, scope;
if (!(listeners = this.listeners)) {
return;
}
if (!(handlers = listeners[type])){
return;
}
for (i = 0, n = handlers.length; i < n; i++){
handler = handlers[i];
if (typeof(context)!=="undefined" && context !== handler.context) continue;
if (handler.method.call(
handler.scope, this, type, data
)===false) {
return false;
}
}
return true;
}
};
L'oggetto Observable può essere riutilizzato e applicato da qualunque costruttore ne ha bisogno semplicemente mixng il prototipo del Observable con il prototipo di quel costruttore.
Per iniziare l'ascolto, è necessario registrarsi con l'oggetto osservabile, in questo modo:
var obs = new Observable();
obs.listen("myEvent", function(observable, eventType, data){
//handle myEvent
});
O se il vostro ascoltatore è un metodo di un oggetto, in questo modo:
obs.listen("myEvent", listener.handler, listener);
Dove ascoltatore è un'istanza di un oggetto, che implementa il metodo "gestore".
L'oggetto Observable ora può chiamare il suo metodo fireEvent ogni volta che succede qualcosa che si vuole comunicare ai suoi ascoltatori:
this.fireEvent("myEvent", data);
cui i dati sono alcuni dati che gli ascoltatori la mia trovano interessante. Qualunque cosa tu abbia messo lì dipende da te - sai meglio di cosa è composto il tuo evento personalizzato.
Il metodo fireEvent passa semplicemente attraverso tutti gli ascoltatori registrati per "myEvent" e chiama la funzione registrata. Se la funzione restituisce false, significa che l'evento è annullato e l'osservabile non chiama gli altri ascoltatori. Di conseguenza, l'intero metodo fireEvent tornerà fasullo, quindi l'osservabile sa che qualsiasi azione che stava notificando ai suoi ascoltatori dovrebbe essere ripristinata.
Forse questa soluzione non soddisfa tutti, ma ho avuto molto beneficio da questo pezzo di codice relativamente semplice.
Vedere [questa altra domanda] (http://stackoverflow.com/questions/2490825/how-to-trigger-event-in-javascript) – bfavaretto
È possibile utilizzare una libreria come jQuery per creare eventi personalizzati e listener. Dai un'occhiata a http://fuelyourcoding.com/jquery-custom-events-the-will-rock-your-world/ e http://api.jquery.com/trigger/ –
Come è correlato il codice che hai postato gestione degli eventi? Vuoi eseguire questo codice come risposta a un evento? –