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

那是因为如果你没有对它的引用,你就不能解开一个匿名函数。如果您愿意,您可以随时保留参考:

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

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

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

当然,如果这些事情发生在单独的成员函数中,那么你需要定义一个成员变量(var asteroidsMouseUpHandler:Function)。此时,您可能只想将其创建为命名函数。您也只想这样做一次(而不是循环)以避免破坏您的参考。真的,我显示此代码仅用于说明目的。

进一步考虑这一点,您可能会这样做,因为它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]]);

当然,为了简单起见,我忽略了存在检查。您还必须添加它。

于 2012-05-03T13:58:17.480 回答
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

当您将匿名函数添加为事件侦听器时,您唯一可以合理地删除该事件侦听器的时间是在回调内部。

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 回答