1

私はjQueryを使用して既存のページのモジュールを構築しています。このページではプロトタイプも使用しているので、通常のjQueryプロトタイプの競合があります。私はjQuery.noConflict()を使用しています。すべてがieを除くすべてのブラウザで正常に動作します(ie8でテスト済み)。 私はここや他のサイトのすべての同様の質問を読んだが、うまくいかない。 これは動作原理です。プロトタイプ(effects.js、prototip.jsなど)を使用してプロトタイプやその他の.jsファイルを読み込んだ後、モジュール(jQueryはプロトタイプの後に読み込まれます)を読み込みます。 プロトタイプの$()関数を$$$()に変更する方法については読んでいますが、これは不可能です(プロトタイプを使用する他の多くのモジュールを変更する必要があります)。jqueryのプロトタイプはie8でのみ競合します。

は、私は

(function($) { 
    //my jQuery code in here 

})(jQuery); 

を使用して読んしかし、私はそれを完全に理解していません。私のコードは次のようにについてです:

$J = jQuery.noConflict(); 
$J(document).ready(function(){ 
    fun1(); 
    //jquery stuff 
    fun2(); 
}); 

function fun1(){ 
    //stuff/jQuery code/ call other functions 
} 

function fun2(){ 
    //stuff/jQuery code/ call other functions 
} 

私は(function($) { /*all the above*/})(jQuery);

に上記のすべてを置く場合、私はすべての機能が未定義であることを取得します。

私は間違っていますか?それとも別の解決策がありますか?

+1

どちらか一方を使用することを強くお勧めしますが、両方を使用することはお勧めしません。あなたはあまりにも多くの手間をかけることなく衝突させることができますが、それはあなたのユーザーが2つの異なるライブラリを読み込まなければならないことを意味します。 jQueryとPrototypeのプラグインがあります。これはあなたが望むほとんどのことを行います。 –

答えて

1

jQuery.noConflict();の場合は、他のすべてのJavaScriptライブラリが読み込まれる前に呼び出す必要があります。そうしないと、$変数を上書きしてしまいます。 (function($) { /*all the above*/})(jQuery);のエラーは、これが匿名関数を定義しているためです。匿名関数の範囲外のオブジェクトの一部でない限り、この内部の関数はその内部にのみ存在し、外部では使用できません。

このように使用する必要があります。

//Must be called before any other library in included on the page. 
$J = jQuery.noConflict(); 

(function($){ 
    $(document).ready(function(){ 
     fun1(); 
     //jquery stuff 
     fun2(); 
    }); 
})(jQuery); 

function fun1(){ 
    //stuff/jQuery code/ call other functions 
} 

function fun2(){ 
    //stuff/jQuery code/ call other functions 
} 
+1

ここで重要なのは、最初にjQueryライブラリをインクルードし、noConflict()でスクリプトブロックを作成し、次にプロトタイプライブラリをインクルードすることです。 –

+0

最初に返信いただきありがとうございます。 スクリプトの読み込み方法は固定されており、変更することはできません。モジュール全体を編集するだけで、ページ全体を編集することはできません。 しかし、jqueryとjquery.noConflictの前にプロトタイプがロードされていても、ff、chrome、safariで動作します。 :s – CrisDeBlonde

+0

プロトタイプコードは機能しますか?私は、jQueryコードの後に​​ロードされた場合、プロトタイプコードが動作しなくなると思います。 – Nalum

0

(問題とだけだった)IE8と他のブラウザでは、初期化した後、すぐに頭をjQueryとnoConflict()の呼び出しを入れていたため、私は、この問題を解決することができた唯一の方法他のライブラリこれと同じように:

<script type="text/javascript" src="/path/to/prototype.js"></script>

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

<script type="text/javascript">var $j = jQuery.noConflict(); </script>

... jQueryのかプロトタイプのいずれかを使用する他のスクリプトが続きます。