Aria Live Region在Angular 2 ngIf验证中不断重复

Aria Live Region在Angular 2 ngIf验证中不断重复,angular,accessibility,wai-aria,wai,Angular,Accessibility,Wai Aria,Wai,我有: {{“FYPVERROR”|翻译} 问题是,当错误在字段验证时动态显示时,错误将被不间断地读取,而不是仅读取一次 如何做到这一点?我试着用aria live=“little”和aria live=“little”分配div role='region',但似乎不起作用。我知道原因,但还没有解决办法 我怀疑Angular在每个验证周期中至少要做以下三件事中的一件: 从DOM中删除元素并再次添加 使元素不可见并再次可见 清除元素的文本并再次填充它 使aria live区域可见、在DOM

我有:


{{“FYPVERROR”|翻译}

问题是,当错误在字段验证时动态显示时,错误将被不间断地读取,而不是仅读取一次


如何做到这一点?我试着用aria live=“little”和aria live=“little”分配div role='region',但似乎不起作用。

我知道原因,但还没有解决办法

我怀疑Angular在每个验证周期中至少要做以下三件事中的一件:

  • 从DOM中删除元素并再次添加
  • 使元素不可见并再次可见
  • 清除元素的文本并再次填充它
使aria live区域可见、在DOM中添加新区域或更新其内容都会触发浏览器/操作系统的可访问性API,从而导致Jaws再次读取内容。如果这些事件都没有发生,那么Jaws会突然发疯并反复阅读内容,没有其他原因

与后一个不同,您可以使用aria relavant属性,但Jaws不太支持它。无论如何,了解ngIf的本质后,Angular可能是第一个,您无法阻止Jaws读取新出现的活动区域(无论它是添加到DOM中还是通过CSS显示可见),因为这违反了活动区域的基本原则

您可以尝试使用隐藏属性或CSS display属性,而不是使用ngIf,但是通过我上面的推理,我怀疑它是否能更好地工作

因此,接下来的问题是:

  • 如何验证我的推理是否正确/Angular真正做了什么
  • 如果我正确地猜到Angular做了什么,我们如何防止它在不应该的情况下如此频繁地更新元素

我还没有足够的经验来回答这两个问题。如果我有任何消息,我会更新这个答案。

我对原因有一个想法,但还没有解决办法

我怀疑Angular在每个验证周期中至少要做以下三件事中的一件:

  • 从DOM中删除元素并再次添加
  • 使元素不可见并再次可见
  • 清除元素的文本并再次填充它
使aria live区域可见、在DOM中添加新区域或更新其内容都会触发浏览器/操作系统的可访问性API,从而导致Jaws再次读取内容。如果这些事件都没有发生,那么Jaws会突然发疯并反复阅读内容,没有其他原因

与后一个不同,您可以使用aria relavant属性,但Jaws不太支持它。无论如何,了解ngIf的本质后,Angular可能是第一个,您无法阻止Jaws读取新出现的活动区域(无论它是添加到DOM中还是通过CSS显示可见),因为这违反了活动区域的基本原则

您可以尝试使用隐藏属性或CSS display属性,而不是使用ngIf,但是通过我上面的推理,我怀疑它是否能更好地工作

因此,接下来的问题是:

  • 如何验证我的推理是否正确/Angular真正做了什么
  • 如果我正确地猜到Angular做了什么,我们如何防止它在不应该的情况下如此频繁地更新元素

我还没有足够的经验来回答这两个问题。如果我有任何消息,我会更新这个答案。

我也有类似的问题。我尝试在不同的元素上实现
aria-live
ngIf
,并为我工作

就你而言。。下面的代码可能会起作用

<div id="signInIdError" class="inline-validation critical" 
*ngIf="Condition"> <p aria-live="polite"> Some Text </p>
</div>

一些文本


我也有类似的问题。我尝试在不同的元素上实现
aria-live
ngIf
,并为我工作

就你而言。。下面的代码可能会起作用

<div id="signInIdError" class="inline-validation critical" 
*ngIf="Condition"> <p aria-live="polite"> Some Text </p>
</div>

一些文本


您的
*ngIf
可以简化为
!signInId.valid&(signInId.touch | | | | isSubmitted)
我想改变了这一点,谢谢哪个浏览器?哪个屏幕阅读器?你的意思是说即使你什么都不做也要重复,还是说只有在你按键或做某事时才重复?你有一个我们可以测试的页面吗?所有浏览器,Jaws,只要有一个内联验证就可以重复测试。不幸的是,我们无法提供页面,只能提供上面的片段。您的
*ngIf
可以简化为
!signInId.valid&(signInId.touch | | | | isSubmitted)
我想改变了这一点,谢谢哪个浏览器?哪个屏幕阅读器?你的意思是说即使你什么都不做也要重复,还是说只有在你按键或做某事时才重复?你有一个我们可以测试的页面吗?所有浏览器,Jaws,只要有一个内联验证就可以重复测试。不幸的是,我们无法提供页面,只能提供上面的片段。我认为你是对的,这很愚蠢--认为这将像添加live region一样简单,我认为你是对的,这很愚蠢--认为这将像添加live region一样简单,