blockly > FocusManager

FocusManager 类

一个单例(每个页面一个),用于跨一个或多个 IFocusableTree 管理 Blockly 焦点,并以双向方式将此焦点与 DOM 同步。

如果调用方希望明确更改页面上所选 Blockly 组件的输入焦点,应使用此管理器中的焦点函数。

该管理器负责处理来自 DOM 的焦点事件(可能因用户点击网页元素而产生),并确保相应的 IFocusableNode 清楚地标记为主动/被动突出显示,就像通过调用 focusNode() 来表示一样。

Signature:

export declare class FocusManager 

构造函数

构造函数 修饰符 说明
(构造函数)(addGlobalEventListener) 构造 FocusManager 类的新实例

属性

属性 修饰符 类型 说明
ACTIVE_FOCUS_NODE_CSS_CLASS_NAME

static

readonly

(未声明)

分配给当前具有有效 DOM 和 Blockly 焦点的 IFocusableNode 元素的 CSS 类。

不应直接使用此值。请改用 FocusManager 来确保节点具有有效焦点(通过 DOM 焦点自动实现,或通过此类提供的各种 focus* 方法手动实现)。

建议也不要使用此类名称进行查询。请改用 FocusableTreeTraverser 或 IFocusableTree 的方法来查找特定节点。

PASSIVE_FOCUS_NODE_CSS_CLASS_NAME

static

readonly

(未声明)

分配给当前具有被动焦点(即,它们是其相关树中最近具有主动焦点的节点 - 请参阅 ACTIVE_FOCUS_NODE_CSS_CLASS_NAME - 如果请求其周围的树成为焦点,它们将再次获得主动焦点,即使用下面的 focusTree)的 IFocusableNode 元素的 CSS 类。

如需了解直接使用此常量的注意事项和限制(通常情况下,永远都不应使用此常量),请参阅 ACTIVE_FOCUS_NODE_CSS_CLASS_NAME。

方法

方法 修饰符 说明
ephemeralFocusTaken()
focusNode(focusableNode)

将 DOM 输入焦点放在指定节点上,并将其标记为处于活跃焦点状态。

任何之前处于聚焦状态的节点都将更新为被动突出显示(如果它位于不同的可聚焦树中)或模糊显示(如果它位于同一可聚焦树中)。

**重要提示**:如果所提供的节点无法聚焦(例如,其 canBeFocused() 方法返回 false),系统会忽略该节点,并且任何现有的聚焦状态都将保持不变。

请注意,这可能会更新指定节点的元素的 tabindex,以确保屏幕阅读器在焦点位于该元素上时可以正确读出该元素。

focusTree(focusableTree)

聚焦特定的 IFocusableTree。这表示将有效焦点恢复到树的被动聚焦节点,或聚焦树的根节点。

请注意,如果指定的树已具有焦点节点,则此方法不会更改任何现有焦点(除非该节点具有被动焦点,在这种情况下,该节点将恢复为主动焦点)。

如需详细了解其他节点会受到哪些影响,请参阅 getFocusedNode。

getFocusedNode()

返回当前具有焦点的 IFocusableNode(始终与具有焦点的 IFocusableTree 相关联),如果没有,则返回 null。

请注意,此函数将与 IFocusableTree.getFocusedNode() 保持一致。也就是说,如果树本身具有焦点,但其非根子节点都没有焦点,此函数将返回 null,但 getFocusedTree() 不会。

另请注意,如果当前捕获了临时焦点(例如,使用 takeEphemeralFocus),则此处返回的节点可能当前没有 DOM 焦点。

getFocusedTree()

返回当前具有焦点的 IFocusableTree;如果没有,则返回 null。

另请注意,如果当前捕获了临时焦点(例如,使用 takeEphemeralFocus),则此处返回的树可能当前没有 DOM 焦点。

getFocusManager() static

返回页面全局 FocusManager。

系统保证返回的实例在函数调用期间不会发生变化,但可能会在网页加载期间发生变化。

isRegistered(tree) 返回指定树是否已使用 registerTree 在此管理器中注册,但尚未通过 unregisterTree 取消注册。
registerTree(tree, rootShouldBeAutoTabbable)

注册一个新的 IFocusableTree 以进行自动焦点管理。

如果树当前具有 DOM 焦点元素,则在该焦点更改为新的受监控元素/节点之前,它不会影响此管理器中的内部状态。

如果所提供的树已在此管理器中注册,此函数会抛出异常。在无法确定树是否已注册的情况下,请使用 isRegistered 进行检查。

您可以自定义树的注册,以配置自动制表位。具体而言,此功能可让用户能够通过 Tab 键导航到树的根,但前提是该树未处于有效焦点状态。如果此功能处于停用状态,则当树的根首次获得焦点时,系统会自动将其设为可聚焦(但不可通过 Tab 键聚焦),就像任何其他可聚焦节点一样。

takeEphemeralFocus(focusableElement)

暂时捕获特定元素的焦点,直到返回的 lambda 被调用。预计这对于对话框等临时界面流程尤其有用。

重要提示:必须调用返回的 lambda,否则自动聚焦功能将无法在网页上的任何位置正常运行。强烈建议将 lambda 调用与相应界面的关闭相关联,这样一来,如果手动将输入更改为临时界面之外的元素,界面应关闭并恢复自动输入。请注意,此 lambda 必须只调用一次,后续调用会抛出错误。

请注意,即使临时焦点处于有效状态,管理器也会继续跟踪 DOM 输入信号,但只有在调用返回的 lambda 时,它才会实际更改节点状态。此外,在任何给定时间,只能有 1 个临时焦点上下文处于活跃状态(尝试同时激活多个临时焦点上下文会导致抛出错误)。

unregisterTree(tree)

从自动焦点管理中取消注册 IFocusableTree。

如果树之前有焦点节点,则会移除其突出显示效果。此函数不会更改 DOM 焦点。

如果所提供的树当前未在此管理器中注册,此函数会抛出异常。

如果树已注册为自动标签页管理,此函数将重置树的根元素的 tabindex。