【问题标题】:AS3 Events and passing parametersAS3 事件和传递参数
【发布时间】:2011-07-11 02:46:52
【问题描述】:

我想在触发事件时传递参数。我的功能:

private function keyChange(e:KeyboardEvent, setValue:Boolean):void

这样我就可以使用相同的功能来设置按键是向上还是向下。我将如何编写事件监听器?我试过了:

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyChange(,true));

然而这并没有奏效。这可能吗?谢谢

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    直接的方法是检查事件处理程序中的事件。

    stage.addEventListener(KeyboardEvent.KEY_UP, keyChange);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyChange);
    
    private function keyChange(e:KeyboardEvent) {
        if (e.type == KeyboardEvent.KEY_DOWN) {
             // ... handle key down, etc...
        }
    }
    

    您也可以通过传递 addEventListener 一个传递您想要的参数的内联函数来做到这一点,或者可能对闭包做一些棘手的事情,但它不会比上述方式为您带来任何好处。

    【讨论】:

    • 不过,这并没有解决 OP 的问题。
    【解决方案2】:

    像这样:

    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyChangeHandler);
    stage.addEventListener(KeyboardEvent.KEY_UP, keyChangeHandler);
    
    ...
    
    private function keyChangeHandler(e:KeyBoardEvent):void
    {
        var keyDown:Boolean = e.type == KeyBoardEvent.KEY_DOWN;
    
        ...
        // Do stuff
    }
    

    但是如果要传递参数,则需要使用自定义事件:

    public class KeyBoardActionEvent extends KeyBoardEvent
    {
        public var shouldSetValue:Boolean;
        public function KeyBoardActionEvent(setValue:Boolean, type:String, bubbles:Boolean = false, cancelable:Boolean = false):void
        {
            shouldSetValue = setValue;
            super(type, bubbles, cancleable);
        }
    }
    

    【讨论】:

      【解决方案3】:

      这是找到解决方案的最简单方法,

       stage.addEventListener(KeyboardEvent.KEY_DOWN,function(e:MouseEvent):void{keyChange(e,true)});
      

      【讨论】:

        【解决方案4】:

        完全有可能。简单易行:

        private function keyChange(setValue:Boolean):Function {
          return function(e:KeyboardEvent):void {
            // Now you have both "e" and "setValue" here
          }
        }
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyChange(true));
        

        如果你想稍后删除监听器怎么办?把keyChange()带出去:

        var functionKeyChange:Function = keyChange(true);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, functionKeyChange);
        stage.removeEventListener(KeyboardEvent.KEY_DOWN, functionKeyChange);
        

        如果您觉得这个解决方案很有趣,请参阅this answer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 2013-09-17
          • 1970-01-01
          • 1970-01-01
          • 2013-12-21
          • 1970-01-01
          • 2010-09-30
          相关资源
          最近更新 更多