JavaScriptからFlashにフォーカスを与えられるよ

こんな記事を見つけたけどそんなことないよ。

Flash上でキー操作をするにはFlashにフォーカスが当たっていなければならない。フォーカスが当たっていない時にJavaScriptからフォーカス出来るか実験してみた。

結果。

  • Firefox 3: 一度手でフォーカスを当てる操作をした後だとフォーカス出来る
  • Safari 4: 無理
  • Chrome 2: 無理
  • IE 8: 無理

むり!

JavaScriptからFlashにフォーカスを与えられるか

この記事ではフォーカスを得られるかどうかを MXML の Application.focusIn イベントで判別してるんだけど、ここに問題がある。

簡単にまとめると、Flash を扱う場合にはフォーカスといっても

  1. ブラウザが管理しているフォーカス
  2. Flash が管理しているフォーカス

の2つがあるわけですよ。

1つ目は上の記事のサンプルにもあるとおり、JavaScript の focus() で変更することができる。サンプルでは jQuery 使って $('object')[0].focus(); としている。ページ内の Flash が1つだったらこれで十分。

で、今回問題となるのが2つ目。1つ目のフォーカスは Flash にあたっていても、2つ目のFlash 的なフォーカスが適切なところにないとフォーカスを持ってないように見えちゃう。結果、Application.focusIn イベントも呼ばれない。Flash 的なフォーカスを設定するには setFocus() を呼んであげよう。

以下、修正版の MXML。初期化完了時に 2. の Flash 的フォーカスを得るように改造した。

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
  focusIn="bg(true)" focusOut="bg(false)"
  applicationComplete="init()"
  backgroundColor="0xCCCCCC" backgroundImage="none">
  <mx:Script>
    <![CDATA[
      private function init():void
      {
        myInput.setFocus(); // ←ココ重要
      }
      
      private function bg(focus:Boolean):void
      {
        this.setStyle('backgroundColor', focus ? '0x333333' : '0xCCCCCC');
      }
    ]]>
  </mx:Script>
 
  <mx:TextInput/>
</mx:Application>

ブラウザの onload イベントで SWF に focus() してあげれば、ページ表示時から MXML 内のテキストにフォーカスが行くことを確認した(IE7 と Firefox3 で)。