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] 中删除的主要内容,如果未能解决你的问题,请参考以下文章

flash AS3 如何删除舞台事件侦听器

AS3 Preloader 在本地无法工作,loaderInfo ProgressEvent.PROGRESS 事件不会触发

AS3:mouseX 在鼠标移动之前不会更新

textfield不会清楚,as3

动作脚本 3,注册,数据发送到 php,但 AS3 不会显示数据返回但没有错误

AS3 Flash 顽固的简单按钮没有出现在舞台上