jQuery没有定义(在[Symfony]模板环境中)

时间:2010-01-19 13:11:03

标签: jquery symfony1

我正在尝试显示使用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没有定义错误。 :(

7 个答案:

答案 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>部分。