Skip to content

Instantly share code, notes, and snippets.

@pentaphobe
Last active January 4, 2016 04:39
Show Gist options
  • Save pentaphobe/8569968 to your computer and use it in GitHub Desktop.
Save pentaphobe/8569968 to your computer and use it in GitHub Desktop.
A Pen by Keili Olsen.
/**
*
* Embarrassingly Minimal Event System
* Keili Olsen @pentaphobe 2014
*
* CC sharealike
*
**/
(function(glob) {
var __ = glob.__ || ( glob.__ = {} );
var reEvent = /\s+/;
var Eventable = __.Eventable = function() {
this.listeners = { };
};
Eventable.prototype.on = function(events, callback) {
// this would be preferable with lodash/underscore to avoid the _this
var listeners = this.listeners;
events.split(reEvent).forEach(function(event, idx) {
(listeners[event] || (listeners[event] = [])).push(callback);
});
return this;
};
Eventable.prototype.off = function(events, callback) {
var listeners = this.listeners;
events.split(reEvent).forEach(function(event, idx) {
if (!callback) {
listeners[event] = [];
return;
}
for ( var handlers = listeners[event] || [], idx = 0;
(idx = handlers.indexOf(callback)) > -1; ) {
handlers.splice(idx, 1);
}
listeners[event] = handlers;
});
return this;
};
Eventable.prototype.trigger = function(events){
var _this = this;
var args = Array.prototype.slice.call(arguments, 0);
events.split(reEvent).forEach(function(event, idx) {
args[0] = event;
for ( var handlers = _this.listeners[event], idx = 0, max=handlers.length;
handlers && idx < max; idx++)
{
handlers[idx].apply(_this, args);
}
});
return this;
};
})(this);
/** Embarrassingly Minimal Event System, Keili Olsen @pentaphobe 2014, CC sharealike **/
(function(a){var f=/\s+/;a=(a.__||(a.__={})).Eventable=function(){this.listeners={}};a.prototype.on=function(a,c){var b=this.listeners;a.split(f).forEach(function(g,a){(b[g]||(b[g]=[])).push(c)});return this};a.prototype.off=function(a,c){var b=this.listeners;a.split(f).forEach(function(a,d){if(c){for(var e=b[a]||[];-1<(d=e.indexOf(c));)e.splice(d,1);b[a]=e}else b[a]=[]});return this};a.prototype.trigger=function(a){var c=this,b=Array.prototype.slice.call(arguments,0);a.split(f).forEach(function(a,
d){b[0]=a;var e=c.listeners[a];d=0;for(var f=e.length;e&&d<f;d++)e[d].apply(c,b)});return this}})(this);
/**
* Very basic usage example extracted from the original gist
*/
!function() {
var eventable = new __.Eventable();
var results = [];
var callback = function test() {
var body = Array.prototype.slice.call(arguments, 0).join(' ');
results.push(body);
};
var testEquals = function testEquals(name, val, desired) {
if (val !== desired) {
console.warn('failed test ' + name, 'got ' + val + ', expected:', desired);
} else {
console.log('passed test ' + name);
}
return val !== desired;
};
var checkTrigger = function checkTrigger(txt) {
var resultString = results.join(',');
return testEquals('trigger ' + txt, txt, resultString);
};
// test event assignment
eventable.on('test', callback);
testEquals('event assignment', eventable.listeners['test'].length, 1);
// test multiple event assignment
eventable.on('multiple events', callback);
testEquals('multiple event assignment (1st)', eventable.listeners['multiple'].length, 1);
testEquals('multiple event assignment (2nd)', eventable.listeners['events'].length, 1);
// check basic triggering
eventable.trigger('test');
checkTrigger('test');
// check trigger with data
eventable.trigger('test', 'extra data');
checkTrigger('test,test extra data');
// check trigger multiple events
eventable.trigger('multiple events');
checkTrigger('test,test extra data,multiple,events');
// check trigger multiple events with extra data
eventable.trigger('multiple events', 'more', 'data');
checkTrigger('test,test extra data,multiple,events,multiple more data,events more data');
}();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment