假设我有一个充满可聚焦元素的文档,要么是因为它们天生就具有可聚焦性(如<input type="text">
),要么是因为它们具有tabindex="0"
或类似的。
现在假设我想要将文档的一部分显示为模式对话框,并且我不希望用户被对话框之外的任何内容分散注意力。我希望 tab 键仅在对话框的容器元素内的可聚焦元素之间循环。最简单的方法是什么?
如果可能的话,我正在寻找一种解决方案,它不关心对话框的内容或页面的其余部分是什么,并且不尝试修改它们。也就是说,例如,我不想让对话框之外的元素无法聚焦。首先,这需要进行可逆的更改并跟踪状态。其次,这需要知道一个元素可以被聚焦的所有可能的方式。对我来说,这感觉混乱、脆弱和不可扩展。
我的第一次尝试看起来像这样,但只在向前的方向上工作(按 Tab)。它不能反向工作(按 Shift+Tab)。
<div>Focusable stuff outside the dialog.</div>
<div class="dialog" tabindex="0">
<!-- Focus should be trapped inside this dialog while it's open -->
<div class="content">
Form contents and focusable stuff here.
</div>
<div class="last-focus" tabindex="0" onfocus="this.parentNode.focus()"></div>
</div>
<div>More focusable stuff outside the dialog.</div>
我宁愿看到纯 JavaScript 解决方案。如果有一种方法可以使用 jQuery 之类的库来执行此操作,我希望有一个指向执行此操作的库代码的链接。