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'); | |
| }(); |