File: src\eventdispatcher.js
/**
* A base class for adding and removing event listeners and dispatching events.
*
* @class EventDispatcher
* @constructor
*/
export default function EventDispatcher() {
/**
* A map of listeners.
*
* @property _listeners
* @type Object
* @private
*/
this._listeners = {};
}
/**
* Extends an object with the event dispatcher functionality.
*
* @method apply
* @param {Object} object - The object.
* @example
* EventDispatcher.prototype.apply(X.prototype);
*/
EventDispatcher.prototype.apply = function(object) {
object._listeners = {};
object.addEventListener = EventDispatcher.prototype.addEventListener;
object.hasEventListener = EventDispatcher.prototype.hasEventListener;
object.removeEventListener = EventDispatcher.prototype.removeEventListener;
object.dispatchEvent = EventDispatcher.prototype.dispatchEvent;
};
/**
* Adds an event listener.
*
* @method addEventListener
* @param {String} type - The event type.
* @param {Function} listener - The event listener.
*/
EventDispatcher.prototype.addEventListener = function(type, listener) {
if(this._listeners[type] === undefined) {
this._listeners[type] = [];
}
if(this._listeners[type].indexOf(listener) === -1) {
this._listeners[type].push(listener);
}
};
/**
* Checks if the event listener exists.
*
* @method hasEventListener
* @param {String} type - The event type.
* @param {Function} listener - The event listener.
*/
EventDispatcher.prototype.hasEventListener = function(type, listener) {
return (this._listeners[type] !== undefined && this._listeners[type].indexOf(listener) !== -1);
};
/**
* Removes an event listener.
*
* @method removeEventListener
* @param {String} type - The event type.
* @param {Function} listener - The event listener.
*/
EventDispatcher.prototype.removeEventListener = function(type, listener) {
var i, listenerArray;
listenerArray = this._listeners[type];
if(listenerArray !== undefined) {
i = listenerArray.indexOf(listener);
if(i !== -1) {
listenerArray.splice(i, 1);
}
}
};
/**
* Dispatches an event to all respective listeners.
*
* @method dispatchEvent
* @param {Object} event - The event.
*/
EventDispatcher.prototype.dispatchEvent = function(event) {
var i, l, listenerArray;
listenerArray = this._listeners[event.type];
if(listenerArray !== undefined) {
event.target = this;
for(i = 0, l = listenerArray.length; i < l; ++i) {
listenerArray[i].call(this, event);
}
}
};