The most obvious cause of this error is that you forgot to include jQuery before you used it, but there are also more subtle causes that you’ll not see until you deploy your site to production.
If you are using a CDN-hosted version of jQuery such as Google’s Hosted Libraries, these CDNs might be blocked by a filter or proxy service on your customers’ connection. We typically see this issue with requests originating from Chinese or Indonesian IP addresses.
Another common example of this bug is when the CDN hosting your jQuery script is unreliable or slow to load. Browsers typically have a timeout of around 20-30 seconds for each script tag.
Luckily there is a simple solution to most of these issues. You can easily provide a locally-hosted fallback version of jQuery as follows:
###// First try loading jQuery from Google's CDN
###// Fall back to a local copy of jQuery if the CDN fails
window.jQuery || document.write('<script src="http://mysite.com/jquery.min.js"><\/script>'))
If you have a Rails app, you can alternatively use the jquery-rails gem, which automates this fallback process for you.
This technique is used on many popular sites, including jquery.com, and solves most #jQuery is not defined errors. If the CDN jQuery fails load, it will almost certainly load fine from your own domain, but you’ll also see the benefits of using a CDN-hosted jQuery for most of your users.
Editor’s Note: This blog was originally published in February 2014 and has been updated for accuracy.