From 00a0abb751055964e9f1de202540a11e545f73d6 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 7 Dec 2009 16:34:55 -0800 Subject: [PATCH] Moved .ready() to core.js from event.js. --- src/core.js | 123 +++++++++++++++++++++++++++++++++++++++++++++++++ src/event.js | 117 +--------------------------------------------- src/support.js | 2 - 3 files changed, 124 insertions(+), 118 deletions(-) diff --git a/src/core.js b/src/core.js index c865bfb9..26f6e924 100644 --- a/src/core.js +++ b/src/core.js @@ -36,6 +36,12 @@ var jQuery = function( selector, context ) { // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent.toLowerCase(), + + // Has the ready events already been bound? + readyBound = false, + + // The functions to execute on DOM ready + readyList = [], // Save a reference to some core methods toString = Object.prototype.toString, @@ -225,6 +231,24 @@ jQuery.fn = jQuery.prototype = { is: function( selector ) { return !!selector && jQuery.filter( selector, this ).length > 0; }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // If the DOM is already ready + if ( jQuery.isReady ) { + // Execute the function immediately + fn.call( document, jQuery ); + + // Otherwise, remember the function for later + } else { + // Add the function to the wait list + readyList.push( fn ); + } + + return this; + }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. @@ -302,6 +326,105 @@ jQuery.extend({ return jQuery; }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // Handle when the DOM is ready + ready: function() { + // Make sure that the DOM is not already loaded + if ( !jQuery.isReady ) { + if ( !document.body ) { + return setTimeout( jQuery.ready, 13 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If there are functions bound, to execute + if ( readyList ) { + // Execute all of them + var fn, i = 0; + while ( (fn = readyList[ i++ ]) ) { + fn.call( document, jQuery ); + } + + // Reset the list of functions + readyList = null; + } + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyBound ) { return; } + readyBound = true; + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + return jQuery.ready(); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", function() { + document.removeEventListener( "DOMContentLoaded", arguments.callee, false ); + jQuery.ready(); + }, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent("onreadystatechange", function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", arguments.callee ); + jQuery.ready(); + } + }); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e){} + + if ( document.documentElement.doScroll && toplevel ) { + (function() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch( error ) { + setTimeout( arguments.callee, 0 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); + })(); + } + } + }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert diff --git a/src/event.js b/src/event.js index 26f23409..d59ef64d 100644 --- a/src/event.js +++ b/src/event.js @@ -405,7 +405,7 @@ jQuery.event = { special: { ready: { // Make sure the ready event is setup - setup: bindReady, + setup: jQuery.bindReady, teardown: function() {} }, @@ -797,24 +797,6 @@ jQuery.fn.extend({ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); }, - ready: function( fn ) { - // Attach the listeners - bindReady(); - - // If the DOM is already ready - if ( jQuery.isReady ) { - // Execute the function immediately - fn.call( document, jQuery ); - - // Otherwise, remember the function for later - } else { - // Add the function to the wait list - jQuery.readyList.push( fn ); - } - - return this; - }, - live: function( type, data, fn, thisObject ) { if ( jQuery.isFunction( data ) ) { if ( fn !== undefined ) { @@ -895,103 +877,6 @@ function liveConvert( type, selector ) { .replace(/ /g, "|")].join("."); } -jQuery.extend({ - isReady: false, - readyList: [], - // Handle when the DOM is ready - ready: function() { - // Make sure that the DOM is not already loaded - if ( !jQuery.isReady ) { - if ( !document.body ) { - return setTimeout( jQuery.ready, 13 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If there are functions bound, to execute - if ( jQuery.readyList ) { - // Execute all of them - var fn, i = 0; - while ( (fn = jQuery.readyList[ i++ ]) ) { - fn.call( document, jQuery ); - } - - // Reset the list of functions - jQuery.readyList = null; - } - - // Trigger any bound ready events - jQuery( document ).triggerHandler( "ready" ); - } - } -}); - -var readyBound = false; - -function bindReady() { - if ( readyBound ) { return; } - readyBound = true; - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - return jQuery.ready(); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", function() { - document.removeEventListener( "DOMContentLoaded", arguments.callee, false ); - jQuery.ready(); - }, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent("onreadystatechange", function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", arguments.callee ); - jQuery.ready(); - } - }); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e){} - - if ( document.documentElement.doScroll && toplevel ) { - (function() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch( error ) { - 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 ); -} - jQuery.each( ("blur focus load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { diff --git a/src/support.js b/src/support.js index b7da5e5b..8e8d20e0 100644 --- a/src/support.js +++ b/src/support.js @@ -82,7 +82,6 @@ // Figure out if the W3C box model works as expected // document.body must exist before we can do this // TODO: This timeout is temporary until I move ready into core.js. - setTimeout(function(){ jQuery(function(){ var div = document.createElement("div"); div.style.width = div.style.paddingLeft = "1px"; @@ -92,7 +91,6 @@ document.body.removeChild( div ).style.display = 'none'; div = null; }); - }, 13); // Technique from Juriy Zaytsev // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/