Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difficulty with Django and jQuery (why is $ undefined in the admin app?)

It's been a while since I worked with jQuery; I think I'm making a stupid mistake.

Here is a Django widget:

class FooWidget(Widget):

    # ...

    class Media:
        js = ('js/foowidget.js',)

Here is the .js file:

alert("bar");

$(document).ready(function() {
  alert("omfg");
  $('.foo-widget').click(function() {
    alert("hi");
    return false;
  });
});

alert("foo");

The only alert() that fires is the first. Do I have a stupid syntax error or something?

Also, if some other included script on the page redefines $(document).ready, do I have to worry about it? I'm guessing that subsequent definitions will override mine, so it's safer for subsequent definitions to do something like:

$(document).ready(function() {
    document.ready()
    // real stuff
});

jQuery is already included in the page by the time foowidget.js is.

Update: Based on @lazerscience's link, I tried the following instead, but it still fails just as before:

alert("bar");

$(function() {
  alert("omfg");
  $(".set-widget").click(function() {
    alert("hi");
    return false;
  });
});

alert("foo");

Update 2: Curiously, when I do:

alert($);

I get "undefined". This suggests that jQuery is actually not initialized. This confuses me, because the <head> includes:

<script type="text/javascript" src="/media/js/jquery.min.js"></script>
<script type="text/javascript" src="/media/js/jquery.init.js"></script>
<script type="text/javascript" src="/media/js/actions.min.js"></script>
<script type="text/javascript" src="/static/js/foowidget.js"></script>

Doesn't putting my script after the jQuery scripts ensure that $ will be defined?

Update 3: from jquery.min.js:

/*!
 * jQuery JavaScript Library v1.4.2
 * http://jquery.com/
 *
 * Copyright 2010, John Resig
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 * Copyright 2010, The Dojo Foundation
 * Released under the MIT, BSD, and GPL Licenses.
 *
 * Date: Sat Feb 13 22:33:48 2010 -0500
 */
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i? /* ... */

Looks correct to me.

This is from the Firebug console:

Error: $ is not a function
[Break On This Error] $(function() {
foowidget.js (line 5)
>>> $
anonymous()
>>> jQuery
undefined
>>> $('a')
null
>>> $(document)
null

Update 4: $ is defined on all page of my Django site except the admin app. Odd...

Update 5: This is interesting.

jQuery.init.js:

// Puts the included jQuery into our own namespace
var django = {
 "jQuery": jQuery.noConflict(true)
}; 

From the console:

>>> $
anonymous()
>>> django
Object {}
>>> django.jQuery
function()
>>> django.jQuery('a')
[a /admin/p..._change/, a /admin/logout/, a ../../, a ../, a.addlink add/]
like image 880
Nick Heiner Avatar asked Jan 17 '11 01:01

Nick Heiner


2 Answers

Adding this to the top of my .js file fixes it:

var $ = django.jQuery;

I'm not sure how to remove the jquery.init.js file, given that my project doesn't contain any scripts that use $ for something other than jQuery.

like image 151
Nick Heiner Avatar answered Sep 29 '22 15:09

Nick Heiner


i solved this problem on this way, you have to include jquery.init.js (often its jquery.init.js from admin) in this file add following lines:

var django = {
    "jQuery": jQuery.noConflict(true)
};
var jQuery = django.jQuery;
var $=jQuery;

and u have in whole workspace jquery and $. For better code looking i prefer create my own jquery init file in project.

like image 43
jinni Avatar answered Sep 29 '22 15:09

jinni