2012-05-03 7 views
0

私はこのメソッドをaddEventListerで渡す方法を学びました。ここでは、コードです:イベントリスナーを削除

for (var i:uint = 0; i < asteroids.length; i++) 
{ 

    asteroids[i].x = Math.random() * 450; 
    asteroids[i].y = Math.random() * 450; 
    asteroids[i].addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent){ 
     changeValue(e, otherArguments); 
    }); 

} 



public function changeValue(event:MouseEvent, otherArguments:Object):void 
{ 

    playSound(anote); 
    trace(event.currentTarget); 

} 

はいますが、むしろ、パラメータに比べて、通常のように関数を宣言していないのはなぜ

asteroids[i].addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent){ 
    changeValue(e, otherArguments); 
}); 

答えて

0

からイベントリスナーを削除する方法についての説明がありませんか?あなたは、次の操作を行うことができます。

for (var i:uint = 0; i < asteroids.length; i++) 
{ 

    asteroids[i].x = Math.random() * 450; 
    asteroids[i].y = Math.random() * 450; 
    asteroids[i].addEventListener(MouseEvent.MOUSE_UP, onMouseUp); 
    }); 

} 

public function onMouseUp(e:MouseEvent) { 
    changeValue(e, otherArguments); 
} 

public function changeValue(event:MouseEvent, otherArguments:Object):void 
{ 
    playSound(anote); 
    trace(event.currentTarget); 

} 

次のようにあなたがそれを削除することができます

asteroids[index].removeEventListener(MouseEvent.MOUSE_UP, onMouseUp) 
+0

マウスダウンイベント関数に3つの変数を渡しています。ドラッグが終了すると、3つの変数がマウスダウンイベント関数に渡されます。この方法でこの方法を使用すると問題が発生するはずです。私は簡単に到達する機能にムービークリップ自体を渡しています。あなたのメソッドを使用するとき、ムービークリップを渡すことも、それに到達することも可能ですか? – osmanraifgunes

0

あなたがイベントリスナーとして匿名関数を追加すると、あなたが合理的にそのイベントリスナーを削除することができる唯一の時間は内部でコールバック

public function changeValue(event:MouseEvent, otherArguments:Object):void 
{ 

    playSound(anote); 
    trace(event.currentTarget); 
    event.currentTarget.removeEventListener(MouseEvent.MOUSE_UP, arguments.callee); 

} 

それ以外の場合は、削除するために非匿名機能が必要です。

+1

私はこれに同意するとは言えません。あなたはいつも無名関数への参照を保持することができます。実際にそうするのが理にかなっている場合があります。 –

+0

@BrianGenisioそれは本当です。私は(間違って)私の頭の中で匿名の機能を考慮しなくなり、私の答えに間違った言い回しができます。 –

0

これは、匿名関数が参照されていない場合、その関数をアンフックできないためです。これらの事は別のメンバ関数で何が起こっている場合は、メンバ変数(var asteroidsMouseUpHandler:Function)を定義する必要があり、もちろん

asteroidsMouseUpHandler = function(e:MouseEvent){ 
    changeValue(e, otherArguments); 
}; 

asteroids[i].addEventListener(MouseEvent.MOUSE_UP, asteroidsMouseUpHandler); 

asteroids[i].removeEventListener(MouseEvent.MOUSE_UP, asteroidsMouseUpHandler); 

:あなたが望む場合は、あなたはいつも周りの参照を保持することができます。その時点で、代わりに名前付き関数として作成したいと思うかもしれません。また、リファレンスを壊すのを避けるために、これを1回だけ(ループではなく)実行する必要があります。本当に、私はこのコードを説明目的でのみ示しています。

otherArgumentsが特定のasteroids[i]インスタンスに固有であるため、実際に新しい匿名関数をフックするたびに作成されるため、これをさらに行うと考えられます。その場合、それはあなたが本当にやりたいことであれば、あなたは辞書であなたの無名関数を追跡することができます。

asteroidsCallbacks[asteroids[i]] = asteroidsMouseUpHandler; 
asteroids[i].addEventListener(MouseEvent.MOUSE_UP, asteroidsMouseUpHandler); 

var asteriodsCallbacks:Dictionary = new Dictionary(); 

その後、あなたはそこに機能を追跡することができます

そして、あなたは外したいときに、あなたはそれを見ることができます:もちろん

asteroids[i].removeEventListener(MouseEvent.MOUSE_UP, asteroidsCallbacks[asteroids[i]]); 

は、私は簡単にするために、存在チェックを無視しています。それを追加する必要があります。

+0

Infact、私が使用した方法は働いていた。しかし、問題は、触れられているように、ファットをクリックした後に関数を1つ以上フックします。つまり、最初のクリックでは1回目の呼び出し、2回目のクリックは2回目の呼び出しなどです。私はあなたの方法にそれを変換しましたが、それは再び同じ結果を与えます。 – osmanraifgunes

+0

fon insatnce:changeValue(変数、変数){trace( "result")} 3回クリックした後の画面上のトレースは、first click:resultです。 2回目のクリック:結果の結果。 3回目のクリック:結果の結果。 – osmanraifgunes

+0

私はそのような問題を打開しました: --------------------------------------- -------------- var beyazTas1:ムービークリップ。 beyazTas1.addEventListener(MouseEvent.MOUSE_DOWN、function(e:MouseEvent){IEventDispatcher(e.currentTarget).removeEventListener(e.type、arguments.callee);}); ------------------------------------------------- ------- 正常に動作します。しかし、新しい問題があります。イベントリスナーを25のムービークリップに追加しています。そのうちの1つが使用されている場合は、すべてのイベントリスナーをすべて削除します。私の方法は、使用済みのものだけを取り除くことです。 – osmanraifgunes

関連する問題