Skip to content

Commit

Permalink
Moved .ready() to core.js from event.js.
Browse files Browse the repository at this point in the history
  • Loading branch information
jeresig committed Dec 8, 2009
1 parent 872d18c commit 00a0abb
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 118 deletions.
123 changes: 123 additions & 0 deletions src/core.js
Expand Up @@ -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,
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down
117 changes: 1 addition & 116 deletions src/event.js
Expand Up @@ -405,7 +405,7 @@ jQuery.event = {
special: {
ready: {
// Make sure the ready event is setup
setup: bindReady,
setup: jQuery.bindReady,
teardown: function() {}
},

Expand Down Expand Up @@ -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 ) {
Expand Down Expand Up @@ -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 ) {
Expand Down
2 changes: 0 additions & 2 deletions src/support.js
Expand Up @@ -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";
Expand All @@ -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/
Expand Down

0 comments on commit 00a0abb

Please sign in to comment.