jQuery's Passes Itself As An Argument To The "Ready" Event Callback

Posted September 24, 2009 at 3:02 PM

Tags: Javascript / DHTML

As I read through Cody Lindley's excellent jQuery Enlightenment book, I found myself dog-earing many pages that contained little tips and factoids that I had never seen before. One of these facts was that jQuery passes itself as an argument to the callback methods that you provide in the "ready" event bindings. While this might not seem at first like a useful piece of information, when you are working in an application that has "$" variable conflicts, having jQuery passed itself to your callbacks can make your life a whole lot easier.

To demonstrate this awesomeness, take a look at this code in which the "$" is already being used and must be released via the noConflict() method:

 Launch code in new window » Download code as text file »

  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  • <html>
  • <head>
  • <title>jQuery Ready Event Argument</title>
  • <script type="text/javascript">
  •  
  • // Create a $ variable for conflict.
  • window.$ = "Conflicted$";
  •  
  • </script>
  • <script type="text/javascript" src="jquery-1.3.2.js"></script>
  • <script type="text/javascript">
  •  
  • // Call no-conflict to release jQuery "$" shorthand.
  • jQuery.noConflict();
  •  
  •  
  • // When the document is ready, output the current $ value
  • // to demonstrate that it is no longer jQuery.
  •  
  • jQuery(
  • function(){
  • // This is a check to see if the "$" variable
  • // exists if we are not using it as an argument.
  • document.write(
  • "Current ($): " + $ + "<br />"
  • );
  • }
  • );
  •  
  •  
  • // When you pass your anonymous, callback method to the
  • // document::ready event binding, jQUery passes the
  • // jQuery instance to the callback as an argument.
  •  
  • jQuery( document ).ready(
  • function( $ ){
  •  
  • // Output the jQuery version.
  • document.write( $.fn.jquery + "<br />" );
  •  
  • }
  • );
  •  
  •  
  • // This also works for the short-hand notation in which
  • // a callback method is passed directly to the jQuery
  • // object.
  •  
  • jQuery(
  • function( $ ){
  •  
  • // Output the jQuery version.
  • document.write( $.fn.jquery + "<br />" );
  •  
  • }
  • );
  •  
  • </script>
  • </head>
  • <body>
  • <!--- Body content here. --->
  • </body>
  • </html>

As you can see in the above code, the "$" variable is already being used; as such, jQuery must release its hold on it as the library's short-hand reference. However, because jQuery passes itself to the document::ready event callbacks, as long as we define the callback method parameter as "$", we can use the short-hand reference with impunity. And, in fact, when we run the above code, we get the following output:

Current ($): Conflicted$
1.3.2
1.3.2

Because the callback method parameters are closer in the variable lookup chain to the method body than the window scope, the method body will check the parameters (argument collection) and find the "$" reference before it ever gets to the window scope. This allows our entire callback method to operate under the assumption (fact) that the "$" variable now references the jQuery library.

Download Code Snippet ZIP File

Post Comment  |  Ask Ben  |  Other Searches  |  Print Page




Reader Comments

Sep 24, 2009 at 3:48 PM // reply »
32 Comments

Very cool, Ben. Thanks for sharing.


Sep 24, 2009 at 7:01 PM // reply »
7,486 Comments

@Marc,

Happy to share - I thought it was cool when I read it.


Sep 27, 2009 at 6:23 AM // reply »
8 Comments

@Ben

That is awesome! I run into that problem all of the time as a lot of our older applications run the Prototype library which uses $. I always end up replacing $ to "jQuery" using the noConflict method ... not now though :)

Good tip!


Post Comment  |  Ask Ben

Recent Blog Comments
Mar 11, 2010 at 9:29 PM
Tim Cracked The GMail - CFMailPart Puzzle!
I've been wrestling with the CFMAIL tag and CFMAILPARTS for several days now and have found issues with the CF implementation even in CF9! What I have learned so far is: 1. Using only one CFMAILPART ... read »
Mar 11, 2010 at 6:09 PM
Ask Ben: Building An AJAX, jQuery, And ColdFusion Powered Application
@Eric, Neat trick, I was able to get rid of most of the lines of whitespace following your advice. Some whitespace still remains. With a bit of playing around, I found that the remaining whitespa ... read »
Mar 11, 2010 at 4:56 PM
Ask Ben: Building An AJAX, jQuery, And ColdFusion Powered Application
I've struggled with returning JSON from ColdFusion CFCs for a while because I (mysteriously) get lots of white space/new lines that appear before the actual JSON result (check the response in Firebug ... read »
Mar 11, 2010 at 3:24 PM
Ask Ben: Using jQuery To Act On A Click Event Based On The Target Element
@TripeL, Awesome :) Glad it was helpful. ... read »
Mar 11, 2010 at 3:23 PM
Ask Ben: Using jQuery To Act On A Click Event Based On The Target Element
WOW...that's what I'm looking for. The code examples are very helpful. Thanks ... read »
Mar 11, 2010 at 1:20 PM
What Is The Best Time Of Day To Workout?
Well I am glad I stick to mid afternoon / evening work outs. Interesting find! ... read »
Mar 11, 2010 at 1:13 PM
CFHTTPSession.cfc For Multi-CFHttp Requests With Maintained Session
It worked for what I needed perfectly the first try... this is huge, you have made my week! ... read »
Mar 11, 2010 at 12:54 PM
Using Appropriate Status Codes With Each API Response
I forgot to mention that using this application stack allows me to separate as much of the core/business logic into the API Library which leaves the web applications just to handle presentation layer ... read »