2010-12-06 6 views
1

私はjavascript関数それらの一つ一つにのonClickを添付するために、ループを使用している「アイテム」observeを使用してその関数が割り当てられている場合、どのように関数にパラメータを渡しますか?

と呼ばれるクラスには約12のdiv要素を持っている:

for(var i = 0; i < $$(".item").length; i++){ 
    $$(".item")[i].observe("click", detailPopup); 
} 

ので、私はのいずれかをクリックした場合を"item"クラスの要素は、 "detailPopup"関数を実行します。しかし、私はその関数にパラメータを渡したいと思います。具体的には、「this」()を渡したいと思います。

どうすればいいですか?

可能な限り具体的な質問をしたと思いますが、私が知らなかった場合は私に教えてください。私は質問を明確にします。

感謝!あなたはこのようにそれを行うことができます

+0

この 'for'ループが実行されたときのコンテキストと同じように、現在の' this'を渡したいと思いますか? 'this'はすでに' detailPopup'関数の中で 'this'キーワードを使用するだけで、あなたが望むものを既に参照しているはずです。 –

答えて

2

私は明示的に自分自身が、私はあなたがあなたのパラメータをburn inすることができるはずと信じてこれを試していないが。

$$('.item').invoke('observe', 'click', detailPopup.curry(this)); 

thisへの参照は、他のすべてのパラメータの前に渡されます。あなたの関数は次のようになります... this

function detailPopup(parent, event) 
{ 
    ... 

本来の意味は、トリガ素子に、ハンドラのスコープのために保存されます。また、私はinvokeを使用して、インデックス値と匿名の関数やものを混乱させないようにしました。

0

for(var i = 0; i < $$(".item").length; i++){ 
    (function(t){ 
     $$(".item")[i].observe("click", function { detailPopup(t); }); 
    })(this); 
} 

(function(t){ ... })(this);thisが正しいこのあるそうでなければ、問題のスコープを取得することを保証クロージャです。これは、ループがその中の1つであるため、いくつかの状況では重要です。あなたがforループを持っていなかった場合は、これを行うことができました:

$$(".item")[i].observe("click", function { detailPopup(someParameter); }); 
+0

'(function ...)(parameter)'フォームとは何ですか? – clockworkgeek

+0

匿名の自己実行機能です。 http://stackoverflow.com/questions/186024/how-do-you-explain-this-structure-in-javascriptを見てください。最初の答えは正しいです。 –

1

無名関数を作成します。 detailPopupの代わりに、次のように入力してください。function() { detailPopup(that); }

thatとは何ですか? thisの値はネストされた関数に転送されないため、使用する前に変数に割り当てる必要があります。例:var that = this;

var that = this; 

for(var i = 0; i < $$(".item").length; i++){ 
    $$(".item")[i].observe("click", function() { detailPopup(that); }); 
} 
2

あなたは関数にthisをバインドすることができます。

for(var i = 0; i < $$(".item").length; i++){ 
    $$(".item")[i].observe("click", detailPopup.bind(this)); 
} 

JSFiddle Example

+0

これは賢いです。 'detailPopup'の' this'の値は、通常のイベントと同じようにトリガされた要素ではなく、呼び出し元になります。 – clockworkgeek

+0

@clockworkgeek:正確には、JavaScriptフレームワークはFunction.apply()とFunction.call()メソッドを使ってこれを行うことができます。これらの2つの機能はかなり素晴らしいです。 https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Function – subhaze

関連する問題