为什么stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown,true)不起作用?

时间:2016-03-28 09:57:31

标签: actionscript-3 events keyboard

我想听一下键盘事件的舞台,我想在它出现时直接捕捉一个事件(不是冒泡或目标)。为什么我不能这样做?

实际上我似乎根本无法使用useCapture进行键盘事件。

我想通过按tilda按钮打开我的内部控制台窗口,并将焦点更改为输入字段。所以,我写了这样的东西

    public function init(stage:Stage):void
    {
        stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown);
    }

    private function onStageKeyDown(event:KeyboardEvent):void
    {
        event.stopImmediatePropagation();

        switch(event.keyCode)
        {
            case Keyboard.BACKQUOTE:
                visible = !visible;
                stage.focus = visible ? inputField : stage;
                break;
        }
    }

问题是,它写道"`"我输入中的字符,我不想让它做。因此,我决定尝试在捕获阶段收听键盘事件以阻止其传播。但似乎阶段不能有捕获阶段,因为之前没有节点。我该如何妥善处理这种情况?

2 个答案:

答案 0 :(得分:0)

要简单回答您的问题,您可以在捕获阶段收听键盘事件。

最有可能的原因是,你没有注意力。如果您的应用程序中没有任何焦点,则舞台将不会获得键盘事件。默认情况下,当swf运行时,没有任何焦点。

在您的应用程序启动时(除了舞台本身之外的任何内容)给予项目焦点,并且事件将会到来。

public function init(stage:Stage):void
{
    stage.focus = this; //assuming this is the document class
    stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown, true);
}

现在,为了跟进你实际想要完成的事情(除了你的实际问题),你需要做的就是听取正确的事件(TEXT_INPUT)。你的答案很接近,但如果不需要标志或关键听众,它可以更简单:

stage.focus = this; //give something focus, probably not needed if you have to click the text input in order to input text

//listen on the capture phase for text input
stage.addEventListener(TextEvent.TEXT_INPUT, onStageTextInput, true);

function onStageTextInput(event:TextEvent):void
{
    switch(event.text)
    {
        //if the new text was a backquote or @ sign, don't let the event trigger it's normal action
        case "`":
        case "@":
            event.preventDefault(); //prevent default is needed
            break;
    }
}

答案 1 :(得分:-1)

我终于找到了解决此问题的方法。

首先:处理和停止KeyboardEvent.KEY_DOWN并不妨碍TextField获取输入。这很难过,因为在这种情况下它会很有用,但似乎还有一些其他理由不这样做。

所以,我应该做的是通过TextEvent.TEXT_INPUT

收听inputField
        inputField.addEventListener(TextEvent.TEXT_INPUT, onTextInput);

并通过KeyboardEvent.KEY_DOWN

收听stage
        stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown);

如果我可能仍想在tilda中添加backquoteTextField个符号(例如通过应对和粘贴它们),我决定使用标记

    private function onStageKeyDown(event:KeyboardEvent):void
    {
        switch(event.keyCode)
        {
            case Keyboard.BACKQUOTE:

                ...
                inAction = true;
                break;
        }
    }

所以当TextEvent.TEXT_INPUT事件触发时,我可以看到是否打开了窗口操作。如果是,那么preventDefault()行为,这意味着不在TextField输入收到的签到

    private function onTextInput(event:TextEvent):void
    {
        if(inAction)
        {
            event.preventDefault();
            inAction = false;
        }
    }