UNPKG

p2s

Version:

A JavaScript 2D physics engine.

132 lines (123 loc) 3.72 kB
module.exports = EventEmitter; /** * Base class for objects that dispatches events. * @class EventEmitter * @constructor * @example * var emitter = new EventEmitter(); * emitter.on('myEvent', function(evt){ * console.log(evt.message); * }); * emitter.emit({ * type: 'myEvent', * message: 'Hello world!' * }); */ function EventEmitter() { this.tmpArray = []; } EventEmitter.prototype = { constructor: EventEmitter, /** * Add an event listener * @method on * @param {String} type * @param {Function} listener * @return {EventEmitter} The self object, for chainability. * @example * emitter.on('myEvent', function(evt){ * console.log('myEvt was triggered!'); * }); */ on: function ( type, listener, context ) { listener.context = context || this; if ( this._listeners === undefined ){ this._listeners = {}; } var listeners = this._listeners; if ( listeners[ type ] === undefined ) { listeners[ type ] = []; } if ( listeners[ type ].indexOf( listener ) === - 1 ) { listeners[ type ].push( listener ); } return this; }, /** * Remove an event listener * @method off * @param {String} type * @param {Function} listener * @return {EventEmitter} The self object, for chainability. * @example * emitter.on('myEvent', handler); // Add handler * emitter.off('myEvent', handler); // Remove handler */ off: function ( type, listener ) { var listeners = this._listeners; if(!listeners || !listeners[type]){ return this; } var index = listeners[ type ].indexOf( listener ); if ( index !== - 1 ) { listeners[ type ].splice( index, 1 ); } return this; }, /** * Check if an event listener is added * @method has * @param {String} type * @param {Function} listener * @return {Boolean} */ has: function ( type, listener ) { if ( this._listeners === undefined ){ return false; } var listeners = this._listeners; if(listener){ if ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) { return true; } } else { if ( listeners[ type ] !== undefined ) { return true; } } return false; }, /** * Emit an event. * @method emit * @param {Object} event * @param {String} event.type * @return {EventEmitter} The self object, for chainability. * @example * emitter.emit({ * type: 'myEvent', * customData: 123 * }); */ emit: function ( event ) { if ( this._listeners === undefined ){ return this; } var listeners = this._listeners; var listenerArray = listeners[ event.type ]; if ( listenerArray !== undefined ) { event.target = this; // Need to copy the listener array, in case some listener was added/removed inside a listener var tmpArray = this.tmpArray; for (var i = 0, l = listenerArray.length; i < l; i++) { tmpArray[i] = listenerArray[i]; } for (var i = 0, l = tmpArray.length; i < l; i++) { var listener = tmpArray[ i ]; listener.call( listener.context, event ); } tmpArray.length = 0; } return this; } };