Javascript 在新创建的元素上设置初始选项卡焦点,而不会弄乱屏幕阅读器
在将新的html插入一个部分时,我希望第一次按tab键跳过前几个链接,然后集中在后面的链接上。目前,我的解决方案是插入一个带有Javascript 在新创建的元素上设置初始选项卡焦点,而不会弄乱屏幕阅读器,javascript,html,accessibility,screen-readers,tabindex,Javascript,Html,Accessibility,Screen Readers,Tabindex,在将新的html插入一个部分时,我希望第一次按tab键跳过前几个链接,然后集中在后面的链接上。目前,我的解决方案是插入一个带有tabindex='-1'的空,然后对其调用focus()。但是,我注意到屏幕读取软件将跳转到此focus()。是否有其他方法设置初始选项卡焦点,或使屏幕读取软件忽略焦点()?(对于NVDA,我插入的div是一个role='status',它应该在更新时读取,focus()占据了NVDA大约40%的时间,没有任何明显的模式。) 失败的方法是tabindex。Firefox
tabindex='-1'
的空
,然后对其调用focus()
。但是,我注意到屏幕读取软件将跳转到此focus()
。是否有其他方法设置初始选项卡焦点,或使屏幕读取软件忽略焦点()
?(对于NVDA,我插入的div
是一个role='status'
,它应该在更新时读取,focus()
占据了NVDA大约40%的时间,没有任何明显的模式。)
失败的方法是tabindex
。Firefox和Chrome都不尊重tabindex
对于插入元素的第一个tab-press。在下面的代码示例中,第二个元素具有最后一个tabindex,但在Firefox中首先关注它。Firefox中的行为在第一次按tab键和后续按tab键之间有所不同。对于第一个选项卡焦点,Chrome完全忽略tabindex,因此第一个选项卡焦点始终是第一个链接。
函数k(){
document.getElementById(“h”).innerHTML=“firstsecondthird”;
}
点击我
尝试1:通过测试,如果拥有现有焦点的DOM元素被破坏,则下一个接收选项卡焦点的对象不稳定,并且在Firefox和Chrome上的行为不同
在Firefox上,焦点“幽灵般地转移”到要显示的第一个文本顺序元素,然后第一个选项卡将从第一个元素前后移动。因此,制表符将到达其制表顺序在第一个元素之后的元素,shift制表符将到达其制表顺序在第一个元素之前的元素
在Chrome上,无论tabindex是什么,第一个选项卡的焦点都会出现在第一个文本顺序元素上
这意味着,如果DOM元素被破坏,tabindex是一个无效的解决方案
尝试2:另一种选择是focus()。插入tabindex='-1'style='outline:none'的ghost元素,然后对其调用focus(),确实会使tab聚焦于我希望它聚焦的元素。然而,这有一个问题,那就是把屏幕阅读器搞砸了。每当调用focus()时,屏幕阅读器(经过NVDA测试)可能会执行以下三项操作之一:
我已经没有耐心了,我不打算实施这个建议的解决方案,在新文本的中间留下神秘的半删除的、半隐藏的元素。在5次失败的尝试之后,我已经没有多少希望了,我也不想让维护人员背上一页又一页的深入评论、奇怪的不直观行为和意外的性能问题,只为屏幕阅读器。我将继续使用旧的focus()解决方案。您是否尝试添加tabindex=-1并使用focus对其进行聚焦,负tabinex值表示元素应该是可聚焦的,但不应该通过顺序键盘导航来访问。请检查这些以了解更多详细信息是的,这是我正在使用的当前解决方案。我在第一段中对此进行了描述。我试图理解您为什么要阻止键盘用户访问前几个链接。根据页面的内容/结构,屏幕阅读器用户可能不会通过Tab键进行导航,因此对他们来说问题不大。我认为部分问题是您正在破坏DOM元素。考虑把所有东西放在DOM中,然后隐藏/显示你需要的CSS。理想情况下,这两套设备应放在单独的容器中