0

次のような jquery プラグインを使用しています。

(function($){
    var options;
    $.fn.main(opts){
        options = opts;
        //rest of code
    }
    $.fn.otherFunc(){
        //does something with options
    }
}(jQuery));

ここでの問題は、このプラグインをページで 5 回使用すると、オプション変数が上書きされ、5 つのインスタンスすべてがそれらのオプションを共有することです。これは悪いことです。各プラグイン インスタンスに独自の構成を持たせたいのです。

これを達成するための非ハックなjQueryの方法はありますか?

編集:

$.fn.main の $(this) への追加オプションは、main 関数から $(this) で $.fn.otherFunc が呼び出されない可能性があるため、expando としてややハックなものと見なすことを追加する必要があります。私のものにアクセスできます!

4

2 に答える 2

2

このようないくつかの要素に同じプラグインを適用している場合

$("#div1, #div2, #div3, #div4, #div5").main(opts);

あなたはそれを異なるオプションで5つの異なる呼び出しに分割する必要があります-すなわち:

var opts1 = {...};
$("#div1").main(opts1);

var opts2 = {...};
$("#div2").main(opts2);

// etc.

また、パラメータを追加して、動作する$.fn.otherFuncオプションオブジェクトを受け取ります。

編集:otherFunc内部から電話をかけていない場合はmain()、なぜそれらの間でオプションを共有しているのかを検討する必要があります。その場合、元の問題(つまり、解決しようとしている現実の問題)を投稿すると、2つの異なるプラグインを1つにマージするのではなく、共有オプションを使用するよりも優れたソリューションを提供できる可能性があります。

于 2009-04-13T20:59:00.737 に答える
1

あなたの例で与えられたコードには構文エラーがありました、私はこれがよりよく働くと推測しています:

(function($){
    var options;
    $.fn.main = function(opts){
        options = opts;
        //rest of code
        alert(options.text);
    }
    $.fn.otherFunc = function(){
        //does something with options
    }
})(jQuery);

$('a:first').main({text:'txt'});
$('a:last').main({text:'some other text'});

あなたのコードでは、オプションを追跡するためにDOM要素自体にオプションデータを追加することをお勧めします。結局のところ、そこに「動作」が向けられているので、別のオブジェクトではなく、そこに保持するのが自然です。 。

于 2009-04-13T21:06:02.233 に答える