删除事件监听器

时间:2012-05-03 13:41:51

标签: actionscript-3 flash

我已经学会了使用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);
 });

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

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

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

}

否则,您需要使用非匿名函数才能将其删除。

答案 2 :(得分: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]]);

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