我正在尝试显示使用jQuery的页面。页面中实现的AJAX功能不起作用。
我正在使用FF进行调试。当我查看控制台面板时,我看到以下错误:'jQuery未定义'。啊,我觉得这很简单 - 也许jQuery文件没有被正确包含,或者找不到等等所以我看看HTML并点击节点 - 瞧, jQuery脚本已经正确包含在页面中。
虽然引用jQuery的页面中没有其他js库使用'$'(如原型),但我在jQuery逻辑中调用了noConflict()方法,以防我以后使用冲突库阶段。
[编辑]
我认为这个问题与我在模板环境中使用jQuery的文件有关(准确地说是Symfony 1.4)。对于那些不熟悉Symfony模板系统的人来说,视图模型本质上是一个“布局”文件(模板),然后用其他信息来装饰(装饰模式)(让我们称之为'页面内容' )。
最后一页大致如下:
<html>
<head>
<script type="text/javascript" src= "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" ></script>
</head>
<body>
<!-- page contents go here -->
</body>
</html>
我正在将jQuery加载到模板中(即Symfony术语中的'layout')。
这样做的原因是JQ库是高速缓存的客户端,并且可用于需要它的页面。动态页面(其内容进入布局的“页面内容”部分)将具有自己的jQuery逻辑。这(使用下面Mark Schultheiss的回答中提供的“包装函数”的想法)看起来像这样:
<script type="text/javascript">
/*<![CDATA[*/
jQuery(function()
{
jQuery.noConflict();
jQuery(document).ready(function(){
jQuery("div.tpaccordion div.accItem").hide();
jQuery("#latestVideosHolder").show();
jQuery("div.tpaccordion h3").click(function(){
jQuery(this).next().slideToggle("slow")
.siblings("div.accItem:visible").slideUp("slow");
jQuery(this).toggleClass("active");
jQuery(this).siblings("h3").removeClass("active");
});
});
});
/*]]>*/
</script>
** [Edit2] **更正了语法错误。现在我回来让jQuery没有定义错误。 :(
答案 0 :(得分:8)
它在加载脚本/ DOM之前运行。 把jQuery.noconflict();在jquery包装器中
jQuery(function()
{
jQuery.noConflict();
});
如果你认为你可能需要保护自己:
(function($)
{
$.noConflict();
})(jQuery);
也有效
编辑:修正了一些语法错误
答案 1 :(得分:4)
这归结为99%的所有情况下都没有加载JQuery。
使用Firebug的“网络”标签检查您的JQuery文件是否实际加载。
此外,您可能会引用JQuery两次,我认为这可能会导致JQuery
消失。
如果这没有帮助,我建议您将<script>
包含转储到您的问题中,就像在浏览器中一样。
答案 2 :(得分:2)
对我来说有用的是使用绝对引用而不是相对于脚本,尽管对于不进行内部Web项目的人来说这是一个安全噩梦。
答案 3 :(得分:1)
jQuery可能是异步加载的。例如,如果您使用如下所示的Google Ajax API,则必须在传递给google.setOnLoadCallback()的回调中包装任何依赖于jQuery的代码:
<script src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
// Load jQuery (asynchronously)
google.load("jquery", "1", { uncompressed: true });
// Won't work -- jQuery is not necessarily loaded yet
jQuery(function ($) {
// Document-ready operations
});
// Must use the setOnLoadCallback
google.setOnLoadCallback(function () {
// jQuery is now loaded
jQuery(function ($) {
// Document-ready operations
});
});
</script>
或者,您可以通过在脚本标记中直接引用jQuery来避免异步加载:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
答案 4 :(得分:1)
你应该在包含jQuery之后立即调用jQuery.noConflict():
<script src="jquery.js" type="text/javascript"></script>
<script type="text/javascript">
/*<![CDATA[*/
jQuery.noConflict();
/*]]>*/
</script>
<!-- more javascript includes -->
答案 5 :(得分:0)
也许链接到外部jQuery是错误的?似乎代码应该工作。尝试摆脱CDATA阻止 - 你有可能不需要它。
答案 6 :(得分:0)
围绕以下函数包装你的jQuery代码(如果你真的需要它,调用jQuery.noConflict()
)
$(function() { jQuery.noConflict(); ... });
请务必将其添加到您网页的<head>
部分。