File: src/utils/EventDispatcher.js
/** * Copyright (c) 2011-2012 Jeff Hoefs <[email protected]> * Released under the MIT license. See LICENSE file for details. */ JSUTILS.namespace('JSUTILS.EventDispatcher'); JSUTILS.EventDispatcher = (function() { var EventDispatcher; /** * The EventDispatcher class mimics the DOM event dispatcher model so the * user can add and remove event listeners in a familiar way. Event bubbling * is not available because events are dispatched in relation to state * changes of physical components instead of layered graphics so there is * nothing to bubble up. * * @class EventDispatcher * @constructor * @param {Class} target The instance of the class that implements * EventDispatcher */ EventDispatcher = function(target) { "use strict"; this._target = target || null; this._eventListeners = {}; this.name = "EventDispatcher"; }; EventDispatcher.prototype = { constructor: EventDispatcher, /** * @method addEventListener * @param {String} type The event type * @param {Function} listener The function to be called when the event * is fired */ addEventListener: function(type, listener) { if (!this._eventListeners[type]) { this._eventListeners[type] = []; } this._eventListeners[type].push(listener); }, /** * @method removeEventListener * @param {String} type The event type * @param {Function} listener The function to be called when the event * is fired */ removeEventListener: function(type, listener) { for (var i = 0, len = this._eventListeners[type].length; i < len; i++) { if (this._eventListeners[type][i] === listener) { this._eventListeners[type].splice(i, 1); } } // To Do: If no more listeners for a type, delete key? }, /** * @method hasEventListener * @param {String} type The event type * return {boolean} True is listener exists for this type, false if not. */ hasEventListener: function(type) { if (this._eventListeners[type] && this._eventListeners[type].length > 0) { return true; } else { return false; } }, /** * @method dispatchEvent * @param {Event} type The Event object. * @param {Object} optionalParams Optional parameters passed as an object. * return {boolean} True if dispatch is successful, false if not. */ dispatchEvent: function(event, optionalParams) { event.target = this._target; var isSuccess = false; // Add any optional params to the Event object for (var obj in optionalParams) { if (optionalParams.hasOwnProperty(obj)) { event[obj.toString()] = optionalParams[obj]; } } if (this.hasEventListener(event.type)) { for (var j = 0, len = this._eventListeners[event.type].length; j < len; j++) { try { this._eventListeners[event.type][j].call(this, event); isSuccess = true; } catch (e) { // To Do: Handle error console.log("error: Error calling event handler. " + e); } } } return isSuccess; } }; return EventDispatcher; }());
