safari OSX配音不读取输入的咏叹调标签

时间:2016-02-05 02:23:58

标签: safari wai-aria voiceover

我试图让配音工作在safari上,但是,当我通过元素标签时,它似乎没有读出某个场景中新输入框的aria标签。

情景:

当标签到下一个元素并且当前元素的on blur对dom做了某些事情时,它将不会读出下一个元素的aria-label。

这是一个例子 http://plnkr.co/edit/x0c67oIl0wlQEguBIQVZ?p=preview

请注意,如果您取出下面的onblur函数,那么它可以正常工作。

<input id="test" onblur="blurer()" onfocus="focuser()"/>

1 个答案:

答案 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)在很多情况下运行良好。