Реализация пользовательских событий не сложно.Вы можете реализовать это многими способами.В последнее время я делаю это так:
/***************************************************************
*
* 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;
}
};
Объект Observable может быть повторно использован и применен любым конструктором, который ему нужен, просто смешав прототип Observable с прототипом этого конструктора.
Чтобы начать прослушивание, вы должны зарегистрировать себя в наблюдаемом объекте, например:
var obs = new Observable();
obs.listen("myEvent", function(observable, eventType, data){
//handle myEvent
});
Или, если ваш слушатель является методом объекта, например:
obs.listen("myEvent", listener.handler, listener);
Где слушатель является экземпляром объекта, который реализует метод «обработчик».
Объект Observable теперь может вызывать свой метод fireEvent всякий раз, когда происходит что-то, что он хочет сообщить своим слушателям:
this.fireEvent("myEvent", data);
Где данные - это некоторые данные, которые слушатели могут найти интересными.Независимо от того, что вы добавили, это зависит от вас - вы лучше знаете, из чего состоит ваше пользовательское событие.
Метод fireEvent просто проходит через все прослушиватели, которые были зарегистрированы для «myEvent», и вызывает зарегистрированную функцию.,Если функция возвращает false, то это означает, что событие отменено, и наблюдаемое не будет вызывать других слушателей.В результате весь метод fireEvent будет также возвращать fasle, поэтому наблюдаемая знает, что любое действие, о котором она уведомляла своих слушателей, теперь должно быть отменено.
Возможно, это решение подходит не всем, но я имелмного пользы от этого относительно простого куска кода.