【发布时间】:2022-08-11 21:37:48
【问题描述】:
背景
我有一个 iframe 小部件,它将嵌入到其他页面中 - 我对主机页面的结构和代码一无所知,并且 iframe 将是跨域的并且可能是沙盒化的。
我的目标是为 iframe 小部件提供一个制表位 - 关注它之后,有一个专用的组合键可以“输入”小部件,但正常的制表符应该向前跳到主机页面中的下一个可聚焦元素。
问题:在 iframe 获得焦点并检测到新的 tab 按键后,如何将焦点传递给主机页面的下一个可聚焦元素?
简单的例子:
<!-- host page -->
<button> first button </button>
<iframe src=\"myIframeWidget.com\"/>
<button> second button </button>
在上面,如果第一个按钮获得焦点,那么预期的行为是在第一个选项卡上 iframe 将获得焦点,在下一个选项卡上第二个按钮将获得焦点(跳过 iframe 内的所有可聚焦元素)。
一旦 iframe 获得焦点并按下选项卡,我需要将焦点从 iframe 传递到第二个按钮。
笔记
- 由于我的 iframe DOM 相当大,我不想将
tabindex=-1设置为所有内部可聚焦元素。 - 在撰写本文时,aria-hidden=\"true\" 不会从焦点序列中删除元素或其后代。我不知道有任何其他 aria 属性会从焦点序列中删除整个子树。
- 纯 JS 解决方案优于中继外部包的解决方案。
- 我还需要处理反向标签,但我认为同样的方法适用于正向标签 - 如果有任何重要的差异,请尽可能在您的回答中提及它们。
- 存在一种边缘情况,即在小部件之后没有任何可聚焦的内容 - 通常在这种情况下,浏览器将专注于地址栏按钮 - 如果有办法处理它,它将是很高兴知道,但这可能应该在一个单独的问题中处理。
谢谢!
-
由于浏览器在使用
TAB/SHIFT + TAB时需要确定这一点,因此很奇怪钩子没有通过浏览器 API 公开
标签: javascript iframe focus keyboard-focus