Skip to content

Instantly share code, notes, and snippets.

@max19931
Forked from kottenator/js_observer.js
Last active August 13, 2019 12:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save max19931/6d35ea8d1dc240e25fec67eca6b5c583 to your computer and use it in GitHub Desktop.
Save max19931/6d35ea8d1dc240e25fec67eca6b5c583 to your computer and use it in GitHub Desktop.
JavaScript Simple Observer
/**
* var MyObject = {...}; // your custom object
* Observer.apply(MyObject); // you also can apply Observer to a prototype
* MyObject.on('inited', function() { console.log("I'm alive!"); });
* MyObject.trigger('inited');
*/
var Observer = {
apply: function(obj) {
obj.events = {};
obj.on = this.on;
obj.off = this.off;
obj.trigger = this.trigger;
},
/**
* Add event listener
*
* {String} events - e.g. 'my-event-1 my-event-2'
* {Function} fn - event listener
*/
on: function(events, fn) {
events = events.replace(/^\s+|\s+$/g, '').split(/\s+/);
for (var i = 0; i < events.length; i++) {
var event = events[i];
if (!this.events[event])
this.events[event] = {};
this.events[event].push(fn);
}
},
/**
* Remove event listener
*
* {String} events - e.g. 'my-event-1 my-event-2'
* {Function} fn - event listener. If not specified (or null, or undefined,
* or or any bool-casted to 'false' value) - all listeners will be removed.
*/
off: function(events, fn) {
events = events.replace(/^\s+|\s+$/g, '').split(/\s+/);
for (var i = 0; i < events.length; i++) {
var event = events[i];
if (!this.events[event])
continue;
var fns = this.events[event],
nfns = [];
if (fn) {
for (var j = 0; j < fns.length; j++) {
if (fns[j] !== fn)
nfns.push(fns[j]);
}
}
this.events[event] = nfns;
}
},
/**
* Dispatch an event (call all its listeners)
*
* All listeners will be called with 2 arguments: fn({String} eventName, {any type} args)
*
* {String} events - e.g. 'my-event-1 my-event-2'
* {any type} args - custom event arguments (you may specify multiple args as Array or Object)
*/
trigger: function(events, args) {
events = events.replace(/^\s+|\s+$/g, '').split(/\s+/);
for (var i = 0; i < events.length; i++) {
var event = events[i];
if (!this.events[event])
continue;
var fns = this.events[event];
for (var j = 0; j < fns.length; j++) {
fns[j].call(this, event, args);
}
}
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment