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
+44 -40
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);
if (element) {
useCapture = useCapture || false; var element = OpenLayers.Util.getElement(elementParam);
var elementId = (typeof elementParam == "string") ? elementParam
if (name == 'keypress') { : element.id;
if ( navigator.appVersion.match(/Konqueror|Safari|KHTML/) ||
element.detachEvent) { if (name == 'keypress') {
name = 'keydown'; if ( navigator.appVersion.match(/Konqueror|Safari|KHTML/) ||
} element.detachEvent) {
name = 'keydown';
} }
}
// find element's entry in this.observers cache and remove it
var elementObservers = OpenLayers.Event.observers[element.id]; // find element's entry in this.observers cache and remove it
if (elementObservers) { var foundEntry = false;
var elementObservers = OpenLayers.Event.observers[elementId];
// find the specific event type in the element's list if (elementObservers) {
var i=0;
while(!foundEntry && i < elementObservers.length) { // find the specific event type in the element's list
var cacheEntry = elementObservers[i]; var i=0;
while(!foundEntry && i < elementObservers.length) {
if ((cacheEntry.name == name) && var cacheEntry = elementObservers[i];
(cacheEntry.observer == observer) &&
(cacheEntry.useCapture == useCapture)) { if ((cacheEntry.name == name) &&
(cacheEntry.observer == observer) &&
elementObservers.splice(i, 1); (cacheEntry.useCapture == useCapture)) {
if (elementObservers.length == 0) {
delete OpenLayers.Event.observers[element.id]; elementObservers.splice(i, 1);
} if (elementObservers.length == 0) {
foundEntry = true; delete OpenLayers.Event.observers[element.id];
break;
} }
i++; foundEntry = true;
break;
} }
i++;
} }
}
//actually remove the event listener from browser
if (element.removeEventListener) { //actually remove the event listener from browser
element.removeEventListener(name, observer, useCapture); if (element.removeEventListener) {
} else if (element && element.detachEvent) { element.removeEventListener(name, observer, useCapture);
element.detachEvent('on' + name, observer); } else if (element && element.detachEvent) {
} element.detachEvent('on' + name, observer);
} }
return foundEntry; return foundEntry;
}, },