很遗憾,如果没有启用 JavaScript,您无法这样做。 您可以监听最后一个元素上的 TAB (并确保不是 SHIFT+TAB)键按下事件,并在处理程序中手动将焦点设置为第一个元素。但是,将此逻辑绑定到键盘事件(即特定输入方法)并不通用,可能在使用以下情况时无法正常工作:
- 移动浏览器
- 某些其他娱乐设备(智能电视,游戏机等-它们通常使用D-Pad在可聚焦元素之间跳转)
- 辅助功能服务
我建议采用更通用的方法,该方法不受焦点更改方式的影响。
想法是,您可以将要创建“tabindex循环”的表单元素包围在特殊的“焦点守卫”元素周围,这些元素也可以获得焦点(它们已分配tabindex)。 这是修改后的HTML:
<p>Some sample <a href="#" tabindex="0">content</a> here...</p>
<p>Like, another <input type="text" value="input" /> element or a <button>button</button>...</p>
<div class="focusguard" id="focusguard-1" tabindex="1"></div>
<input id="firstInput" type="text" tabindex="2" class="autofocus" />
<input type="text" tabindex="3" />
<input type="text" tabindex="4" />
<input type="text" tabindex="5" />
<input type="text" tabindex="6" />
<input id="lastInput" type="text" tabindex="7" />
<div class="focusguard" id="focusguard-2" tabindex="8"></div>
现在,你只需在这些守卫元素上监听 focus
事件,并手动将焦点更改为适当的字段(出于简单起见,使用 jQuery):
$('#focusguard-2').on('focus', function() {
$('#firstInput').focus();
});
$('#focusguard-1').on('focus', function() {
$('#lastInput').focus();
});
正如您所看到的,我还确保当焦点从第一个输入框向后移动(例如在第一个输入框上按下
SHIFT+
TAB)时,我们会回到最后一个输入框。
实例展示
请注意,“焦点守卫”也被分配了一个tabindex值,以确保在您的输入字段之前/之后立即关注它们。如果您没有手动设置输入的tabindex,则两个“焦点守卫”可以分别分配
tabindex ="0"
当您的表单是动态生成的时,当然您也可以让所有这些都在动态环境中工作。只需找出您的
可聚焦元素 (不太琐碎的任务),并将它们与相同的“焦点守卫”括起来。
希望这有所帮助,如果您有任何问题,请告诉我。
更新
正如nbro指出的那样,上述实现有一个不希望出现的效果,即在页面加载后按
TAB键后选择最后一个元素(因为这会将焦点放在第一个可聚焦元素上,即
#focusguard-1
,这将触发聚焦到最后一个输入框)。为了缓解这个问题,您可以指定初始要聚焦的元素,并使用另一小段JavaScript将其聚焦。
$(function() {
$('.autofocus').focus();
})
只需在您想要的任何元素上设置autofocus
类,它会在页面加载时自动聚焦(或任何其他事件上监听)。
tabindex="-1"
,以使其不属于制表符顺序。MSDN: tabindex(在MDN上找不到该页面)。 - Teemudocument.body.tabIndex = '0'; document.body.focus(); document.body.tabindex = '-1'
。如果在HTML中正确排序,您也可以使用相同的tabindex。 - neaumusic