A lightweight event system for rapid prototyping
A Pen by Keili Olsen on CodePen.
A lightweight event system for rapid prototyping
A Pen by Keili Olsen on CodePen.
/** | |
* | |
* 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'); | |
}(); |