在AS3中,stage.focus获取/设置具有焦点的显示对象。焦点可以分配给任何InteractiveObject实例及其继承的任何实例,如TextFields,Sprites和MovieClips。顺便提一句,我查看是否有任何这是ECMAScript规范的一部分(因为AS3和JavaScript有共同之处),并了解到在JavaScript中managing the focus (retrieving it in particular) is much more difficult;旧的浏览器不支持document.activeElement属性,甚至更新的浏览器仅限于返回与输入相关的元素。如果没有这样的元素有焦点,所有主流浏览器都返回body元素 - 除了IE 9,它返回html元素,Chrome 26在XHTML文档中返回false,但显然你可以使用document.querySelector(':focus')。在AS3中,什么属性决定InteractiveObject是否可以通过鼠标点击来获得舞台焦点?
与JavaScript相比,我发现AS3非常统一且一致,因为任何InteractiveObject都可以接收键盘焦点;然而,对象(除了TextField和SimpleButton实例)默认情况下不通过鼠标或键盘交互接收焦点。
当我第一次将事件监听器附加到舞台上并且侦听了FocusEvent.FOCUS_IN事件时,当我单击了舞台上创建的MovieClip对象时,它并未触发,这导致我得出结论:MovieClips/Sprites/InteractiveObjects在默认情况下不会通过单击或切换获得舞台焦点。同时,如果我将tabEnabled或buttonMode属性设置为true,则该事件在单击对象时触发。顺便提一句,tabEnabled的文档说,当Sprite.buttonMode为true时它会自动为true,所以tabEnabled似乎是感兴趣的属性(另外,buttonMode还启用其他功能,例如当按下Enter或Space键时触发点击事件该对象具有焦点)。
我只是想知道,如果tabEnabled是确保交互式对象单击时接收舞台焦点的正确方法。尽管tabEnabled的文档说它导致对象被包含在[keyboard]标签排序中,但它没有特别提及鼠标交互,也没有提及像“可以接收焦点”这样的任何通用状态。似乎任何交互式对象都可以通过将stage.focus设置为该对象来手动分配焦点。
InteractiveObject的“tabEnabled”属性是否是控制是否可以通过键盘和鼠标进行交互分配焦点的主要属性是否正确?
在JavaScript中,HTML5规范列出了一系列必须满足的条件,以使对象被视为“可聚焦”:“如果满足以下所有条件,则元素是可聚焦的:1.元素的tabindex焦点标志被设置2.元素被渲染或者是代表嵌入内容的画布元素的后代3.元素不是inert *该元素未被禁用。
更新:仔细检查后,尽管AS3没有通用的“enabled”属性,但似乎“mouseEnabled”的功能类似,因为设置为false时,“实例不会收到任何鼠标事件(或其他用户输入事件,如键盘事件)。“
第一次更新的更新:通过加入短语“(或其他用户输入事件,如键盘事件)”,文档是错误的,因为尽管mouseEnabled被设置为false,但被聚焦的对象仍然接收到按键向下/向上事件。
感谢您的一个伟大和完整的答案。我发现可以通过FocusEvent.MOUSE_FOCUS_CHANGE和FocusEvent.KEY_FOCUS_CHANGE事件覆盖整个焦点系统,因为这些事件在FOCUS_IN和FOCUS_OUT事件之前并且可以取消,这与FOCUS_IN/OUT事件不同。更重要的是,MOUSE_FOCUS_CHANGE事件中目标和相关对象都被填充(即非空),即使它由于被点击的对象具有tabEnabled为假而生成了与null相关的对象的FOCUS_OUT事件。这是改变默认行为的关键。 – Triynko
也想提到,尽管文档声称mouseEnabled阻止鼠标事件以及“其他用户输入事件,如键盘事件”,但它是错误的,因为尽管mouseEnabled(和mouseChildren)被设置为false,但具有焦点的对象仍然接收键盘事件。 – Triynko