2016-03-28 125 views
-1

我想要监听键盘事件的舞台,并且我想直接在事件发生时捕获事件(不在冒泡或目标中)。为什么我不能这样做?为什么stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown,true)不起作用?

事实上,我似乎根本不能使用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; 
     } 
    } 

的问题是,它写入在我输入“`”的性格,我不希望它做的。所以,我决定尝试听取捕获阶段的键盘事件来停止它的传播。但似乎阶段不能有捕捉阶段,因为它之前没有节点。我如何正确处理这种情况?

+0

您可以在捕获阶段使用的keydown。也许如果你解释你当前的应用程序,并显示相关的源代码,有人会真正帮助你... – BadFeelingAboutThis

+0

更新信息附加信息 – user1496491

回答

-1

我终于找到了解决办法针对此问题。

首先:处理和停止KeyboardEvent.KEY_DOWN不会阻止TextField获得输入。这很令人伤心,因为在这种情况下,它会很有用,但似乎还有其他一些不这样做的原因。

所以,我应该做的是通过inputField

 inputField.addEventListener(TextEvent.TEXT_INPUT, onTextInput); 

监听TextEvent.TEXT_INPUT,并在情况下,由stage

 stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown); 

KeyboardEvent.KEY_DOWN我可能还是要放backquote迹象tilda在我TextField(例如通过应对和粘贴它们)我决定使用一个标志

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; 
     } 
    } 
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; 
    } 
} 
+0

据我所知,点击一个窗口会改变舞台的焦点,这意味着总是有机会让需要的物体失去焦点。 – user1496491

+0

@ user1496491 - 是的(如果你点击的是交互式的),但只要它是一个专注于舞台的孩子,它就不会成为问题。这是对您的问题的严格回答。 – BadFeelingAboutThis

相关问题