Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #9394: event.js.patch

File event.js.patch, 4.0 kB (added by samleb, 4 months ago)

Patch for event.js

  • src/event.js

    old new  
    176176  function destroyWrapper(id, eventName, handler) { 
    177177    var c = getCacheForID(id); 
    178178    if (!c[eventName]) return false; 
     179    var d = c[eventName].dispatcher; 
    179180    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); 
     181    c[eventName].dispatcher = d; 
    180182  } 
    181183   
    182184  function destroyCache() { 
     
    200202      if (element.addEventListener) { 
    201203        element.addEventListener(name, wrapper, false); 
    202204      } else { 
    203         element.attachEvent("on" + name, wrapper); 
     205        var wrappers = getWrappersForEventName(getEventID(element), eventName); 
     206        if (!wrappers.dispatcher) { 
     207          wrappers.dispatcher = function(event) { 
     208            wrappers.clone().each(function(wrapper) { wrapper(event) }); 
     209          }; 
     210          element.attachEvent("on" + name, wrappers.dispatcher); 
     211        } 
    204212      } 
    205213       
    206214      return element; 
     
    228236       
    229237      if (element.removeEventListener) { 
    230238        element.removeEventListener(name, wrapper, false); 
     239        destroyWrapper(id, eventName, handler); 
    231240      } else { 
    232         element.detachEvent("on" + name, wrapper); 
     241        destroyWrapper(id, eventName, handler); 
     242        var wrappers = getWrappersForEventName(id, eventName); 
     243        if (!wrappers.length) { 
     244          element.detachEvent("on" + name, wrappers.dispatcher); 
     245          wrappers.dispatcher = null; 
     246        } 
    233247      } 
    234248       
    235       destroyWrapper(id, eventName, handler); 
    236        
    237249      return element; 
    238250    }, 
    239251   
     
    282294 
    283295(function() { 
    284296  /* Support for the DOMContentLoaded event is based on work by Dan Webb,  
    285      Matthias Miller, Dean Edwards and John Resig. */ 
     297     Matthias Miller, Dean Edwards, John Resig and Diego Perini. */ 
    286298 
    287299  var timer; 
    288300   
    289301  function fireContentLoadedEvent() { 
    290302    if (document.loaded) return; 
    291     if (timer) window.clearInterval(timer); 
     303    if (timer) clearInterval(timer); 
    292304    document.fire("dom:loaded"); 
    293305    document.loaded = true; 
    294306  } 
    295    
    296   if (document.addEventListener) { 
    297     if (Prototype.Browser.WebKit) { 
    298       timer = window.setInterval(function() { 
    299         if (/loaded|complete/.test(document.readyState)) 
    300           fireContentLoadedEvent(); 
    301       }, 0); 
    302        
    303       Event.observe(window, "load", fireContentLoadedEvent); 
    304        
    305     } else { 
    306       document.addEventListener("DOMContentLoaded",  
    307         fireContentLoadedEvent, false); 
    308     } 
    309307     
     308  if (document.addEventListener) {     
     309    document.addEventListener("DOMContentLoaded", function() { 
     310      // ensure all stylesheets are loaded, solve Opera issue 
     311      if ($A(document.styleSheets).any(function(s) { return s.disabled })) 
     312        return arguments.callee.defer(); 
     313      fireContentLoadedEvent(); 
     314    }, false); 
     315     
    310316  } else { 
    311     document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>"); 
    312     $("__onDOMContentLoaded").onreadystatechange = function() {  
    313       if (this.readyState == "complete") { 
    314         this.onreadystatechange = null;  
     317    document.attachEvent("onreadystatechange", function() { 
     318      if (document.readyState == "complete") { 
     319        document.detachEvent("onreadystatechange", arguments.callee); 
    315320        fireContentLoadedEvent(); 
    316321      } 
    317     };  
     322    }); 
     323     
     324    if (window == top) { 
     325      timer = setInterval(function() { 
     326        try { 
     327          document.documentElement.doScroll("left"); 
     328        } catch(e) { return }; 
     329        fireContentLoadedEvent(); 
     330      }, 20); 
     331    } 
    318332  } 
     333   
     334  // Only WebKit nightly builds support DOMContentLoaded 
     335  if (Prototype.Browser.WebKit) { 
     336    timer = setInterval(function() { 
     337      if (/loaded|complete/.test(document.readyState) &&  
     338          document.styleSheets.length == $$('style, link[rel="stylesheet"]').length) 
     339        fireContentLoadedEvent(); 
     340    }, 0);  
     341  } 
     342   
     343  // Worst case fallback... 
     344  Event.observe(window, "load", fireContentLoadedEvent); 
    319345})();