IFocusableTree 接口
表示具有自己的活动/被动焦点上下文的可聚焦元素树。
请注意,焦点由 FocusManager 处理,并且树实现一次最多只能有一个 IFocusableNode 处于焦点状态。如果树本身具有焦点,则树的聚焦节点被视为“活跃”(如果其他树具有焦点,则为“非活跃”)。
焦点在一个或多个树之间共享,其中每个树只能有一个活动节点或被动节点(并且在任何给定时间,整个网页上只能存在一个活动节点)。被动焦点的概念旨在向用户提供上下文,让他们知道在导航回之前获得焦点的树时,焦点会恢复到何处。
请注意,如果需要获取树的当前聚焦节点(被动或主动),可以使用 FocusableTreeTraverser.findFocusedNode。
请注意,如果需要为此树检索特定节点,请使用 lookUpFocusableNode 或 FocusableTreeTraverser.findFocusableNodeFor。
Signature:
export interface IFocusableTree
方法
方法 | 说明 |
---|---|
getNestedTrees() | 返回此树下的所有直接嵌套树。 请注意,返回的树列表不需要稳定,但所有返回的树都 *必须* 向 FocusManager 注册。此外,此方法必须返回实际的嵌套树,因为忽略嵌套树会影响焦点更改如何映射到特定节点及其树,可能会导致用户感到困惑。 |
getRestoredFocusableNode(previousNode) | 返回此树的 IFocusableNode,当树本身的焦点返回到它时,它应接收活跃焦点。 在实现不会返回 null 的此方法版本时,请注意以下有关树的焦点生命周期的一些非常重要的注意事项:1. 由于节点可能会被删除,因此 null previousNode 无法保证首次获得焦点状态。2. 仅当树本身通过 Tab 导航或 FocusManager.focusTree() 获得焦点时,才会使用此方法。在许多情况下,系统会直接将焦点移至之前获得焦点的节点,而绕过此方法。3. 默认行为(即在此处返回 null)涉及恢复上一个节点 (previousNode) 或将焦点移至树的根。4. 所提供的节点有时可能已失效,例如,当尝试聚焦于最近从其父树中移除的节点时。实现可以检查节点的有效性,以专门指定应将焦点回退到的节点。 此方法主要用于为树实现提供一种指定比其根节点更好的默认节点的方法。 |
getRootFocusableNode() | 返回树的顶级可聚焦节点。 如果 FocusManager 希望在没有当前聚焦的节点的情况下聚焦树,则预计会聚焦返回的节点。 |
lookUpFocusableNode(id) | 返回与指定元素 ID 对应的 IFocusableNode;如果此树中没有具有该 ID 的确切节点,或者该 ID 对应于树的根,则返回 null。 这永远不会与嵌套树匹配。 |
onTreeBlur(nextTree) | 当此树之前处于活跃焦点的节点现在处于被动焦点,并且此树没有其他活跃节点取代它时调用。 这与 onTreeFocus() 具有相同的实现限制和注意事项。 |
onTreeFocus(node, previousTree) | 当此树的某个节点获得活跃焦点时调用。 请注意,previousTree 为 null 并不一定表示这是 Blockly 首次获得焦点。事实上,我们很难对之前的焦点状态做出假设,因为之前的 null 树只表示在该树获得焦点之前,Blockly 没有保持活跃焦点(这可能是因为焦点离开了 Blockly 注入 div,或者是因为其他情况,例如暂时性焦点)。 请参阅 IFocusableNode.onNodeFocus(),因为实现与该方法具有相同的限制。 |