我已经学会了使用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 :(得分: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]]);
当然,为了简单起见,我忽略了存在性检查。你也必须添加它。