2012-05-11 13 views
3

私は2つのjqueryプラグインを使用しています。両方とも、プロトタイプ関数removeTagでjqueryを拡張しています。これにより、2番目に読み込まれたプラグインは正しく動作しますが、最初のプラグインは正しく動作しません。jquery名前空間の衝突を処理するにはどうすればいいですか?

クイックパッチとして、2番目のプラグインのremoveTagとそのすべての呼び出しを別のものに変更しました。

明らかに、それは良い解決策ではありません。アップグレードは手作業で編集する必要があり、まだ実現していない他の名前空間の衝突が存在する可能性があります。

誰もがこれに対処するためのいくつかの効果的な戦略をお勧めしますか?私が使用しています

2つのプラグインは以下のとおりです。

+0

2つのjQueryライブラリ、または2つのjQueryプラグイン。そこに大きな違いがある。 2つのjQueryライブラリの場合、removeTagだけが矛盾しているわけではありません。 –

+0

ライブラリとは何ですか?あなたの名前空間に名前がつけられている場合、名前空間のバージョンのremoveTagを呼び出すことはできません(私が正しいと言っているかどうかは分かりません)。または、名前空間内の個々のメソッドを変更する代わりに名前を付けることができますか? – Marc

+0

あなたのライブラリ/スクリプトの呼び出しをHTML文書の中で逆転させて、最後の ''タグの前に置くことができます。 –

答えて

4

あなたは以下のコードとJSファイルを追加することができます。

if (jQuery) { 
    jQuery.namespace = function(namespace) { 
      var names = namespace.split("."); 
      var parent = window; 
      for (var index = 0; index < names.length; index++) { 
        if (!parent[names[index]]) { 
          parent[names[index]] = function() { 
            throw "Namespace, Cannot instantiate"; 
          } 
        } 
        parent = parent[names[index]]; 
      } 
    } 

}

そして、あなたのスクリプトに次のようにそれを使用することができます。

$.namespace("Somejs.MyCustomjs"); 

以降のコードでは、のような完全な名前空間を参照してください。

SomeJs.MyCustomjs.myFunc(); 

それは

編集に役立ちます願っています:私は、あなたのjsクラスの宣言で完全な名前空間を使用するためにネッティングしたことを忘れていました。

+0

+1私はこの方法が好きです。 – davidethell

0

eにはjQuery.sub()を使用してください。

http://api.jquery.com/jQuery.sub/

これは、あなたがjQueryオブジェクトのコピーを作成し、1つのプラグインがコピーを使用していできるようになります。

// load jQuery 
// load plugin1 

var $origJQ = jQuery; 
jQuery = jQuery.sub(); 

// load plugin2 

jQuery.plugin2Stuff(); 
$origJQ.plugin1Stuff(); 

大きな欠点は、しかし、あなたがプラグインのいずれかを扱うときにjQueryのための適切なエイリアスを使用するようにしてくださいする必要があるだろうということです。プラグインの少なくとも1つがあなたのページの読み込み時に一度だけ呼び出すものであれば、これは問題ではないかもしれません。

EDIT:どうやらこれは1.7で廃止され、あなたがにロードするときに別の名前$.fn.removeTagsPlugin=$.fn.removeTagsで関数を定義し、最初のプラグインにロードした後1.8

0

にプラグインに移動されます2番目のプラグインは$ .fn.removeTagsをうれしく上書きできます。これには制限があります..最初のプラグインが内部的にremoveTagsを使用していて、それが新しいプラグインのバージョンのremoveTagsを使用する場合は機能しません。

関連する問題