Skip to content

Instantly share code, notes, and snippets.

@vikingmute
Created June 16, 2014 10:27
Show Gist options
  • Save vikingmute/c6d1f57e66cbba9949c0 to your computer and use it in GitHub Desktop.
Save vikingmute/c6d1f57e66cbba9949c0 to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
</body>
</html>
function Emitter() {
this._events = {};
};
function toArray(obj) {
if (typeof obj === 'object'){
return Array.prototype.slice.call(obj);
} else {
return [];
}
}
function alias(name) {
return function aliasClosure() {
return this[name].apply(this, arguments);
};
}
function indexOfListeners(haystack, needle) {
for (var i = 0, len = haystack.length; i < len; i++) {
if (haystack[i] == needle) {
return i;
}
}
return -1;
}
var fn = Emitter.prototype;
fn._getEvents = function () {
return this._events;
};
fn.getListeners = function (event) {
var events = this._getEvents();
var response;
response = events[event] || [];
return response;
};
fn.addListener = function (event, listener) {
var events = this._getEvents();
var eventsArray = this.getListeners(event);
if (eventsArray.length == 0) {
//create a new event
events[event] = [listener];
} else {
events[event].push(listener);
}
};
fn.on = alias('addListener');
fn.removeListener = function (event, listener) {
var eventsArray = this.getListeners(event);
var index = indexOfListeners(eventsArray, listener);
if (index !== -1) {
eventsArray.splice(index, 1);
}
};
fn.off = alias('removeListener');
fn.emit = function () {
var args = toArray(arguments);
var event = args.splice(0 ,1);
var cargs = args.slice();
var eventArray = this.getListeners(event);
for (var i = 0, len = eventArray.length; i < len; i++) {
var callback = eventArray[i];
if (cargs.length === 0) {
callback.apply(this);
} else {
callback.apply(this, cargs[i]);
}
}
};
var grid = new Emitter();
var callback = function () {
console.log('cool kid');
}
grid.addListener('logout', callback);
grid.addListener('logout', function() {
console.log('bitch out');
});
grid.off('logout', callback);
grid.emit('logout');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment