3

2 つの jquery プラグインを使用しています。どちらもプロトタイプ関数で jquery を拡張しますremoveTag。これにより、2 番目にロードされたプラグインは正しく機能しますが、最初のプラグインは機能しません。

簡単なパッチとして、2 番目のプラグインの removeTag (およびそれに対するすべての呼び出し) の名前を別の名前に変更しました。

明らかに、それは良い解決策ではありません。アップグレードは手動で編集する必要があり、私がまだ気付いていない他の名前空間の競合が存在する可能性があります。

これに対処するための効果的な戦略を誰かが推奨できますか?

私が使用している2つのプラグインは次のとおりです。

4

3 に答える 3

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クラスの宣言で、完全な名前空間を使用するようにネットしたことを忘れていました

于 2012-05-11T20:16:14.533 に答える
0

1つの可能性はを使用すること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つが、ページのロード時に1回呼び出すだけの場合ですが、これは問題ではない可能性があります。

編集:どうやらこれは1.7で非推奨になり、1.8でプラグインに移動されます

于 2012-05-11T20:19:56.903 に答える
0

最初のプラグインをロードした後、別の名前で関数を定義します$.fn.removeTagsPlugin=$.fn.removeTags。2番目のプラグインをロードすると、$。fn.removeTagsが上書きされます。これには制限があります。最初のプラグインが内部でremoveTagsを使用し、新しいプラグインのバージョンのremoveTagsを使用すると機能しない場合、このソリューションは機能しません。

于 2012-05-11T20:54:50.463 に答える