make stopObserving/stopObservingElement more resilient: can accept either

elements or ids. Closes #603 (and makes #604 work).


git-svn-id: http://svn.openlayers.org/trunk/openlayers@2946 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
crschmidt
2007-03-31 19:46:04 +00:00
parent 1dea6430cd
commit 53b23bdf37
+38 -34
View File
@@ -88,9 +88,13 @@ OpenLayers.Event = {
* element's cached observers, calling stopObserving on each one, * element's cached observers, calling stopObserving on each one,
* skipping those entries which can no longer be removed. * skipping those entries which can no longer be removed.
* *
* @param {String} elementId * @param {DOMElement || String} elementParam
*/ */
stopObservingElement: function(elementId) { stopObservingElement: function(elementParam) {
var elementId = (typeof elementParam == "string") ? elementParam
: OpenLayers.Util.getElement(elementParam).id;
var elementObservers = OpenLayers.Event.observers[elementId]; var elementObservers = OpenLayers.Event.observers[elementId];
if (elementObservers) { if (elementObservers) {
var i=0; var i=0;
@@ -141,49 +145,49 @@ OpenLayers.Event = {
* @type Boolean * @type Boolean
*/ */
stopObserving: function(elementParam, name, observer, useCapture) { stopObserving: function(elementParam, name, observer, useCapture) {
var foundEntry = false; useCapture = useCapture || false;
var element = OpenLayers.Util.getElement(elementParam); var element = OpenLayers.Util.getElement(elementParam);
if (element) { var elementId = (typeof elementParam == "string") ? elementParam
: element.id;
useCapture = useCapture || false; if (name == 'keypress') {
if ( navigator.appVersion.match(/Konqueror|Safari|KHTML/) ||
if (name == 'keypress') { element.detachEvent) {
if ( navigator.appVersion.match(/Konqueror|Safari|KHTML/) || name = 'keydown';
element.detachEvent) {
name = 'keydown';
}
} }
}
// find element's entry in this.observers cache and remove it // find element's entry in this.observers cache and remove it
var elementObservers = OpenLayers.Event.observers[element.id]; var foundEntry = false;
if (elementObservers) { var elementObservers = OpenLayers.Event.observers[elementId];
if (elementObservers) {
// find the specific event type in the element's list // find the specific event type in the element's list
var i=0; var i=0;
while(!foundEntry && i < elementObservers.length) { while(!foundEntry && i < elementObservers.length) {
var cacheEntry = elementObservers[i]; var cacheEntry = elementObservers[i];
if ((cacheEntry.name == name) && if ((cacheEntry.name == name) &&
(cacheEntry.observer == observer) && (cacheEntry.observer == observer) &&
(cacheEntry.useCapture == useCapture)) { (cacheEntry.useCapture == useCapture)) {
elementObservers.splice(i, 1); elementObservers.splice(i, 1);
if (elementObservers.length == 0) { if (elementObservers.length == 0) {
delete OpenLayers.Event.observers[element.id]; delete OpenLayers.Event.observers[element.id];
}
foundEntry = true;
break;
} }
i++; foundEntry = true;
break;
} }
i++;
} }
}
//actually remove the event listener from browser //actually remove the event listener from browser
if (element.removeEventListener) { if (element.removeEventListener) {
element.removeEventListener(name, observer, useCapture); element.removeEventListener(name, observer, useCapture);
} else if (element && element.detachEvent) { } else if (element && element.detachEvent) {
element.detachEvent('on' + name, observer); element.detachEvent('on' + name, observer);
}
} }
return foundEntry; return foundEntry;
}, },