OpenLayers OpenLayers

Changeset 2896

Show
Ignore:
Timestamp:
03/26/07 13:33:35 (2 years ago)
Author:
euzuro
Message:

final patch for #510 -- new datastructure suggested and implemented by james for the events entry cache. speeds up all event operations

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/openlayers/doc/authors.txt

    r2892 r2896  
    1414Cameron Shorter                                                               
    1515Paul Spencer                                                                  
     16James Stembridge 
    1617Erik Uzureau 
    1718Bill Woodall 
  • trunk/openlayers/lib/OpenLayers/Events.js

    r2873 r2896  
    5656  }, 
    5757 
     58  /** A hashtable cach of the event observers, keyed by element.id 
     59   *  
     60   * @type Object 
     61   */ 
    5862  observers: false, 
    5963 
    6064  _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 
    6275    if (element.addEventListener) { 
    63       this.observers.push([element, name, observer, useCapture]); 
    6476      element.addEventListener(name, observer, useCapture); 
    6577    } else if (element.attachEvent) { 
    66       this.observers.push([element, name, observer, useCapture]); 
    6778      element.attachEvent('on' + name, observer); 
    6879    } 
     
    7182  unloadCache: function() { 
    7283    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        } 
    7592    } 
    7693    OpenLayers.Event.observers = false; 
     
    91108  stopObserving: function(elementParam, name, observer, useCapture) { 
    92109    var element = OpenLayers.Util.getElement(elementParam); 
     110    if (!element) return; 
     111 
    93112    useCapture = useCapture || false; 
    94113 
     
    98117      name = 'keydown'; 
    99118 
    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) { 
    122150      element.removeEventListener(name, observer, useCapture); 
    123151    } else if (element && element.detachEvent) { 
  • trunk/openlayers/tests/test_Events.html

    r2894 r2896  
    205205    function test_05_Event_destroy (t) { 
    206206        t.plan(2); 
    207         var start = OpenLayers.Event.observers.length; 
     207 
    208208        var div   = OpenLayers.Util.getElement('test'); 
    209209        var obj   = {}; 
    210210        var events = new OpenLayers.Events(obj, div); 
    211211        // +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              
    215216        events.destroy(); 
    216217        events = null; 
    217         t.eq(OpenLayers.Event.observers.length, start
    218              "destruction restores the number of event observers"); 
     218        t.eq(OpenLayers.Event.observers["test"], null
     219             "destruction removes the event observer from hash"); 
    219220    } 
    220221