Changeset 2896
- Timestamp:
- 03/26/07 13:33:35 (2 years ago)
- Files:
-
- trunk/openlayers/doc/authors.txt (modified) (1 diff)
- trunk/openlayers/lib/OpenLayers/Events.js (modified) (4 diffs)
- trunk/openlayers/tests/test_Events.html (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/openlayers/doc/authors.txt
r2892 r2896 14 14 Cameron Shorter 15 15 Paul Spencer 16 James Stembridge 16 17 Erik Uzureau 17 18 Bill Woodall trunk/openlayers/lib/OpenLayers/Events.js
r2873 r2896 56 56 }, 57 57 58 /** A hashtable cach of the event observers, keyed by element.id 59 * 60 * @type Object 61 */ 58 62 observers: false, 59 63 60 64 _observeAndCache: function(element, name, observer, useCapture) { 61 if (!this.observers) this.observers = []; 65 if (!this.observers) this.observers = new Object(); 66 67 //if there is not yet a hash entry for this element, add one 68 if (!this.observers[element.id]) { 69 this.observers[element.id] = new Array(); 70 } 71 //add a new observer to this element's list 72 this.observers[element.id].push([name, observer, useCapture]); 73 74 //add the actual browser event listener 62 75 if (element.addEventListener) { 63 this.observers.push([element, name, observer, useCapture]);64 76 element.addEventListener(name, observer, useCapture); 65 77 } else if (element.attachEvent) { 66 this.observers.push([element, name, observer, useCapture]);67 78 element.attachEvent('on' + name, observer); 68 79 } … … 71 82 unloadCache: function() { 72 83 if (!OpenLayers.Event.observers) return; 73 for (var i = 0; i < OpenLayers.Event.observers.length; i++) { 74 OpenLayers.Event.stopObserving.apply(this, OpenLayers.Event.observers[i]); 84 for (var elementId in OpenLayers.Event.observers) { 85 var elementObservers = OpenLayers.Event.observers[elementId]; 86 if (elementObservers) { 87 for (var i = 0; i < elementObservers.length; i++) { 88 var args = new Array(elementId).concat(elementObservers[i]); 89 OpenLayers.Event.stopObserving.apply(this, args); 90 } 91 } 75 92 } 76 93 OpenLayers.Event.observers = false; … … 91 108 stopObserving: function(elementParam, name, observer, useCapture) { 92 109 var element = OpenLayers.Util.getElement(elementParam); 110 if (!element) return; 111 93 112 useCapture = useCapture || false; 94 113 … … 98 117 name = 'keydown'; 99 118 100 // find entry in this.observers cache array and remove it 101 var observers = OpenLayers.Event.observers; 102 var entry = [element, name, observer, useCapture]; 103 for (var i = 0; i < observers.length; i++) { 104 105 //compare all 4 elements of entry with observer 106 var sameEntry = true; 107 for (var j = 0; j < entry.length; j++) { 108 if (entry[j] != observers[i][j]) { 109 sameEntry = false; 110 break; 111 } 112 } 113 114 //if we've found it, remove it from the observers array 115 if (sameEntry) { 116 observers.splice(i--, 1); 117 break; 118 } 119 } 120 121 if (element && element.removeEventListener) { 119 // find element's entry in this.observers cache and remove it 120 var elementObservers = OpenLayers.Event.observers[element.id]; 121 if (elementObservers) { 122 var entry = [name, observer, useCapture]; 123 124 // find the specific event type in the element's list 125 for (var i = 0; i < elementObservers.length; i++) { 126 var cacheEntry = elementObservers[i]; 127 128 //compare all 3 elements of entry with observer 129 var sameEntry = true; 130 for (var j = 0; j < entry.length; j++) { 131 if (entry[j] != cacheEntry[j]) { 132 sameEntry = false; 133 break; 134 } 135 } 136 137 //if we've found it, remove it from the observers array 138 if (sameEntry) { 139 elementObservers.splice(i--, 1); 140 if (elementObservers.length == 0) { 141 OpenLayers.Event.observers[element.id] = null; 142 } 143 break; 144 } 145 } 146 } 147 148 //actually remove the event listener from browser 149 if (element.removeEventListener) { 122 150 element.removeEventListener(name, observer, useCapture); 123 151 } else if (element && element.detachEvent) { trunk/openlayers/tests/test_Events.html
r2894 r2896 205 205 function test_05_Event_destroy (t) { 206 206 t.plan(2); 207 var start = OpenLayers.Event.observers.length; 207 208 208 var div = OpenLayers.Util.getElement('test'); 209 209 var obj = {}; 210 210 var events = new OpenLayers.Events(obj, div); 211 211 // +1 because of blocking dragstart in attachToElement() 212 t.eq(OpenLayers.Event.observers.length, 213 start + OpenLayers.Events.prototype.BROWSER_EVENTS.length + 1, 214 "construction increases the number of event observers"); 212 t.eq(OpenLayers.Event.observers["test"].length, 213 OpenLayers.Events.prototype.BROWSER_EVENTS.length + 1, 214 "construction creates new arrayin hash, registers appropriate events"); 215 215 216 events.destroy(); 216 217 events = null; 217 t.eq(OpenLayers.Event.observers .length, start,218 "destruction re stores the number of event observers");218 t.eq(OpenLayers.Event.observers["test"], null, 219 "destruction removes the event observer from hash"); 219 220 } 220 221
