2016-03-28 18 views
-1

私はキーボードイベントのためにステージに耳を傾けたいと思います。イベントが出現すると(バブリングやターゲットではなく)直接イベントをキャッチしたいと思います。なぜ私はこれをすることができないのですか?なぜStage.addEventListener(KeyboardEvent.KEY_DOWN、onKeyDown、true)が機能しないのですか?

実際には、キーボードイベントには全くuseCaptureを使用できないようです。

チルダボタンを押して内部コンソールウィンドウを開き、フォーカスを入力フィールドに変更したいとします。だから、私はこの問題は、それは私がそれを行うにはしたくない、私の入力で「`」の文字を、書き込みされてこの

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

で受け取った記号を入力しないことを意味し、preventDefault()行動、ですか。おそらく、あなたの現在のアプリケーションについて説明し、関連するソースコードを示したら、誰かが実際にあなたを助けます... – BadFeelingAboutThis

+0

更なる情報を投稿してください – user1496491

答えて

-1

私は最終的にこの問題の回避策を見つけました。

最初に:取り扱いと停止KeyboardEvent.KEY_DOWNは、TextFieldの入力を妨げていません。この場合は役に立たないので悲しいですが、これをしない理由がいくつかあるようです。

だから、私は何をすべきことは、私はまだ私の中でtildabackquoteの兆しを置きたいかもしれinputField

 inputField.addEventListener(TextEvent.TEXT_INPUT, onTextInput); 

によってTextEvent.TEXT_INPUTのために耳を傾け、stage場合

 stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown); 

によってKeyboardEvent.KEY_DOWNに耳を傾けていますTextField(例:対処して貼り付ける)私は旗を使うことに決めました

したがって、TextEvent.TEXT_INPUTイベントが発生したとき、それがウィンドウアクションを開くかどうかを確認できます。そして、それはあなたが、キャプチャ段階でKeyDownイベントを使用することができます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

関連する問題