Mar 5, 2010

$(fn)

In jQuery, $(fn) is a short cut to $.fn.ready(fn). First you call the $.fn.ready(fn), in the function it call jQuery.bindReady() first, then add the fn to a readyList. In the jQuery.bindReady() function, it try to hookup DOMContentLoaded handler, in IE the event is called onreadystatechange. In the DOMContentLoaded handler, it call the jQuery.ready() function, in side of this function, the function in the readyList is invoked

if ( jQuery.isFunction( selector ) ) {
  rootjQuery.ready( selector );
}

ready: function( fn ) {
        // before hookup event, bind the real event first
 // 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 if ( readyList ) {
  // Add the function to the wait list
  readyList.push( fn );
 }

 return this;
},

bindReady: function() {
    //ensure this method is only run once
 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", DOMContentLoaded, 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", DOMContentLoaded);
  
  // 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 ) {
   doScrollCheck();
  }
 }
},

if ( document.addEventListener ) {
 DOMContentLoaded = function() {
  document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
  jQuery.ready();
 };

} else if ( document.attachEvent ) {
 DOMContentLoaded = function() {
  // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
  if ( document.readyState === "complete" ) {
   document.detachEvent( "onreadystatechange", DOMContentLoaded );
   jQuery.ready();
  }
 };
}