OpenLayers OpenLayers

Ticket #568: events.patch

File events.patch, 6.5 kB (added by euzuro, 2 years ago)

this patch was created after laboring over drip.exe all day. it seems to remove the dangling tiles. when the testantoherway tests are run, however, it chokes entirely. we need a better way to do this. do NOT commit this patch.

  • lib/OpenLayers/Events.js

    old new  
    6969        this.observers[element.id] = new Array(); 
    7070    } 
    7171    //add a new observer to this element's list 
    72     this.observers[element.id].push([name, observer, useCapture]); 
     72    this.observers[element.id].push({ 
     73        'element': element, 
     74        'name': name, 
     75        'observer': observer, 
     76        'useCapture': useCapture 
     77    }); 
    7378 
    7479    //add the actual browser event listener 
    7580    if (element.addEventListener) { 
     
    7984    } 
    8085  }, 
    8186 
    82   unloadCache: function() { 
    83     if (!OpenLayers.Event.observers) return; 
    84     for (var elementId in OpenLayers.Event.observers) { 
     87    /** Given the id of an element to stop observing, cycle through the  
     88     *   element's cached observers, calling stopObserving on each one,  
     89     *   skipping those entries which can no longer be removed. 
     90     *  
     91     * @param {String} elementId 
     92     */ 
     93    stopObservingElement: function(elementId) { 
    8594        var elementObservers = OpenLayers.Event.observers[elementId]; 
    8695        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); 
     96            var i=0; 
     97            while(i < elementObservers.length) { 
     98                var entry = elementObservers[0]; 
     99                var args = new Array(entry.element, 
     100                                     entry.name, 
     101                                     entry.observer, 
     102                                     entry.useCapture); 
     103                var removed = OpenLayers.Event.stopObserving.apply(this, args); 
     104                if (!removed) { 
     105                    i++; 
     106                } 
    90107            } 
    91108        } 
    92     } 
    93     OpenLayers.Event.observers = false; 
    94   }, 
     109    }, 
    95110 
     111    /** Cycle through all the element entries in the events cache and call 
     112     *   stopObservingElement on each.  
     113     */ 
     114    unloadCache: function() { 
     115        if (!OpenLayers.Event.observers) return; 
     116        for (var elementId in OpenLayers.Event.observers) { 
     117            OpenLayers.Event.stopObservingElement.apply(this, [elementId]); 
     118        } 
     119        OpenLayers.Event.observers = false; 
     120    }, 
     121 
    96122  observe: function(elementParam, name, observer, useCapture) { 
    97123    var element = OpenLayers.Util.getElement(elementParam); 
    98124    useCapture = useCapture || false; 
     
    105131    this._observeAndCache(element, name, observer, useCapture); 
    106132  }, 
    107133 
    108   stopObserving: function(elementParam, name, observer, useCapture) { 
    109     var element = OpenLayers.Util.getElement(elementParam); 
    110     if (!element) return; 
    111  
    112     useCapture = useCapture || false; 
    113  
    114     if (name == 'keypress' && 
    115         (navigator.appVersion.match(/Konqueror|Safari|KHTML/) 
    116         || element.detachEvent)) 
    117       name = 'keydown'; 
    118  
    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     * @param {DOMElement || String} elementParam 
     136     * @param {String} name 
     137     * @param {function} observer 
     138     * @param {Boolean} useCapture 
     139     *  
     140     * @returns Whether or not the event observer was removed 
     141     * @type Boolean 
     142     */ 
     143    stopObserving: function(elementParam, name, observer, useCapture) { 
     144        var foundEntry = false; 
     145        var element = OpenLayers.Util.getElement(elementParam); 
     146        if (element) { 
     147     
     148            useCapture = useCapture || false; 
     149         
     150            if (name == 'keypress') { 
     151                if ( navigator.appVersion.match(/Konqueror|Safari|KHTML/) ||  
     152                     element.detachEvent) { 
     153                  name = 'keydown'; 
    134154                } 
    135155            } 
    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; 
     156         
     157            // find element's entry in this.observers cache and remove it 
     158            var elementObservers = OpenLayers.Event.observers[element.id]; 
     159            if (elementObservers) { 
     160         
     161                // find the specific event type in the element's list 
     162                var i=0; 
     163                while(!foundEntry && i < elementObservers.length) { 
     164                    var cacheEntry = elementObservers[i]; 
     165         
     166                    if ((cacheEntry.name == name) && 
     167                        (cacheEntry.observer == observer) && 
     168                        (cacheEntry.useCapture == useCapture)) { 
     169         
     170                        elementObservers.splice(i, 1); 
     171                        if (elementObservers.length == 0) { 
     172                            OpenLayers.Event.observers[element.id] = null; 
     173                        } 
     174                        break;  
     175                        foundEntry = true; 
     176                    } 
     177                    i++;            
    142178                } 
    143                 break;  
    144179            } 
     180         
     181            //actually remove the event listener from browser 
     182            if (element.removeEventListener) { 
     183                element.removeEventListener(name, observer, useCapture); 
     184            } else if (element && element.detachEvent) { 
     185                element.detachEvent('on' + name, observer); 
     186            } 
    145187        } 
    146     } 
     188        return foundEntry; 
     189    }, 
     190     
     191    /** @final @type String */ 
     192    CLASS_NAME: "OpenLayers.Event" 
     193}; 
    147194 
    148     //actually remove the event listener from browser 
    149     if (element.removeEventListener) { 
    150       element.removeEventListener(name, observer, useCapture); 
    151     } else if (element && element.detachEvent) { 
    152       element.detachEvent('on' + name, observer); 
    153     } 
    154   } 
    155 }; 
    156195/* prevent memory leaks in IE */ 
    157196OpenLayers.Event.observe(window, 'unload', OpenLayers.Event.unloadCache, false); 
    158197