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);
 });
4

3 に答える 3

0

匿名関数をイベントリスナーとして追加する場合、そのイベントリスナーを合理的に削除できるのは、コールバック内のみです。

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

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

}

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

于 2012-05-03T13:53:18.903 に答える
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)
于 2012-05-03T13:47:06.690 に答える
0

これは、匿名関数への参照がないと、匿名関数のフックを解除できないためです。必要に応じて、いつでも参照を保持できます。

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

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

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

もちろん、これらのことが別々のメンバー関数で発生している場合は、メンバー変数(var asteroidsMouseUpHandler:Function)を定義する必要があります。その時点で、代わりに名前付き関数として作成することもできます。また、参照を壊さないようにするために、これを1回だけ(ループではなく)実行することをお勧めします。実際、私はこのコードを説明のみを目的として示しています。

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

var asteriodsCallbacks:Dictionary = new Dictionary();

次に、そこで機能を追跡できます。

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

そして、フックを外したいときは、それを調べることができます:

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

Of course, I am ignoring existential checks for simplicity. You'd have to add that as well.

于 2012-05-03T13:58:17.480 に答える