我试图让配音工作在safari上,但是,当我通过元素标签时,它似乎没有读出某个场景中新输入框的aria标签。
情景:
当标签到下一个元素并且当前元素的on blur对dom做了某些事情时,它将不会读出下一个元素的aria-label。
这是一个例子 http://plnkr.co/edit/x0c67oIl0wlQEguBIQVZ?p=preview
请注意,如果您取出下面的onblur函数,那么它可以正常工作。
<input id="test" onblur="blurer()" onfocus="focuser()"/>
答案 0 :(得分:1)
在这种情况下,问题不在于blurer
,而在于您的blurer
和相应的focuser
功能的内容。这两个函数一起切换附近元素的隐藏状态。这是公告的中断。还有一个角色公告也会发生。完整的公告(当文本填充在编辑文本控件中时)应为:
"The edited text" contents selected/unselected, "your aria label", edit text.
引用的部分是您控制的部分,其他部分是由OS / VoiceOver与其交互控制的部分,由控件的状态和其他咏叹调值自动计算。
我们得到的声明只是
"The edited text"
因此,具体而言,这不是aria-label的问题。但是,您正在导致元素的整个公告被中断。
当您的模糊和聚焦功能触发时,您会混淆VoiceOver的响应(或操作系统的通信)这些事件。不确定你的功能导致了什么。无论如何,在这些情况下有用的技巧是在代码中添加setTimeout。通过分离您的函数和实际的焦点/模糊事件,您可以允许辅助功能API执行他们的操作,然后在页面上查找样式等。这是一个使您的小代码段工作的示例。只需用以下内容替换javascript文件的内容:
function blurer(){
window.setTimeout(function() {
document.getElementById('myDiv').style.display = 'none';//
}, 0);
}
function focuser(){
window.setTimeout(function() {
document.getElementById('myDiv').style.display = 'block';//
}, 0);
}
一般来说,我喜欢避免使用setTimeouts,因为它们会创建竞争条件。但是,setTimeouts为0是可以接受的,因为没有竞争条件。您只需将代码推送到队列末尾即可解除触发事件和代码执行。当围绕VoiceOver进行黑客攻击时,setTimeout(someFunction,0)在很多情况下运行良好。