UNPKG

@awayjs/core

Version:
116 lines (115 loc) 4.01 kB
/** * Base export class for dispatching events * * @export class away.events.EventDispatcher * */ var EventDispatcher = /** @class */ (function () { function EventDispatcher(target) { if (target === void 0) { target = null; } this._listenerObjects = {}; this._t = target || this; } /** * Add an event listener * @method addEventListener * @param {String} type of event to add a listener for * @param {Function} listener function */ EventDispatcher.prototype.addEventListener = function (type, listener) { var l = this._listenerObjects[type]; if (l === undefined) l = this._listenerObjects[type] = new ListenerObject(); l.addEventListener(listener); }; /** * Remove an event listener * @method removeEventListener * @param {String} type of event to remove a listener for * @param {Function} listener function */ EventDispatcher.prototype.removeEventListener = function (type, listener) { var l = this._listenerObjects[type]; if (l) { l.removeEventListener(listener); if (l.numListeners == 0) delete this._listenerObjects[type]; } }; /** * Dispatch an event * @method dispatchEvent * @param {Event} event to dispatch */ EventDispatcher.prototype.dispatchEvent = function (event, target) { if (target === void 0) { target = null; } var l = this._listenerObjects[event.type]; if (l) { event.target = target || this._t; event.currentTarget = this._t; l.dispatchEvent(event); } }; /** * check if an object has an event listener assigned to it * @method hasListener * @param {String} type of event to remove a listener for * @param {Function} listener function */ EventDispatcher.prototype.hasEventListener = function (type, listener) { if (this._listenerObjects[type] === undefined) return false; if (listener != null) return this._listenerObjects[type].getEventListenerIndex(listener) !== -1; return this._listenerObjects[type].numListeners > 0; }; EventDispatcher.prototype.removeAllEventListeners = function () { this._listenerObjects = {}; }; return EventDispatcher; }()); export { EventDispatcher }; var ListenerObject = /** @class */ (function () { function ListenerObject() { this._index = 0; this._listeners = new Array(); this.numListeners = 0; } ListenerObject.prototype.addEventListener = function (listener) { //check if listener already added if (this._listeners.indexOf(listener) !== -1) return; this._listeners.push(listener); this.numListeners++; }; ListenerObject.prototype.removeEventListener = function (listener) { //check if listener exists var index = this._listeners.indexOf(listener); if (index === -1) return; this._listeners.splice(index, 1); //deals with removing a listener mid-way through dispatching listeners if (index <= this._index) this._index--; this.numListeners--; }; ListenerObject.prototype.dispatchEvent = function (event) { var len = this.numListeners; for (this._index = 0; this._index < len && this._index < this.numListeners; this._index++) { this._listeners[this._index](event); if (!event._iAllowedToImmediatlyPropagate) { break; } } }; /** * get Event Listener Index in array. Returns -1 if no listener is added * @method getEventListenerIndex * @param {Function} listener function */ ListenerObject.prototype.getEventListenerIndex = function (listener) { return this._listeners.indexOf(listener); }; return ListenerObject; }()); export { ListenerObject };