2009-07-21 11 views
10

私はjqueryをモジュールに使用しています。私のjoomlaテンプレートには、統合されたjqueryメニューがあります。彼らはお互いに葛藤しています。他のJQueryライブラリとのJQuery競合

この問題を解決する方法はありますか?モジュール

<script type="text/javascript" charset="utf-8"> 
    window.onload = function() { 
     var container = jQuery('div.sliderGallery'); 
     var ul = jQuery('ul', container); 

     var itemsWidth = ul.innerWidth() - container.outerWidth(); 

     jQuery('.slider', container).slider({ 
      min: 0, 
      max: itemsWidth, 
      handle: '.handle', 
      stop: function (event, ui) { 
       ul.animate({'left' : ui.value * -1},340); 
      }, 
      slide: function (event, ui) { 
       ul.css('left', ui.value * -1); 
      } 
     }); 
    }; 
</script> 

答えて

2

のスクリプトコードに続いてその使用J変数の後に

var J = jQuery.noConflict(); 

を試みる代わりに、カスタムコードのための$やjQueryの

+0

この回答は十分ではありません。 「J」を使用するように再マップするライブラリを指定する必要があります。これを間違った場所に書き込むと、結果が異なる可能性があります。 – vsync

+0

なぜあなたが意味するのか分かりません。説明してください。 – mkoryak

+0

「jQuery」とは何ですか?名前空間を汚染することなく(特定のバージョンの)jQueryをロードするにはどうすればいいですか? –

1

jQuery.noConflict(); 

例えば

を試してみてください
<script type="text/javascript" charset="utf-8"> 
    $(document).ready(function() { 
     var container = jQuery('div.sliderGallery'); 
     var ul = jQuery('ul', container); 

     var itemsWidth = ul.innerWidth() - container.outerWidth(); 
     jQuery.noConflict(); 
     jQuery('.slider', container).slider({ 
      min: 0, 
      max: itemsWidth, 
      handle: '.handle', 
      stop: function (event, ui) { 
       ul.animate({'left' : ui.value * -1},340); 
      }, 
      slide: function (event, ui) { 
       ul.css('left', ui.value * -1); 
      } 
     }); 
    }); 
</script> 

jQueryを使用して読み込まれたドキュメントをチェックするようにコードを更新しました。 noConflict関数の使用の詳細はhereです。

+0

あなたのコードをコピーしてファイルに貼り付けますが、何も変更しません。私は他の何かをしなければならないのですか? –

4

問題を解決するために必要なことは、jQuery関数のエイリアスで、別の変数名に割り当てます(変数は関数になることができます)。 $()関数のエイリアスを解除するには、jQuery.noConflict()関数を使用する必要があります。ここでは一対一ではそれを行うには:

// ...after all of Joomla's JS is done executing... 

// before loading your version of jQuery var jquery = {}; // aka new Object() 
jquery.joomla = jQuery.noConflict(); // moves jQuery into another namespace 

// load your version 

は今、あなたのバージョンをロードするとき、それはjQueryと$名前空間を引き継ぎますが、あなたがそれを必要とする場合、あなたはまだのJoomlaのjQueryの関数への他の参照を持っています。 -反復を再するには、基本的な流れは次のとおりです。

  1. ロードのJoomlaのjQueryの
  2. ランのJoomlaのjQueryの依存コード
  3. 移動JoomlaのjQueryの別の名前空間に
  4. は、使用してコードを実行し
  5. あなたのjQueryをロードします$()
+2

「Joomla jQueryを別の名前空間に移動する」 - それは後で実行され、古い名前空間を探す代わりに、新しいjQueryの名前をj $に変更する必要があります。 – vsync

0

あなたはjoomlaが2種類のjqueryを同時にロードしたことを意味しましたか? メニューよりjquery をロードしてから、モジュールがjqueryをロードしますか?ここ

が解決策である:Joomlaのテンプレートで 、我々は(私はあなたがJoomlaの1.5.xの権利を使用しなければならないと仮定?)モジュールまたはコンポーネントビューをオーバーライドすることができ、あなたのテンプレートで

  1. というディレクトリを作成しますHTML/ 例:モジュールからテンプレート/ yourTemplate/HTML/

  2. コピーファイル/ mod_yourMenu/TMPL /.*あなたのテンプレートのHTMLに(テンプレート/ yourTemplate/HTML/mod_yourMenu /) - > *あなたはしないでくださいtmpl/*を追加する必要があります。

  3. 内側とPHPファイルがロードjqueryの

  4. はjqueryのを使用して、モジュールのためのステップ1〜3を行い、すべての タグを削除して編集。

  5. テンプレートを編集して、jqueryの最新バージョンを読み込むタグを設定します。

それはちょうど、自己呼び出す機能であなたJQスクリプトを包むようになりました:)

+0

hm - これはうまくいくかもしれませんが、このモジュールを多くのサイトで使いたい場合はどうしたらいいですか?毎回この手順を実行する必要があります。あなたは他の解決策を知っていますか? –

0

を動作するはずです。

(function($){ 
    $(document).ready(function(){ 

     $('div').click(function(){ alert('ding'); }); 

    }); 
})(jQuery); 

これはプライベートスコープを作成するので、衝突を心配する必要はありません。あなたはjQuery.noConflict()で不安をすべてスキップすることができます。あなたはそのすばらしい$をあきらめる必要はありません!私は仕事でコードの他の塊(例えばcms)があることを知っているとき、私はhabbitの問題としてこれを行います。たとえ新しい拡張がテストの後に追加されても、jQueryを破損すべきではありません。

jQuery Cookbook(http://listic.ru/jQuery_Cookbook.pdf - 1.17章)の概要があります。それがResigのために十分であれば、私はそれが私のために働くだろうと思う!

関連する問題