AS3 : EventListener 不会在 [IF] 中删除
Posted
技术标签:
【中文标题】AS3 : EventListener 不会在 [IF] 中删除【英文标题】:AS3 : EventListener won't be removed in an [IF] 【发布时间】:2014-08-10 12:30:40 【问题描述】:我已经搜索了如何通过EventListeners传递参数,我使用该方法没有调用匿名函数,以便稍后删除EventListener。
问题是如果在 IF 函数之外,EventListener 将被删除,但如果它在 IF 函数中则不会。 我怎么能这样做?
代码:
function dragShip(m:MouseEvent):void
var func:Function = dispositionShip(m.target);
if (isDragging == false)
stage.addEventListener(KeyboardEvent.KEY_DOWN, func);
m.target.startDrag(true);
isDragging = true;
else
stage.removeEventListener(KeyboardEvent.KEY_DOWN, func);
isDragging = false;
placeShip(m.target , mouseX , mouseY , m.target.rotation);
// if the EventListener is put here, it gets removed, but not if put just in the else
注意:dispositionShip()
返回一个函数。
编辑:这是代码的以下部分:
function dispositionShip(shipTarg):Function
return function(k:KeyboardEvent):void
rotateShip(k,shipTarg);
;
function rotateShip(k:KeyboardEvent,ship:Object):void
if (k.keyCode == 39)
ship.rotation += 90;
else if (k.keyCode == 37)
ship.rotation -= 90;
此外,如果我将rotateShip(k,shipTarg);
替换为简单的trace
,它也不起作用。
【问题讨论】:
你犯了一个大错。var func:Function = dispositionShip(m.target);
- 你实际上是以这种方式调用函数。如果它没有自己返回一个函数,监听器将无法正常工作!
dispositionShip 是否在每次调用时都创建一个函数?或者从字典中返回一个或者是一个错误(你错误地调用了函数并且你打算得到一个部分函数
是的,它调用了函数dispositionShip()
,但是函数返回了一个函数。请参阅上面的编辑。
相当奇怪的设置,可能是您问题的根源。它不会删除正确的方法。
你能展示 dispositionShip 函数的主体吗?看起来它每次都返回不同的函数,这就是为什么它没有在 else 部分中删除(我确定稍后会调用它)并且它在外部工作(在注册事件后立即调用 - 因此使用相同的函数)。
【参考方案1】:
每次打电话
function dispositionShip(shipTarg):Function
return function(k:KeyboardEvent):void
rotateShip(k,shipTarg);
;
您正在创建一个名为 Function
的新匿名 Object
,它调用 rotateShip()
,因此当您调用 stage.removeEventListener(KeyboardEvent.KEY_DOWN, func);
时,您的 func
与您传递给 @ 的 func
是不同的 Object
987654329@,因此它与原始侦听器不匹配并且不会被删除。
更好的方法是将当前鼠标目标存储在成员var
中。即:
var currentShip:Object;
function dragShip(m:MouseEvent):void
if (isDragging == false)
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPress);
m.target.startDrag(true);
isDragging = true;
currentShip = m.target;
else
stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPress);
isDragging = false;
placeShip(m.target , mouseX , mouseY , m.target.rotation);
currentShip = null;
function keyPress(k:KeyboardEvent):void
rotateShip(k,currentShip);
【讨论】:
以上是关于AS3 : EventListener 不会在 [IF] 中删除的主要内容,如果未能解决你的问题,请参考以下文章
AS3 Preloader 在本地无法工作,loaderInfo ProgressEvent.PROGRESS 事件不会触发