Skip to content

Instantly share code, notes, and snippets.

@receptor
Created January 27, 2017 16:25
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 receptor/3ff88e6d6101862cee872bb17948cdba to your computer and use it in GitHub Desktop.
Save receptor/3ff88e6d6101862cee872bb17948cdba to your computer and use it in GitHub Desktop.
Simple EventEmitter for browsers
// 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