使用 HTML5 约束验证 API 使字段失效时,我必须使用 aria 无效吗?



据我了解,不建议向元素添加重复的角色:

<nav role="navigation"></nav>

这是多余的,因为nav告诉屏幕阅读器内容的语义已经是什么。目前为止,一切都好。


现在我想使表单字段无效。我明白经典的我应该转换这个:

<input type="text" name="username">

。到

<input type="text" name="username" aria-invalid="true">

。提交表格后。


但是,我们使用 JavaScript 和 HTML5 约束验证 API 在将输入发送到 API 之前检查输入。是的,输入再次在服务器端进行测试。


因此,假设我使该字段无效:

input.setCustomValidity('This value is invalid');

我是否仍需要向输入添加aria-invalid="true"

我会说不,因为它对于引擎已经知道的东西来说是多余的。但我找不到任何明确描述这种情况的来源。

aria-invalid是向屏幕阅读器提示该字段有误。 当屏幕阅读器用户按 Tab 键浏览<input>字段时,如果该字段无效,他们将收到通知。

使用aria-invalid也应与将错误消息与字段关联(通过aria-describedby(结合使用。 如果在字段下方显示错误而不将该错误与字段相关联,则屏幕阅读器用户不会知道该错误。 如果单独使用aria-invalid,则用户将不知道字段出错的原因

所以你应该有这样的东西:

<input type="text" name="username" aria-invalid="true" aria-describedby="errmsg">
<span id="errmsg">The name you entered cannot be found in our system</span>

更新:经过进一步澄清,我看到了OP现在要求的内容,以及不使用重复信息的参考,例如<nav role="navigation>

使用验证 api,设置伪类(例如:invalid(,但屏幕阅读器通常(*(不了解或关心 CSS,并且对伪类一无所知。

((*(唯一的例外是:before/:after,它可以用于可访问名称计算,如 https://www.w3.org/TR/accname-1.1/#step2 的步骤2.F.ii中所述(。

但是,除了设置伪类:invalid之外,还设置了obj.validity.valid。 因此,如果设置了该属性,是否还需要使用aria-invalid? 或者换一种问法,屏幕阅读器知道validity.valid属性吗?

我找不到任何与屏幕阅读器相关的文档参考,但从测试中,Firefox 和 chrome 表面都validity.valid到屏幕阅读器(JAWS 和 NVDA(,因此他们宣布该字段无效。 但是Internet Explorer(我在Win7上,所以没有Edge(和iOS上的Safari(我没有Mac可以测试(不会错误地显示该字段。

因此,为了覆盖您的所有基础,我建议您设置aria-invalid。 你不想多余是件好事,但至少多余不会伤害任何东西。 这只是您必须执行的额外代码或键入。

最新更新