我正在尝试使一个咏叹调活跃的区域与JAWS 11和IE8一起正常工作。

使用下面的代码,当单击按钮时,我可以让JAWS宣布新值,但是行为不是我所期望的。

JSFiddle of this example

<!DOCTYPE html>
<html>
<head></head>
<body>
    <button onclick="document.getElementById('statusbar').innerHTML = parseInt(document.getElementById('statusbar').innerHTML) + 1">Update</button>
    <div id="statusbar" aria-live="polite">0</div>
</body>
</html>


使用我的JAWS11 / IE8配置,每单击一次按钮,我都会听到:

点击数HTML值(点击后)JAWS说
------------ ------------------------- ---------
1 1“更新按钮0”
2 2“ 1”
3 3“ 2”


问题是,我的问题是:我如何让JAWS宣布咏叹调活跃区域的当前值,而不是先前的咏叹调活跃区域的值?

我也会对其他屏幕阅读器将如何处理此功能感兴趣。

最佳答案

您的代码是正确的。显然,“落后1”是discovered。从该链接看,似乎使用aria-atomic="true"可以解决此问题。但是,给出的示例确实可以在IE9和Firefox中正常工作。

如果尚未偶然发现它们,请查看codetalksaccessibleculture.org上的测试用例。有很多细微的差异需要注意。如果测试失败,请不要感到惊讶!在过去的一年左右的时间里,我遇到了一些(不足的)技巧,它们可能会对您有所帮助。

方法1:role="alert"

alert角色与aria-live="assertive"等效,但旧版本的JAWS无法正确处理它。请查看2011年2月的supposed to be,其中指出:


如果您希望完全在IE7或IE8中支持JAWS 10,则最好同时添加具有role =“ alert”和aria-live =“ assertive”的警报。尽管这有点多余,因为根据定义,警报角色将被视为断言的活动区域,但这样做确实允许JAWS 10在这两个浏览器中自动宣布更新的警报内容。


Firefox4 +和IE9均不需要。但这将是这样的:

<div id="statusbar" role="alert" aria-live="assertive">
  Contents will be spoken when changed
</div>


方法2:重点强迫骇客

通过动态创建DOM元素并强制关注它,您可以“欺骗”大多数屏幕阅读器以读取其内容。它有点黑,但很有效……这在these examples示例中很重要。简化后,您可以执行以下操作:

<div id="statusbar" role="alert"></div>

$('#statusbar')
  .clear()
  .append('<div tabindex="-1">' + newString + '</div>')
  .children().first().focus()
;


实际上,仅仅隐藏/显示内容实际上在大多数情况下都可以很好地工作。但是,Create and Focus的焦点停留在该元素上,并且在再次显示时不讲其内容。因此,从DOM中删除它似乎是目前最简单的方法。我不喜欢它,但事实就是这样。

09-27 17:52