在 AS3 中,stage.focus 获取/设置具有焦点的显示对象。焦点可以分配给任何 InteractiveObject 实例以及从它继承的任何东西,例如 TextFields、Sprites 和 MovieClips。
顺便说一句,我查看了这是否属于 ECMAScript 规范的一部分(因为 AS3 和 JavaScript 有共同点)并了解到在 JavaScript 中管理焦点(特别是检索它)要困难得多;较旧的浏览器不支持 document.activeElement 属性,甚至较新的浏览器也仅限于返回与输入相关的元素。如果没有这样的元素具有焦点,所有主流浏览器都会返回 body 元素——除了 IE 9,它返回 html 元素,Chrome 26 在 XHTML 文档中返回 false,但显然你可以使用 document.querySelector(':focus')。
与 JavaScript 相比,我发现 AS3 非常统一和一致,任何 InteractiveObject 都可以接收键盘焦点;但是,默认情况下,对象(除了 TextField 和 SimpleButton 实例)不会通过鼠标或键盘交互获得焦点。
当我第一次将事件侦听器附加到舞台并侦听 FocusEvent.FOCUS_IN 事件时,当我单击在舞台上创建的 MovieClip 对象时它没有触发,这使我得出结论 MovieClips/Sprites/InteractiveObjects 确实如此默认情况下不会通过单击或 Tab 键获得舞台焦点。
同时,如果我将 tabEnabled 或 buttonMode 属性设置为 true,则在单击对象时会触发事件。顺便说一句,tabEnabled 的文档说当 Sprite.buttonMode 为真时它自动为真,因此 tabEnabled 似乎是感兴趣的属性(此外,buttonMode 还启用其他功能,例如在按下回车键或空格键时触发点击事件对象具有焦点)。
我只是想知道 tabEnabled 是否是确保交互式对象在单击时接收舞台焦点的正确方法。尽管 tabEnabled 的文档说它会导致对象包含在 [keyboard] 选项卡排序中,但它没有特别提到鼠标交互,也没有提到任何通用状态,如“可以接收焦点”。似乎任何交互式对象都可以通过将 stage.focus 设置为该对象来手动分配焦点。
InteractiveObject的“tabEnabled”属性是控制是否可以通过键盘和鼠标交互分配焦点的主要属性是否正确?
在 JavaScript 中,HTML5 规范列出了一系列更复杂的条件,这些条件必须满足才能使对象被视为“可聚焦”:“如果满足以下所有条件,则元素是可聚焦的: 1. 元素的 tabindex 焦点标志是2. 元素要么正在渲染,要么是表示嵌入内容的画布元素的后代。3. 元素不是惰性的。*元素未被禁用。
更新:经过仔细检查,虽然 AS3 没有通用的“启用”属性,但似乎“mouseEnabled”功能类似,因为当设置为 false 时,“实例不接收任何鼠标事件(或其他用户输入事件,如键盘事件)。”
更新到第一次更新:包含短语“(或其他用户输入事件,如键盘事件)”的文档是错误的,因为尽管 mouseEnabled 设置为 false,但焦点对象仍会收到按键向下/向上事件。