2014-06-24 85 views
3

工作jQuery的我一直在使用jQuery了好幾年後,我包括任何網站,我工作的jQuery的腳本,我總是會用$ jQuery的對象。例如:

$('#my_selector').click(function(){... 

我建了一個網站,幾年前在的Joomla 1.6,擁有200頁和jQuery中使用的幾乎所有的人,所有與$。現在我正在Joomla 3.3.0中重建網站。有趣的是,現在有時$只是在識別jQuery對象時不起作用,但是當我使用jQuery時它起作用。例如。上面的代碼示例將不得不更改爲:

jQuery('#my_selector').click(function(){... 

而且工作正常。最後最奇怪的是,在一個頁面上,似乎$適用於某些jQuery,但不是全部。我看到的錯誤是這個:

TypeError: undefined is not a function 

好像在運行after load complete情況下,功能大多出現問題。無論如何,我只是想知道,如果有人知道爲什麼$將停止與識別jQuery功能和對象的工作。

謝謝!

+1

你是否在同一頁面中多次引用jquery? –

+1

這很可能是因爲[jQuery.noconflict()](http://api.jquery.com/jquery.noconflict/)導致'$'不能被定義。 – cmbuckley

+1

是否與其他圖書館發生某種衝突bcos –

回答

7

你最有可能使用衝突的庫,意思是:聲明(從而覆蓋)可變$另一個腳本/庫。總結所有的代碼在一個封閉的,你應該是不錯的:

(function($) { 
    $('#my_selector').doStuff(); 
})(jQuery) 

或者,如果需要的文件準備好後執行:

jQuery(document).ready(function($) { 
    $('#my_selector').doStuff(); 
}); 
+0

我有一堆函數在全局範圍內,並在函數內使用$做jQuery的東西。是否有可能圍繞所有這些功能創建一個閉包?功能仍然可以從全局範圍調用? –

1

您或Joomla使用的mootools或任何其他庫與$

這將意味着存在衝突並解決它的正確方法是使用jQuery而不是$

1

Joomla 3.x正在逐步向jQuery發展,並逐漸取代所有MooTools的依賴關係。

的默認狀態是在noConflict()模式加載jQuery,但根據由擴展(templatesplug-inscomponentsmodules)MooTools的任何給定頁面上使用的特徵還可以被加載。

這意味着在某些頁面上,jQuery被定義,而不是$,並且在其他頁面上都被定義了,顯然這會導致您遇到的問題。

添加到1.6時代的大多數第三方擴展(你一直在升級到2.5.x版本的路上),只是忽略了所發生的事情並加載了他們需要的任何東西(可能會吹走其他圖書館),您通常必須首先排除所有衝突。

唯一可以保證的方式來使用jQuery是通過使用jQuery前綴。

您可以閱讀約using JavaScript frameworks with Joomla here,其中包括內置於Joomla中用於加載jQuery的未來驗證機制。

要加載的jQuery,用途:JHtml::_('jquery.framework');

要加載的jQuery UI核心的呼叫:JHtml::_('jquery.ui');

正如已經提到你可以用你的JavaScript的關閉,其實這就是核心com_banners做在/media/cbanner.js

var jQuery; 
    (function ($) { 
     $(document).ready(function() { 
      $('#jform_type').on('change', function (a, params) { 
       var v = typeof(params) !== 'object' ? $('#jform_type').val() : params.selected; 
       switch (v) { 
       case '0': 
        // Image 
        $('#image, #url').show(); 
        $('#custom').hide(); 
        break; 
       case '1': 
        // Custom 
        $('#image, #url').hide(); 
        $('#custom').show(); 
        break; 
       } 
      }); 
     }); 
    })(jQuery);