Ticket #9394: event.js.patch
| File event.js.patch, 4.0 kB (added by samleb, 4 months ago) |
|---|
-
src/event.js
old new 176 176 function destroyWrapper(id, eventName, handler) { 177 177 var c = getCacheForID(id); 178 178 if (!c[eventName]) return false; 179 var d = c[eventName].dispatcher; 179 180 c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); 181 c[eventName].dispatcher = d; 180 182 } 181 183 182 184 function destroyCache() { … … 200 202 if (element.addEventListener) { 201 203 element.addEventListener(name, wrapper, false); 202 204 } 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 } 204 212 } 205 213 206 214 return element; … … 228 236 229 237 if (element.removeEventListener) { 230 238 element.removeEventListener(name, wrapper, false); 239 destroyWrapper(id, eventName, handler); 231 240 } 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 } 233 247 } 234 248 235 destroyWrapper(id, eventName, handler);236 237 249 return element; 238 250 }, 239 251 … … 282 294 283 295 (function() { 284 296 /* 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. */ 286 298 287 299 var timer; 288 300 289 301 function fireContentLoadedEvent() { 290 302 if (document.loaded) return; 291 if (timer) window.clearInterval(timer);303 if (timer) clearInterval(timer); 292 304 document.fire("dom:loaded"); 293 305 document.loaded = true; 294 306 } 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 }309 307 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 310 316 } 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); 315 320 fireContentLoadedEvent(); 316 321 } 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 } 318 332 } 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); 319 345 })();