2011-08-08 10 views
1

複数のボタンをターゲットにして別のボタンをクリックして異なる値を取得したい。複数のボタンをターゲットにして別のボタンをクリックして異なる値を取得

3つのボタンがあるとします。 "button01"、「button02、 "button03は"

これは私のコードです:代わりに別のボタンをクリックして、別の値を取得する

var targetArr:Array = ["button01","button02","button03"]; 
for (var i:int = 0; i < targetArr.length; i++) 
{ 
    var target = getChildByName(targetArr[i]); 
    target.addEventListener(MouseEvent.CLICK, targetFunc); 
    function targetFunc(event:MouseEvent):void 
    { 
     trace(i); 
    } 
} 

、私は常に取得"button02"をクリックすると値として "1"が得られ、 "button03"をクリックすると値として "2"が得られます。どのようにするのですか?

答えて

1

あなたはほぼそこにいます! iへの参照がすべてのイベントハンドラによって共有されていることを確認してください。あなたが望むのは、イベントハンドラが登録されたときの値iの特徴的なコピーです。

これを行うには、ループの反復ごとに新しいクロージャを作成します。今起こっている何

var targetArr:Array = ["button01","button02","button03"]; 
for (var i:int = 0; i < targetArr.length; i++) 
{ 
    var target = getChildByName(targetArr[i]); 
    target.addEventListener(MouseEvent.CLICK, getTargetFunc(i)); 
    function getTargetFunc(value:Number):Function { 
     return function(event:MouseEvent):void { 
      trace(value); 
     } 
    } 
} 

たちは、イベントハンドラ関数を返すヘルパー関数にiの特定の値を渡しているということです。このようにして、ハンドブックを登録する時点で、特定の値のiを閉じるのクロージャを使用しています。

編集:もう1つ少しものを配置する方法が異なります。ループの繰り返しごとに、ハンドラを登録する関数を呼び出すことができます。

addHandler(i); 
function addHandler(value:Number):void { 
      target.addEventListener(MouseEvent.CLICK, targetFunc); 
    function targetFunc(event:MouseEvent):void 
    { 
     trace(value); 
    }   
} 
+0

ありがとうPeter!それが私が探しているものです。 – Bayu

+0

ねえ、問題ありません!私はこの問題に取り組むもう一つの方法を示している別のコードサンプルを私の答えに加えました - 最終的には同じ原則を使用します。 – Peter

+0

もう一度代替コードをありがとうございます。私はこれが私が理解しやすいと思う:D – Bayu

関連する問題