需求:每次页面更改时,屏幕阅读器必须朗读整个页面内容。
我们使用firefox+NVDA进行测试,由于angular不会“更改页面”,因此我们尝试了以下几种方法,以使其在更改状态时朗读整个页面:
aria-live="assertive"
这主要是针对我们网站中文本的更改,但它只读取正在添加的内容,在我们的情况下,我们有一个使用ng-repeat
填充的表格,它读取正在添加的信息,但没有任何上下文(它不说正在读取哪一行或列)。
另一个问题是表单,在被Angular填充之前,屏幕阅读器将其读取,这可以通过使用$timeout
解决。但是,当aria-live
读取更改时,它会跳过某些部分,如果我们添加了aria-atomic
来强制读取,则会读取一些包含多个选项的选择框(所有选项都被读取,我们有超过一百个选项),这不是屏幕阅读器的正常读取方式,它们仅读取前十个选项或单击后可见的选项。
请记住,如果没有aria-live
或aria-atomic
,当您在Angular中更改状态时,用户将不会收到任何更改通知。
几乎放弃之后,我们决定可能我们的重点错了,我们需要使每个状态成为自己的页面,因此我们使用了以下方法:
function ForceNVDARead() {
$(window).on('hashchange', function () {
location.reload();
});
}
每次更改URL都会强制重新加载,这很有效,一切都被正确读取,我们几乎认为这解决了所有问题。但是这会导致客户端向我们的服务器发送重复请求。
有没有办法使NVDA像常规页面加载一样读取angular状态的内容,而不必强制重新加载页面?
请不要说只使用aria-roles或类似于此的东西,因为这对此无效,而且我们已经有了它们,我们需要应用程序在更改状态时阅读所有内容。
非常感谢任何帮助,我们即将放弃,并重新启动没有angular的项目,因为我们无法满足我们的无障碍要求。
aria-live="assertive"
的位置在哪里?是在整个body本身上?还是在表格上? - haxxxtonaria-live="polite" aria-atomic="true" aria-relevant="additions removals"
,或者使用Angular的$stateChangeStart
和$stateChangeSuccess
事件在各自元素上“切换”aria值的存在(不幸的是,我目前无法测试这些建议)? - haxxxton