From 04194554738f8e2676f5d7876f5b78b12dbc2679 Mon Sep 17 00:00:00 2001 From: David Serduke Date: Thu, 20 Dec 2007 06:00:01 +0000 Subject: [PATCH] Changed the $(document).ready() code to try and solve some problems in Safari, Opera, and IE. --- src/event.js | 47 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/src/event.js b/src/event.js index fa8be8d2..39ec527c 100644 --- a/src/event.js +++ b/src/event.js @@ -489,27 +489,58 @@ function bindReady(){ if ( readyBound ) return; readyBound = true; - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) + // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event + if ( document.addEventListener && !jQuery.browser.opera) // Use the handy event callback document.addEventListener( "DOMContentLoaded", jQuery.ready, false ); - // If Safari or IE is used + // If IE is used and is not in a frame // Continually check to see if the document is ready - if (jQuery.browser.msie || jQuery.browser.safari ) (function(){ + if ( jQuery.browser.msie && window == top ) (function(){ + if (jQuery.isReady) return; try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ - if ( jQuery.browser.msie || document.readyState != "loaded" && document.readyState != "complete" ) - document.documentElement.doScroll("left"); + document.documentElement.doScroll("left"); } catch( error ) { - return setTimeout( arguments.callee, 0 ); + setTimeout( arguments.callee, 0 ); + return; } - // and execute any waiting functions jQuery.ready(); })(); + if ( jQuery.browser.opera ) + document.addEventListener( "DOMContentLoaded", function () { + if (jQuery.isReady) return; + for (var i = 0; i < document.styleSheets.length; i++) + if (document.styleSheets[i].disabled) { + setTimeout( arguments.callee, 0 ); + return; + } + // and execute any waiting functions + jQuery.ready(); + }, false); + + if ( jQuery.browser.safari ) { + var numStyles; + (function(){ + if (jQuery.isReady) return; + if ( document.readyState != "loaded" && document.readyState != "complete" ) { + setTimeout( arguments.callee, 0 ); + return; + } + if ( numStyles === undefined ) + numStyles = jQuery("style, link[rel=stylesheet]").length; + if ( document.styleSheets.length != numStyles ) { + setTimeout( arguments.callee, 0 ); + return; + } + // and execute any waiting functions + jQuery.ready(); + })(); + } + // A fallback to window.onload, that will always work jQuery.event.add( window, "load", jQuery.ready ); }