pixelbox
Version:
A framework to fast-prototype pixel-based games
111 lines (87 loc) • 2.59 kB
JavaScript
function EventEmitter() {
this._events = {};
};
module.exports = EventEmitter;
EventEmitter.listenerCount = function (emitter, event) {
var handlers = emitter._events[event];
return handlers ? handlers.length : 0;
};
EventEmitter.prototype.on = function (event, fn) {
if (typeof fn !== 'function') throw new TypeError('Tried to register non-function as event handler: ' + event);
// we emit first, because if event is "newListener" it would go recursive
// this.emit('newListener', event, fn);
var allHandlers = this._events;
var eventHandlers = allHandlers[event];
if (eventHandlers === undefined) {
// first event handler for this event type
allHandlers[event] = [fn];
} else {
eventHandlers.push(fn);
}
return this;
};
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
EventEmitter.prototype.once = function (event, fn) {
if (!fn.once) {
fn.once = 1;
} else {
fn.once += 1;
}
return this.on(event, fn);
};
EventEmitter.prototype.removeListener = function (event, handler) {
var handlers = this._events[event];
if (handlers !== undefined) {
var index = handlers.indexOf(handler);
if (index === -1) {
console.warn('No event listener registered', event, handler)
return this;
}
handlers.splice(index, 1);
if (handlers.length === 0) delete this._events[event];
}
return this;
};
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
EventEmitter.prototype.removeAllListeners = function (event) {
if (event) {
delete this._events[event];
} else {
this._events = {};
}
return this;
};
EventEmitter.prototype.hasListeners = function (event) {
return this._events[event] !== undefined;
};
EventEmitter.prototype.listeners = function (event) {
var handlers = this._events[event];
if (handlers !== undefined) return handlers.slice();
return [];
};
EventEmitter.prototype.emit = function (event) {
var handlers = this._events[event];
if (handlers === undefined) return false;
// copy handlers into a new array, so that handler removal doesn't affect array length
handlers = handlers.slice();
var hadListener = false;
// copy all arguments, but skip the first (the event name)
var args = [];
for (var i = 1; i < arguments.length; i++) {
args.push(arguments[i]);
}
for (var i = 0, len = handlers.length; i < len; i++) {
var handler = handlers[i];
handler.apply(this, args);
hadListener = true;
if (handler.once) {
if (handler.once > 1) {
handler.once--;
} else {
delete handler.once;
}
this.removeListener(event, handler);
}
}
return hadListener;
};