2009年06月20日
JavaScriptからFlashにフォーカスを与えられるよ
こんな記事を見つけたけどそんなことないよ。
Flash上でキー操作をするにはFlashにフォーカスが当たっていなければならない。フォーカスが当たっていない時にJavaScriptからフォーカス出来るか実験してみた。
結果。
- Firefox 3: 一度手でフォーカスを当てる操作をした後だとフォーカス出来る
- Safari 4: 無理
- Chrome 2: 無理
- IE 8: 無理
むり!
JavaScriptからFlashにフォーカスを与えられるか
この記事ではフォーカスを得られるかどうかを MXML の Application.focusIn イベントで判別してるんだけど、ここに問題がある。
簡単にまとめると、Flash を扱う場合にはフォーカスといっても
- ブラウザが管理しているフォーカス
- 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 で)。