La implementación de eventos personalizados no es difícil. Puedes implementarlo de muchas maneras. Últimamente estoy haciendo de esta manera:
/***************************************************************
*
* 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;
}
};
El objeto observable puede ser reutilizado y aplicada por cualquier constructor necesita simplemente por mixng el prototipo de observable con el prototipo muy de ese constructor.
para empezar a escuchar, hay que darse de alta en el objeto observable, así:
var obs = new Observable();
obs.listen("myEvent", function(observable, eventType, data){
//handle myEvent
});
O si su oyente es un método de un objeto, así:
obs.listen("myEvent", listener.handler, listener);
Dónde listener es una instancia de un objeto, que implementa el método "handler".
El objeto observable ahora puede llamar a su método fireEvent cada vez que sucede algo que se quiere comunicar a sus oyentes:
this.fireEvent("myEvent", data);
Cuando los datos es algunos datos que los oyentes Mi encuentran interesante. Lo que sea que pongas allí depende de ti; tú sabes mejor de qué está hecho tu evento personalizado.
El método fireEvent simplemente pasa por todos los oyentes que se registraron para "myEvent" y llama a la función registrada. Si la función devuelve falso, significa que el evento se cancela y el observable no llamará a los otros oyentes. Como resultado, todo el método fireEvent también volverá a funcionar, por lo que el observable sabe que cualquier acción que notificara a sus oyentes debería revertirse.
Quizás esta solución no convenga a todo el mundo, pero he tenido mucho beneficio de esta pieza relativamente simple de código.
Ver [esta otra pregunta] (http://stackoverflow.com/questions/2490825/how-to-trigger-event-in-javascript) – bfavaretto
Puede usar una biblioteca como jQuery para crear oyentes y eventos personalizados. Eche un vistazo a http://fuelyourcoding.com/jquery-custom-events-they-will-rock-your-world/ y http://api.jquery.com/trigger/ –
¿Cómo se relaciona el código que publicó? manejo de eventos? ¿Desea ejecutar este código como respuesta a un evento? –