views:

64

answers:

2

I'm trying to duplicate the tabs demo from the jQuery website. The sample page I'm working with is: http://yazminmedia.com/playground/jquerytabs.html

I'd like to use the Google Code Repository to take advantage of the caching. I have the following code in the head of my page:

<script type="text/javascript" src="http://www.google.com/jsapi"&gt;&lt;/script&gt;

<script type="text/javascript">
google.load("jquery", "1");
google.load("jqueryui", "1");

$(function() {
  $("#tabs").tabs();
});
</script>

However, I keep getting the following error - "$ is not defined" for the following line:

$(function() {

Does anyone have any idea what might be going on that is causing the error?

Thanks!

A: 

For some reason I got the same error

I got away with it by adding this script to every page

<script language="javascript" type="text/javascript">
    $j = jQuery.noConflict();
</script>

then using

$j("#tabs").tabs();
Eric
A: 

google.load injects a script element right after itself. So the order in which script tags appear is:

// google loads first
<script src="http://www.google.com/jsapi"&gt;&lt;/script&gt;

// ask "google" to load jQuery and jQuery UI
<script>
    google.load("jquery", "1");
    google.load("jqueryui", "1");

    // try to use $
    $(function() {
        $("#tabs").tabs();
    });
</script>

// But, jQuery gets included here (after its usage)
<script src="jquery.min.js"></script>

// and jQuery UI gets included here
<script src="jquery-ui.min.js"></script>

Since the usage of $ appears before jQuery is included in document order, $ will not be defined in the second step.

A solution is to break apart the script tags, so that google.load statements appear in their own script tags. So instead if you replace your code with:

<script>
    google.load("jquery", "1");
    google.load("jqueryui", "1");
</script>

<script>
    $(function() {
        $("#tabs").tabs();
    });
</script>

The order of script tags in the document now will be:

// first google loads
<script src="http://www.google.com/jsapi"&gt;&lt;/script&gt;

// then we ask "google" to load jQuery and jQuery UI
<script>
    google.load("jquery", "1");
    google.load("jqueryui", "1");
</script>

// jQuery loads
<script src="jquery.min.js"></script>

// jQuery UI loads
<script src=".../jquery-ui.min.js"></script>

// now our script can run smoothly
<script>
    $(function() {
        alert($("h1").text());
    });
</script>

Note that the script element containing your jQuery code now appears after jQuery, so your code should work and $ or jQuery should be defined from that point thereon.


However, instead of relying on the behavior of google's loading order, a better solution is to either use the direct links for the libraries, or use a callback.

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;&lt;/script&gt;
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.min.js"&gt;&lt;/script&gt;
<script>
    // your jQuery code follows
</script>

Or, use the onLoad callback:

google.load("jquery", "1");
google.load("jqueryui", "1");

google.setOnLoadCallback(function() {
    // jQuery should be define here
    $(function() {
        alert($("h1").text());
    });
});
Anurag
Thank you so much for this explanation! I was racking my brain trying to search for why it wasn't working. I also appreciate the suggestion for replacement code.
Yazmin