1/** 2 * @namespace WPGMZA 3 * @module EventDispatcher 4 * @requires WPGMZA 5 */ 6jQuery(function($) { 7 8 /** 9 * Base class for any (non HTMLElement) object which dispatches or listens for events 10 * @class WPGMZA.EventDispatcher 11 * @constructor WPGMZA.EventDispatcher 12 * @memberof WPGMZA 13 */ 14 WPGMZA.EventDispatcher = function() 15 { 16 WPGMZA.assertInstanceOf(this, "EventDispatcher"); 17 18 this._listenersByType = {}; 19 } 20 21 /** 22 * Adds an event listener on this object 23 * @method 24 * @memberof WPGMZA.EventDispatcher 25 * @param {string} type The event type, or multiple types separated by spaces 26 * @param {function} callback The callback to call when the event fires 27 * @param {object} [thisObject] The object to use as "this" when firing the callback 28 * @param {bool} [useCapture] If true, fires the callback on the capture phase, as opposed to bubble phase 29 */ 30 WPGMZA.EventDispatcher.prototype.addEventListener = function(type, listener, thisObject, useCapture) 31 { 32 var types = type.split(/\s+/); 33 if(types.length > 1) 34 { 35 for(var i = 0; i < types.length; i++) 36 this.addEventListener(types[i], listener, thisObject, useCapture); 37 38 return; 39 } 40 41 if(!(listener instanceof Function)) 42 throw new Error("Listener must be a function"); 43 44 var target; 45 if(!this._listenersByType.hasOwnProperty(type)) 46 target = this._listenersByType[type] = []; 47 else 48 target = this._listenersByType[type]; 49 50 var obj = { 51 listener: listener, 52 thisObject: (thisObject ? thisObject : this), 53 useCapture: (useCapture ? true : false) 54 }; 55 56 target.push(obj); 57 } 58 59 /** 60 * Alias for addEventListener 61 * @method 62 * @memberof WPGMZA.EventDispatcher 63 * @see WPGMZA.EventDispatcher#addEventListener 64 */ 65 WPGMZA.EventDispatcher.prototype.on = WPGMZA.EventDispatcher.prototype.addEventListener; 66 67 /** 68 * Removes event listeners from this object 69 * @method 70 * @memberof WPGMZA.EventDispatcher 71 * @param {string} type The event type to remove listeners from 72 * @param {function} [listener] The function to remove. If omitted, all listeners will be removed 73 * @param {object} [thisObject] Use the parameter to remove listeners bound with the same thisObject 74 * @param {bool} [useCapture] Remove the capture phase event listener. Otherwise, the bubble phase event listener will be removed. 75 */ 76 WPGMZA.EventDispatcher.prototype.removeEventListener = function(type, listener, thisObject, useCapture) 77 { 78 var arr, index, obj; 79 80 if(!(arr = this._listenersByType[type])) 81 return; 82 83 if(!thisObject) 84 thisObject = this; 85 86 useCapture = (useCapture ? true : false); 87 88 for(var i = 0; i < arr.length; i++) 89 { 90 obj = arr[i]; 91 92 if((arguments.length == 1 || obj.listener == listener) && obj.thisObject == thisObject && obj.useCapture == useCapture) 93 { 94 arr.splice(i, 1); 95 return; 96 } 97 } 98 } 99 100 /** 101 * Alias for removeEventListener 102 * @method 103 * @memberof WPGMZA.EventDispatcher 104 * @see WPGMZA.EventDispatcher#removeEventListener 105 */ 106 WPGMZA.EventDispatcher.prototype.off = WPGMZA.EventDispatcher.prototype.removeEventListener; 107 108 /** 109 * Test for listeners of type on this object 110 * @method 111 * @memberof WPGMZA.EventDispatcher 112 * @param {string} type The event type to test for 113 * @return {bool} True if this object has listeners bound for the specified type 114 */ 115 WPGMZA.EventDispatcher.prototype.hasEventListener = function(type) 116 { 117 return (_listenersByType[type] ? true : false); 118 } 119 120 /** 121 * Fires an event on this object 122 * @method 123 * @memberof WPGMZA.EventDispatcher 124 * @param {string|WPGMZA.Event} event Either the event type as a string, or an instance of WPGMZA.Event 125 */ 126 WPGMZA.EventDispatcher.prototype.dispatchEvent = function(event) { 127 128 if(!(event instanceof WPGMZA.Event)) { 129 if(typeof event == "string") 130 event = new WPGMZA.Event(event); 131 else 132 { 133 var src = event; 134 event = new WPGMZA.Event(); 135 for(var name in src) 136 event[name] = src[name]; 137 } 138 } 139 140 141 142 event.target = this; 143 144 var path = []; 145 for(var obj = this.parent; obj != null; obj = obj.parent) 146 path.unshift(obj); 147 148 event.phase = WPGMZA.Event.CAPTURING_PHASE; 149 for(var i = 0; i < path.length && !event._cancelled; i++) 150 path[i]._triggerListeners(event); 151 152 if(event._cancelled) 153 return; 154 155 event.phase = WPGMZA.Event.AT_TARGET; 156 this._triggerListeners(event); 157 158 event.phase = WPGMZA.Event.BUBBLING_PHASE; 159 for(i = path.length - 1; i >= 0 && !event._cancelled; i--) 160 path[i]._triggerListeners(event); 161 162 // Native DOM event 163 var topMostElement = this.element; 164 for(var obj = this.parent; obj != null; obj = obj.parent) 165 { 166 if(obj.element) 167 topMostElement = obj.element; 168 } 169 170 if(topMostElement) 171 { 172 var customEvent = {}; 173 174 for(var key in event) 175 { 176 var value = event[key]; 177 178 if(key == "type") 179 value += ".wpgmza"; 180
181 customEvent[key] = value; 182 } 183 $(topMostElement).trigger(customEvent); 184 } 185 } 186 187 /** 188 * Alias for removeEventListener 189 * @method 190 * @memberof WPGMZA.EventDispatcher 191 * @see WPGMZA.EventDispatcher#removeEventListener 192 */ 193 WPGMZA.EventDispatcher.prototype.trigger = WPGMZA.EventDispatcher.prototype.dispatchEvent; 194 195 /** 196 * Handles the logic of triggering listeners 197 * @method 198 * @memberof WPGMZA.EventDispatcher 199 * @inner 200 */ 201 WPGMZA.EventDispatcher.prototype._triggerListeners = function(event) 202 { 203 var arr, obj; 204 205 if(!(arr = this._listenersByType[event.type])) 206 return; 207 208 for(var i = 0; i < arr.length; i++) 209 { 210 obj = arr[i]; 211 212 if(event.phase == WPGMZA.Event.CAPTURING_PHASE && !obj.useCapture) 213 continue; 214 215 obj.listener.call(arr[i].thisObject, event); 216 } 217 } 218 219 WPGMZA.events = new WPGMZA.EventDispatcher(); 220 221});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.