Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使屏幕阅读器在角度改变状态时读取整个页面?_Javascript_Angularjs_Firefox_Accessibility_Nvda - Fatal编程技术网

Javascript 如何使屏幕阅读器在角度改变状态时读取整个页面?

Javascript 如何使屏幕阅读器在角度改变状态时读取整个页面?,javascript,angularjs,firefox,accessibility,nvda,Javascript,Angularjs,Firefox,Accessibility,Nvda,要求:在每次页面更改时,屏幕阅读器必须阅读整个页面内容 我们使用firefox+NVDA进行测试,由于angular不“更改页面”,我们尝试了以下方法,使其在更改状态时读取整个页面: aria-live="assertive" 这在很大程度上读取了我们网站中文本的变化,但它只读取添加的内容,在我们的例子中,我们有一个表,其中填充了ng repeat,它读取添加的信息,但没有任何上下文(它没有说读取的是哪一行或哪一列) 另一个问题是表单,当使用angular填充时,屏幕阅读器将在使用angula

要求:在每次页面更改时,屏幕阅读器必须阅读整个页面内容

我们使用firefox+NVDA进行测试,由于angular不“更改页面”,我们尝试了以下方法,使其在更改状态时读取整个页面:

aria-live="assertive"
这在很大程度上读取了我们网站中文本的变化,但它只读取添加的内容,在我们的例子中,我们有一个表,其中填充了
ng repeat
,它读取添加的信息,但没有任何上下文(它没有说读取的是哪一行或哪一列)

另一个问题是表单,当使用angular填充时,屏幕阅读器将在使用angular填充之前读取表单,这通过
$timeout
解决,但当
aria live
读取更改时,它将跳过一些部分,如果我们添加
aria atomic
强制读取,我们有一些带有多个选项的选项,这些选项都被读取了(所有这些选项,我们有100多个选项)。这不是屏幕阅读器的阅读方式,他们只阅读前十个选项,或者当你点击它们时可以看到的选项

请记住,如果没有任何aria-live或aria-atomic,则当您在中更改状态时,不会通知用户任何更改

在几乎放弃之后,我们决定也许我们的重点是错误的,我们需要让每个州都有自己的页面,因此我们使用了以下方法:

function ForceNVDARead() {
    $(window).on('hashchange', function () {
        location.reload();
    });
}
这对于URL中的每次更改都将强制重新加载。这很好,所有的东西都被正确地阅读了,我们几乎认为这解决了所有的问题。除此之外,这会导致客户端向服务器发出双重请求

有没有办法让NVDA像常规页面加载一样读取角度状态的内容,而不必强制重新加载页面

请不要说只使用aria角色或类似的东西,因为我们已经有了它们,我们需要应用程序在更改状态时读取所有内容

感谢任何帮助,我们即将放弃,重新启动项目,因为我们无法实现我们的可访问性要求

要求:在每次页面更改时,屏幕阅读器必须阅读整个页面内容

从可访问性的角度来看,这根本不是一个要求,它相当于让一个人看着屏幕一次读一行,或者使用,这不是自然使用

屏幕阅读器的可访问性,但我们需要重置一些假设:

  • 当您进行页面更新时,关键是切换到并移动到新内容。这使人们能够以自己的方式阅读,而不是你一直认为他们必须阅读的方式
  • ARIA live旨在对页面其他地方(远离键盘焦点)进行小更新,而不是全部内容,这里不是答案,我将完全放弃它
  • 如果人们在加载表单之前阅读表单,那么这可能是使用ARIA-live强制阅读的副作用。如果没有,则尝试使用焦点管理在加载表单时将焦点放置在表单顶部
  • 它可能值得一读,或者与“本地”用户交谈。我可以从经验中说,您没有像最终用户那样使用它,所以要更好地理解“正常”交互是什么样子的

如果您放弃使用ARIA live,转而使用focus management,您可能会解决大部分问题,但从另一个角度来看,以后可能会有更多问题。

您在页面的何处添加了
ARIA live=“assertive”
?是在整个身体上吗?在桌子上?你能在整个身体上尝试一种活的、原子的和相关的组合吗?例如,
aria-live=“polite”aria-atomic=“true”aria-relevant=“additions-removals”
。另一种方法是使用angulars
$stateChangeStart
$statechangesuccessuccess
事件“切换”各个元素上的aria值。(不幸的是,我目前没有办法测试这些建议)我们已经尝试了很多,实际上没有任何效果。问题主要出在表单上,当你想编辑一些东西时,因为它填充了字段,所以有些字段不会更改,所以我们不能手动将aria live放在每个字段上,因为不是所有字段都在更改/读取。根据这个问题的视图数,像我这样的很多人可能都有相同的要求,我觉得这很有趣。