Django 和 jQuery 的困难(为啥在管理应用程序中 $ 未定义?)
Posted
技术标签:
【中文标题】Django 和 jQuery 的困难(为啥在管理应用程序中 $ 未定义?)【英文标题】:Difficulty with Django and jQuery (why is $ undefined in the admin app?)Django 和 jQuery 的困难(为什么在管理应用程序中 $ 未定义?) 【发布时间】:2011-06-10 04:57:08 【问题描述】:我已经有一段时间没有使用 jQuery 了;我想我犯了一个愚蠢的错误。
这是一个 Django 小部件:
class FooWidget(Widget):
# ...
class Media:
js = ('js/foowidget.js',)
这是 .js 文件:
alert("bar");
$(document).ready(function()
alert("omfg");
$('.foo-widget').click(function()
alert("hi");
return false;
);
);
alert("foo");
唯一触发的alert()
是第一个。我有愚蠢的语法错误吗?
另外,如果页面上包含的其他一些脚本重新定义了$(document).ready
,我需要担心吗?我猜后续定义会覆盖我的,因此后续定义执行以下操作会更安全:
$(document).ready(function()
document.ready()
// real stuff
);
在foowidget.js
之前,jQuery 已经包含在页面中了。
更新:根据@lazerscience 的链接,我尝试了以下方法,但仍然像以前一样失败:
alert("bar");
$(function()
alert("omfg");
$(".set-widget").click(function()
alert("hi");
return false;
);
);
alert("foo");
更新 2:奇怪的是,当我这样做时:
alert($);
我得到“未定义”。这表明 jQuery 实际上没有初始化。这让我很困惑,因为<head>
包括:
<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>
不将我的脚本放在 jQuery 脚本之后确保 $
将被定义?
更新 3:来自 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)trys.documentElement.doScroll("left")catch(a)setTimeout(ma,1);returnc.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 aif(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 areturn i? /* ... */
在我看来是正确的。
这是来自 Firebug 控制台:
Error: $ is not a function
[Break On This Error] $(function()
foowidget.js (line 5)
>>> $
anonymous()
>>> jQuery
undefined
>>> $('a')
null
>>> $(document)
null
更新 4:$
在我的 Django 站点的所有页面上定义,除了管理应用程序。奇怪...
更新 5:这很有趣。
jQuery.init.js:
// Puts the included jQuery into our own namespace
var django =
"jQuery": jQuery.noConflict(true)
;
从控制台:
>>> $
anonymous()
>>> django
Object
>>> django.jQuery
function()
>>> django.jQuery('a')
[a /admin/p..._change/, a /admin/logout/, a ../../, a ../, a.addlink add/]
【问题讨论】:
您是否使用任何开发工具,例如 Firebug 或 Chrome 开发工具? 您应该确认 /media/js/jquery.min.js 脚本标签实际上返回了 jquery 库。 我查看了文件。它似乎是 jQuery 库,虽然我没有做差异。 其实有一个错误:“$ is not a function” 【参考方案1】:您可以使用$(document).ready()
as often as you want to on one page。它不会重新定义您所说的任何内容,但ready()
的调用会添加在“文档准备就绪”时调用的函数。
调试您的代码,例如。使用 Firebug,它将向您显示有关错误发生位置的更详细信息(如果有)!
【讨论】:
Firebug 抱怨 $ 未定义(见上文) 如果您使用 django 加载的 jQuery,请使用(function($) // your code here… )(django.jQuery);
! 包装您的代码!
使用后我得到django is not defined
【参考方案2】:
在Firefox中,查看页面的源代码,然后点击链接“/media/js/jquery.min.js”查看是否加载。很可能您收到了 404,因为您没有正确定义媒体 URL。
您也可以为此目的使用开发服务器,它会显示所有请求和返回的 HTTP 状态码。
【讨论】:
我查过了,不是 404ing。这是我上面更新的 jQuery 代码。【参考方案3】:使用 Firebug 或 Web Inspector JS 控制台并输入 $
和/或 jQuery
。这是确定库是否已正确加载的最简单方法。在不太可能的情况下,只定义了 jQuery,您可以将脚本包装到它自己的范围内:
(function($)
// your code here…
)(jQuery);
如果控制台上没有定义任何内容,则问题很可能出在文件上,我会尝试使用 AndiDog 的方法来查看是否加载了任何内容。
【讨论】:
你是对的,控制台确实揭示了问题。 (OP 已更新。) 你是否有机会包含另一个使用 $ 的库,例如原型?【参考方案4】:您可能忘记在模板中包含 form.media
。
【讨论】:
您在 OP 中看到<script>
标签了吗?你真的这么认为吗?【参考方案5】:
将此添加到我的 .js 文件的顶部可以修复它:
var $ = django.jQuery;
我不确定如何删除 jquery.init.js 文件,因为我的项目不包含任何将 $
用于 jQuery 以外的脚本。
【讨论】:
【参考方案6】:我通过这种方式解决了这个问题,您必须在此文件中包含 jquery.init.js(通常是来自管理员的 jquery.init.js)添加以下行:
var django =
"jQuery": jQuery.noConflict(true)
;
var jQuery = django.jQuery;
var $=jQuery;
你在整个工作区都有 jquery 和 $.为了更好地查看代码,我更喜欢在项目中创建自己的 jquery 初始化文件。
【讨论】:
【参考方案7】:在 django 中,当您使用 import_export 插件时出现此问题的原因之一。在这种情况下,请按照以下步骤操作 -
-
在 admin 模板目录下创建一个名为 import_export (templates/admin/import_export) 的文件夹
在那里创建一个名为 base.html (templates/admin/import_export/base.html) 的文件
键入以下代码 base.html 文件。
% 扩展“admin/import_export/base.html” % % 加载静态 % % 块额外开销 % block.super 静态/admin/js/vendor/jquery/jquery.js 静态/admin/js/jquery.init.js % endblock %
【讨论】:
【参考方案8】:我包装了我的 js 代码以使用 jQuery:
window.onload = function ()
if (django.jQuery('body').hasClass('change-list'))
....
【讨论】:
以上是关于Django 和 jQuery 的困难(为啥在管理应用程序中 $ 未定义?)的主要内容,如果未能解决你的问题,请参考以下文章
django 管理和自动完成灯:Select2:找不到 jQuery 实例或 jQuery 兼容库