2010-01-19 16 views
3

我想顯示一個使用jQuery的頁面。頁面中實現的AJAX功能不起作用。jQuery沒有定義(在[Symfony]模板環境中)

我正在使用FF進行調試。當我查看控制檯面板時,我看到以下錯誤:'jQuery未定義'。嗯,我認爲這很容易 - 也許jQuery文件沒有被正確包含,或者沒有找到。所以我看看HTML並點擊節點 - 你會發現,jQuery腳本一直是正確的包含在頁面中。

儘管在引用jQuery的頁面中沒有其他js庫使用'$'(如原型),但我在jQuery邏輯中調用了noConflict()方法,以防萬一我使用衝突庫後期。

[編輯]

我認爲(精確的Symfony 1.4)問題是有關,我在一個模板環境使用jQuery的文件。對於那些不熟悉Symfony模板系統的人來說,視圖模型實際上是由一個'layout'文件(模板)組成的,然後使用其他位信息進行修飾(修飾器模式)(可以稱之爲'頁面內容' )。

最後一頁看起來大致是這樣的:

<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的術語中的「佈局」)。

這樣做的原因是JQ庫是緩存的客戶端,並且可用於需要它的頁面。 dynnamic頁面(其內容進入佈局的「頁面內容」部分)將擁有自己的jQuery邏輯。這(使用由以下馬克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

看起來你複製了Mark Schultheiss給出的代碼中的語法錯誤 - 更改最後一個)}; into}); – 2010-01-19 16:42:11

+0

由於您使用Firefox,因此可能需要使用HttpFox插件檢查加載順序。至少,當我看到類似的問題時,這幫助了我。除此之外,我們可能需要看到更多的代碼。 – 2010-01-19 17:17:46

+0

剛剛下載HttpFox - 發現了,它與FF 3.5.7不兼容:( 有趣的是,雖然它聲稱與(Firefox:1.5 - 3.5。*)一起使用 – 2010-01-19 22:21:03

回答

8

它正在加載腳本/ DOM之前運行。 把jQuery。noconflict();在jQuery的包裝

jQuery(function() 
{ 
    jQuery.noConflict(); 
}); 

如果你認爲你可能需要保護自己:

(function($) 
    { 
     $.noConflict(); 
    })(jQuery); 

也適用

編輯:修正了一些語法錯誤

+0

jQuery.noConflict()不打算從dom-ready事件處理函數中調用,它應該被內聯調用 – 2010-01-19 14:23:41

+0

您可能需要更改'$(function(){}) 'to'jQuery(function(){})'。 – 2010-01-19 14:52:59

+0

@Kuroki Kaze謝謝,根據你的評論改變了這個。 – 2010-01-19 15:06:04

0

可能鏈接到外部jQuery是錯誤的看來,代碼應工作試圖擺脫CDATA塊 - 。機會是你不需要那麼

+0

應該沒有區別...特別是它們在JavaScript註釋中...... – 2010-01-19 13:29:05

4

這是下降到JQuery的不被加載在所有情況下99%。

  • 使用Firebug的「網絡」選項卡中檢查出是否你JQuery的文件實際上是被加載。

  • 而且,它可能是你引用的JQuery兩次,我t這可能會導致JQuery也消失。

如果這樣做沒有幫助,我建議你轉儲<script>包括到你的問題,這樣在瀏覽器中露面。

1

jQuery的可能正在加載異步。例如,如果您使用的是谷歌的Ajax API,如以下內容,然後,必須用依賴於jQuery的傳遞給google.setOnLoadCallback(回調)的任何代碼:

<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> 
0

總結jQuery代碼(如果你真的需要它,調用jQuery.noConflict())圍繞下列功能

$(function() { jQuery.noConflict(); ... }); 

並務必將其添加到頁面的<head>部分。

1

包括jQuery的後,你應該調用jQuery.noConflict():

<script src="jquery.js" type="text/javascript"></script> 

<script type="text/javascript"> 
/*<![CDATA[*/ 
jQuery.noConflict(); 
/*]]>*/ 
</script> 

<!-- more javascript includes --> 
+0

這就是爲我工作的。絕對的笑話。 – Jimbo 2013-06-03 15:14:17

2

什麼工作對我來說是使用絕對引用與相對的腳本,雖然這是任何一個安全噩夢沒有做僅供內部網絡項目。