2016-03-28 121 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

相關問題