2009-04-20 12 views
-1

PrototypeとjQueryの両方から$ functionを統一できるJavaScript関数はありますか?

はい、これは私が直面している実際の使用例です。 Prototypeで$ functionが見つかりました.jQueryで$がお互いに矛盾しています。私は、jQuery.noConflict()を使ってPrototypeに$を再登録することができることを知っていますが、その$関数を使用するjQuery固有のjavacriptコードを書き直すか、コードブロックに固有のjqueryを持たなければなりません。匿名機能)。

既存のコードを両方のライブラリに書き直して1つのページに入れなくても簡単な方法はありますか?この質問に答えることができ

コードは次のように見えるかもしれ、そしてあなたのフィードバックが大幅に高く評価されています

<script type="text/javascript" src="/path/to/prototype.js"></script> 
<script type="text/javascript" src="/path/to/jquery.js"></script> 
<script type="text/javascript"> 
/* <![CDATA[ */ 
var $j = jQuery.noConflict(); 
var $p = $; // reference to prototype's $ 
var $ = function(E, F){ 
    var isJQuery = true; 

    //TODO: logic to determine which $ to use here YOUR SUGGESTION HERE ;-) 

    var result = null; 
    if(isJQuery){ 
    result = $j(E, F); 
    } else { // prototype 
    //TODO: code to delegate prototype $ 
    } 

    return result; 
} 
/* ]]>*/ 
</script> 

// ... any existing javacode jQuery and Prototype using $ function. 

感謝を。

更新:質問をより明確に書き直してください。

答えて

5

まず、両方のライブラリを同じページに含める必要がある場合は、まずは役に立つケースはほとんどありません。だからあなたは1つを削除することを検討するかもしれません。
これはプラグインの使用によるものだと思いますが、相手のプラグインリストを見て、私は確信しています。

第二には、お使いのjQueryの特定のコードのために、それは無名関数のトリックを使用して、それを書き換えることは非常に簡単です:

(function($){ 
    ... your code here ... 
})(jQuery); 

これは、あなたがグローバル変数やメソッドを入れていない例ほとんどで動作しますそれらをイベントにバインドするのではなく、

+0

この回答をお寄せいただきありがとうございます。さまざまなアプローチを試してから約1週間後、私はこのアプローチが最も適切な解決策であることを発見しました。 (1)jQuery $は上記のような匿名関数内に記述してください。 (2)上記の匿名関数のプロトタイプ$を直接呼び出すことはできません。 これは2つの問題点ですが、このソリューションは私が持っているほとんどのユースケースに最適です。 ありがとうございます。 – Nordin

2

私はいつもギズモの例と同様の機能にすべての私のjQueryのコードを置くの習慣の中に持っている:これはdocument.readyイベントハンドラと同じである

jQuery(function($) { 
    // jQuery code here, using $ 
}); 

0

jQueryはPrototypeでうまく動作することを確認するのに素晴らしいことでした。詳細はAvoiding Conflicts with Other Librariesのこのページを確認してください。

私は前の同じページで使用された両方のライブラリを見てきました。これは一般に、ページに他のライブラリが使用されている間に1つのライブラリを使用するサードパーティのアプリケーションが原因です。しかし、自分ですべての開発をやっているのであれば、どちらか一方に固執することをお勧めします。

関連する問題