2009-07-07 8 views
0

ページ上の複数のオブジェクトでテストを開始するまで、jQueryプラグインを作成しました。問題は、新しいプラグインオブジェクトに渡されるオプションオブジェクトが、プラグイン内の関数の内部からアクセスする際に、その特定のオブジェクトに関連付けられたオプションオブジェクトと必ずしも同じであるとは限りません。非常にシンプルなものが欠けていると感じていますので、コードによって明らかになることがあります。オプションには関係なく、私はプラグインを作成したときだったものoptions.somePropertyjQueryプラグイン - オプションオブジェクトを別に保持

$.myPlugin = function($textbox, options) { 
    function doSomething($textbox) { 
     alert(options.someProperty); 
    } 
} 

オブジェクトなかっアクセスするプラグイン

$.fn.myPlugin = function(options) { 
    return this.each(function() { 
     var opts = $.extend({}, $.myPlugin.defaults, options); 
     new $.myPlugin($(this), opts); 
    }); 
} 

関数を作成するために使用さ

方法。

$textbox.focus(function() { doSomething($textbox); }); 

これは常に異なるオプションオブジェクトと異なるオブジェクトがある場合でも、同じsomePropertyを返します:プラグイン内部のdoSomethingの呼び出しは常に私には、例えば最初に作成プラグインオブジェクト内のオブジェクト最初のオプションのsomePropertyを返します。集中している。

私はこれを十分に明確にしたいと思います。もう細かいことが必要な場合はお知らせください。

+0

正確には何らかのプロパティがありますか?それはネストされていますか(例えば 'options.mouseSettings.clickSpeed')? – SLaks

+0

いいえ、単純な値です。 var options = {someProperty:true} –

+0

myPluginメソッドの外でdosomethingを呼び出していますか? – SLaks

答えて

1

すべての要素に対して同じoptionsオブジェクトへの参照をプラグインに与えています。

次のことを試してみてください。

return this.each(function() { 
    new $.myPlugin($(this), $.extend({ }, options)); 
}); 

これは、新しいオブジェクトに毎回optionsオブジェクトのメンバーをコピーします。 $.extend(true, { }, options)

EDIT:あなたはeachメソッド内optionsオブジェクトを拡張する必要があり、あなたのoptionsオブジェクトは、その中にネストされた他のオブジェクトがある場合、あなたはこのように、深いコピーが必要な場合があります。そうしないと、すべての要素に同じオブジェクトが残っています。

+0

私はすでにoptionsオブジェクトを拡張していました。申し訳ありませんが、私はコードサンプルにそれを含めませんでした。しかし、迅速な対応に感謝します。 –

+0

私は各ループの中で拡張呼び出しを移動しましたが、まだ運がありません。他のアイデア? –

0

は、あなたが別のclosuresを使用して別のdoSomethingのメソッドを作成していることを確認するために

var doSomething = function($textbox) { 

function doSomething($textbox) { 

を変更してみてください。 (最初のバージョンは最初に呼び出されたときに単一の関数を作成し、その関数とそのクロージャを再利用します)

関連する問題