2012-04-02 8 views
0

だから、状況を考えてみましょう。私はJquery 1.4.2をJqueryのメインバージョンとして使用するウェブサイトを持っています。 しかし、ユーザーは他のバージョン(1.2.1,1.5.1など)を使用しているカスタムテンプレートを使用することができます。だから、それはいくつかの状況でそれが矛盾をもたらす。ここで例えば
異なるJqueryバージョンを矛盾なく使用する

//included in my main view 
<script type="text/javascript" src="jquery-1.4.2.min.js" ></script> 
<script type="text/javascript"> 
     $(function() { 
       alert($().jquery); 
      }); 
</script> 

//included in custom template 
<script type='text/javascript' src='jquery-1.5.1.min.js'></script> 
<script type="text/javascript"> 
     $(function() { 
      alert($().jquery); 
     }); 
</script> 

ので、それらの両方は、1.5.1(なぜなら文書の準備ができたときに初期化する)警告しています。だから私はこのような状況を避けたい。

今、私は私の頭の中で唯一の解決策を取得しました - 私のサイトで使用されているすべてののプラグインをnoConflict(true)を使用してに新しいシンボルにすべて$Jquery記号を変更します。
より洗練されたソリューションがありますか、または私のサイトで使用されているすべてのプラグインの名前を本当に変更する必要がありますか?

P.S.別の方法として、下位互換性のあるプラグインを使用しているかもしれませんが、この状況では、すべてのバージョンと互換性を持たせるために多くのプラグインを含める必要があります。

+0

、彼らはで定義された 'jQuery'オブジェクトを使用しますその瞬間。したがって、適切な順序でロードするだけです。独自のコードで正しいバージョンを使用するために、 'ready'コールバックは最初の引数としてjQueryへの参照を渡します。 –

+0

私の例では、最初のアラートは1.4.2ではなく1.5.1になっています。この状況は多くのプラグインに表示されることがあります。 –

+1

しかし、プラグインは通常 '(function($){...}(jQuery))'として定義されています。つまり、プラグイン '$'の内側には 'jQuery'あなたの場合、otoh、あなたは**グローバル** '$'にアクセスしています。これは後で2番目のjQueryスクリプトによって上書きされます。あなたの場合に相当するのは '$(function($){...})'です。試してみる。 –

答えて

4

ルックjQuery.noConflict()

**//included in my main view** 
<script type="text/javascript" src="jquery-1.4.2.min.js" ></script> 
<script type="text/javascript"> 
     $(function() { 
       alert($().jquery); 
      }); 
</script> 

**//included in custom template** 
<script type='text/javascript' src='jquery-1.5.1.min.js'></script> 
<script type="text/javascript"> 
     $151 = jQuery.noConflict(); 
     $151(function ($) { // In this scope $ === $151, or jQuery 1.5.1 
      alert($().jquery); 
      // $ !== jQuery. 
      // $().jquery = 1.5.1 
      // jQuery().jquery = 1.4.2 
     }); 
     // outside the scope 
     // $ === jQuery 
     // $().jquery returns 1.4.2 
</script> 

でjQuery.noConflictを使用する方法();

var j = $.noConflict()

HTML::

<script type="text/javascript" src="jquery-1.4.2.min.js" ></script> 
<script type='text/javascript' src='jquery-1.5.1.min.js'></script> 

はJavaScript:

// jQuery === $ 
//$().jquery === 1.5.1 

$.noConflict()はjQueryののコピーを返し、あなたはそれをそうのような変数をキャプチャすることができます。

jQ151 = $.noConflict(); 

// jQ151 !== $ 
// jQ151().jquery === 1.5.1 
// $().jquery === 1.4.2 

jQuery.ready(function() {..

または単にjQuery(function() {..最初の引数はjQueryののローカルコピーです:プラグインが適切に構成されている場合は

<script type="text/javascript" src="jquery-1.4.2.min.js" ></script> 
<script type="text/javascript"> 
    jQuery(function($) { 
     // in this scope $ refers to jQuery version 1.4.2 
    }); 
</script> 
<script type='text/javascript' src='jquery-1.5.1.min.js'></script> 

<script type="text/javascript"> 
    jQuery(function($) { 
     // in this scope $ refers to jQuery version 1.5.1 
    }); 
</script> 
+0

なぜダウン投票? – andlrc

+0

Voted up。エラーがある場合は、投票後にそれを明記してください! :) –

+0

私はすでにnoConflictについて書きましたが、$とsとjQueryの名前を変更しました。問題はよりエレガントな方法を見つけることです。 –

関連する問題