Wdrażanie niestandardowych zdarzeń nie jest trudne. Możesz go wdrożyć na wiele sposobów. Ostatnio robię to tak:
/***************************************************************
*
* 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;
}
};
obserwowalnym obiekt może być ponownie wykorzystane i stosowane przez co konstruktor musi go po prostu przez mixng prototyp Obserwowalne z protoype tego konstruktora.
aby rozpocząć odtwarzanie, trzeba zarejestrować się do zaobserwowania przedmiotu, tak jak poniżej:
var obs = new Observable();
obs.listen("myEvent", function(observable, eventType, data){
//handle myEvent
});
Albo jeśli słuchacz jest metodą obiektu, tak jak poniżej:
obs.listen("myEvent", listener.handler, listener);
Gdzie detektor jest instancją obiektu, który implementuje metodę "handler".
obserwowalnym obiekt może teraz wywołać jego metodę fireEvent gdy coś się dzieje, że chce przekazać swoich słuchaczy:
this.fireEvent("myEvent", data);
gdzie dane są niektóre dane, które słuchacze moich znaleźć interesujące. Wszystko, co włożysz, zależy od Ciebie - wiesz najlepiej, z czego składa się twoje niestandardowe wydarzenie.
Metoda fireEvent po prostu przechodzi przez wszystkie detektory zarejestrowane dla "myEvent" i wywołuje zarejestrowaną funkcję. Jeśli funkcja zwróci wartość false, oznacza to, że zdarzenie zostało anulowane, a obserwowalne nie wywoła innych detektorów. W rezultacie cała metoda fireEvent również powróci, więc obserwujący wie, że jakiekolwiek działanie powiadamiające jej słuchaczy powinno zostać wycofane.
Być może to rozwiązanie nie pasuje do wszystkich, ale ja, ve, mieliśmy wiele korzyści z tego stosunkowo prostego kawałka kodu.
Zobacz [to inne pytanie] (http://stackoverflow.com/questions/2490825/how-to-trigger-event-in-javascript) – bfavaretto
Możesz użyć biblioteki, takiej jak jQuery, do tworzenia niestandardowych zdarzeń i detektorów. Zajrzyj na http://fuelyourcoding.com/jquery-custom-events-they-will-rock-your-world/ i http://api.jquery.com/trigger/ –
W jaki sposób opublikowany przez Ciebie kod dotyczy Obsługa zdarzeń? Czy chcesz uruchomić ten kod jako odpowiedź na wydarzenie? –