AS3 では、stage.focus はフォーカスのある表示オブジェクトを取得/設定します。フォーカスは、InteractiveObject インスタンスと、TextField、Sprite、MovieClip など、そのインスタンスから継承されるすべてのものに割り当てることができます。
ちなみに、これが ECMAScript 仕様の一部であるかどうかを調べたところ (AS3 と JavaScript には共通点があるため)、JavaScriptではフォーカスの管理 (特にフォーカスの取得) がはるかに難しいことがわかりました。古いブラウザは document.activeElement プロパティをサポートしておらず、新しいブラウザでも入力関連の要素のみを返すように制限されています。そのような要素にフォーカスがない場合、すべての主要なブラウザーは body 要素を返します - html 要素を返す IE 9 を除き、Chrome 26 は XHTML ドキュメントで false を返しますが、明らかに document.querySelector(':focus') を使用できます。
JavaScript とは対照的に、AS3 はどの InteractiveObject もキーボード フォーカスを受け取ることができるという点で非常に均一で一貫性があることを発見しました。ただし、デフォルトでは、オブジェクト (TextField および SimpleButton インスタンスを除く) は、マウスまたはキーボードの操作によってフォーカスを受け取りません。
最初にイベント リスナーをステージにアタッチして FocusEvent.FOCUS_IN イベントをリッスンしたとき、ステージ上で作成した MovieClip オブジェクトをクリックしてもイベント リスナーが起動しませんでした。デフォルトでは、クリックまたはタブ移動によってステージ フォーカスを受け取りません。
一方、tabEnabled または buttonMode プロパティを true に設定すると、オブジェクトがクリックされたときにイベントが発生します。ちなみに、tabEnabled のドキュメントには、Sprite.buttonMode が true の場合に自動的に true になると記載されているため、tabEnabled は関心のあるプロパティのようです (また、buttonMode は、Enter キーまたはスペース キーが押されたときにクリック イベントをトリガーするなど、他の機能も有効にします。オブジェクトにフォーカスがあります)。
クリックしたときに対話型オブジェクトがステージ フォーカスを確実に受け取るようにするための正しい方法は、tabEnabled であるかどうか疑問に思っていました。tabEnabled のドキュメントには、オブジェクトが [キーボード] タブの順序に含まれると書かれていますが、特にマウスの操作については言及されておらず、「フォーカスを受け取ることができる」などの一般的な状態についても言及されていません。stage.focus をそのオブジェクトに設定することにより、インタラクティブなオブジェクトに手動でフォーカスを割り当てることができるようです。
InteractiveObject の「tabEnabled」プロパティが、キーボードとマウスの両方を介した対話を通じてフォーカスを割り当てることができるかどうかを制御する主要なプロパティであることは正しいですか?
JavaScript では、HTML5 仕様は、オブジェクトが「フォーカス可能」と見なされるために満たす必要がある、より複雑な一連の条件を示しています。 2. 要素はレンダリングされているか、埋め込みコンテンツを表す canvas 要素の子孫です. 3. 要素はinertではありません. *要素は無効化されていません."
更新: よく調べてみると、AS3 には一般的な「有効な」プロパティはありませんが、「mouseEnabled」は同様に機能するようです。これは、false に設定すると、「インスタンスはマウス イベント (またはキーボードなどの他のユーザー入力イベント) を受信しないためです」イベント)」。
最初の更新の更新: 「(またはキーボード イベントなどの他のユーザー入力イベント)」というフレーズを含めることにより、ドキュメントは間違っています。これは、mouseEnabled が false に設定されているにもかかわらず、フォーカスされたオブジェクトがキーのダウン/アップ イベントを受け取るためです。