Created
January 27, 2017 16:25
-
-
Save receptor/3ff88e6d6101862cee872bb17948cdba to your computer and use it in GitHub Desktop.
Simple EventEmitter for browsers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// usage: | |
// EventEmitter.mixin(myObject) | |
// myObject.emit('eventname', param1, param2, etc) | |
// myObject.on('eventname', function(param1, param2, etc) {}) | |
var EventEmitter = function () {}; | |
EventEmitter.prototype = { | |
// add event handler | |
on: function (event, fn) | |
{ | |
this._events = this._events || | |
{}; | |
this._events[event] = this._events[event] || []; | |
this._events[event].push(fn); | |
}, | |
// add event handler that executes once and then removes itself | |
once: function (event, fn) | |
{ | |
var fired = false; | |
function g() | |
{ | |
this.off(event, g); | |
if (!fired) | |
{ | |
fired = true; | |
fn.apply(this, arguments); | |
} | |
} | |
g.fn = fn; | |
this.on(event, g); | |
}, | |
// remove event handler | |
off: function (event, fn) | |
{ | |
this._events = this._events || | |
{}; | |
if (event in this._events === false) | |
{ | |
return; | |
} | |
this._events[event].splice(this._events[event].indexOf(fn), 1); | |
}, | |
// emit event | |
emit: function (event) | |
{ | |
this._events = this._events || | |
{}; | |
if (event in this._events === false) | |
{ | |
return; | |
} | |
for (var i = 0; i < this._events[event].length; i++) | |
{ | |
this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1)); | |
} | |
}, | |
// get listeners | |
listeners: function (type) | |
{ | |
return !type || !this._events || !this._events[type] ? [] : this._events[type]; | |
} | |
}; | |
EventEmitter.mixin = function (target) | |
{ | |
var props = ['on', 'once', 'off', 'emit', 'listeners']; | |
for (var i = 0; i < props.length; i++) | |
{ | |
if (typeof target === 'function') | |
{ | |
target.prototype[props[i]] = EventEmitter.prototype[props[i]]; | |
} | |
else | |
{ | |
target[props[i]] = EventEmitter.prototype[props[i]]; | |
} | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment