patch for #621 - assign items in the elements hash table a unique cacheID instead of relying on the element's actual 'id' property. thx for thorough review sde

git-svn-id: http://svn.openlayers.org/trunk/openlayers@2993 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
euzuro
2007-04-03 16:54:14 +00:00
parent 140090ec20
commit 10b5c2df17
2 changed files with 128 additions and 22 deletions

View File

@@ -10,7 +10,8 @@
*/
OpenLayers.Event = {
/** A hashtable cache of the event observers, keyed by element.id
/** A hashtable cache of the event observers.
* Keyed by element._eventCacheID
*
* @type Object
*/
@@ -118,14 +119,25 @@ OpenLayers.Event = {
if (!this.observers) {
this.observers = new Object();
}
//if not already assigned, make a new unique cache ID
if (!element._eventCacheID) {
var idPrefix = "eventCacheID_";
if (element.id) {
idPrefix = element.id + "_" + idPrefix;
}
element._eventCacheID = OpenLayers.Util.createUniqueID(idPrefix);
}
var cacheID = element._eventCacheID;
//if there is not yet a hash entry for this element, add one
if (!this.observers[element.id]) {
this.observers[element.id] = new Array();
if (!this.observers[cacheID]) {
this.observers[cacheID] = new Array();
}
//add a new observer to this element's list
this.observers[element.id].push({
this.observers[cacheID].push({
'element': element,
'name': name,
'observer': observer,
@@ -147,23 +159,28 @@ OpenLayers.Event = {
* @param {DOMElement || String} elementParam
*/
stopObservingElement: function(elementParam) {
var element = OpenLayers.Util.getElement(elementParam);
var cacheID = element._eventCacheID;
var elementId = (typeof elementParam == "string") ? elementParam
: OpenLayers.Util.getElement(elementParam).id;
this._removeElementObservers(OpenLayers.Event.observers[cacheID]);
},
var elementObservers = OpenLayers.Event.observers[elementId];
/**
* @private
*
* @param {Array(Object)} elementObservers Array of (element, name,
* observer, usecapture) objects,
* taken directly from hashtable
*/
_removeElementObservers: function(elementObservers) {
if (elementObservers) {
var i=0;
while(i < elementObservers.length) {
var entry = elementObservers[0];
for(var i = elementObservers.length-1; i >= 0; i--) {
var entry = elementObservers[i];
var args = new Array(entry.element,
entry.name,
entry.observer,
entry.useCapture);
var removed = OpenLayers.Event.stopObserving.apply(this, args);
if (!removed) {
i++;
}
}
}
},
@@ -181,8 +198,7 @@ OpenLayers.Event = {
useCapture = useCapture || false;
var element = OpenLayers.Util.getElement(elementParam);
var elementId = (typeof elementParam == "string") ? elementParam
: element.id;
var cacheID = element._eventCacheID;
if (name == 'keypress') {
if ( navigator.appVersion.match(/Konqueror|Safari|KHTML/) ||
@@ -193,7 +209,7 @@ OpenLayers.Event = {
// find element's entry in this.observers cache and remove it
var foundEntry = false;
var elementObservers = OpenLayers.Event.observers[elementId];
var elementObservers = OpenLayers.Event.observers[cacheID];
if (elementObservers) {
// find the specific event type in the element's list
@@ -207,7 +223,7 @@ OpenLayers.Event = {
elementObservers.splice(i, 1);
if (elementObservers.length == 0) {
delete OpenLayers.Event.observers[element.id];
delete OpenLayers.Event.observers[cacheID];
}
foundEntry = true;
break;
@@ -230,8 +246,10 @@ OpenLayers.Event = {
*/
unloadCache: function() {
if (OpenLayers.Event.observers) {
for (var elementId in OpenLayers.Event.observers) {
OpenLayers.Event.stopObservingElement.apply(this, [elementId]);
for (var cacheID in OpenLayers.Event.observers) {
var elementObservers = OpenLayers.Event.observers[cacheID];
OpenLayers.Event._removeElementObservers.apply(this,
[elementObservers]);
}
OpenLayers.Event.observers = false;
}