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

Must I use aria-invalid when I invalidate a field using the HTML5 constraint validation API?

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

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

这是多余的,因为 nav 告诉屏幕 reader 内容的语义已经是什么。到目前为止一切顺利。


现在我想让一个表单域无效。我明白经典的我应该改造这个:

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

…进入

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

…表单提交后。


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


所以,假设我使该字段无效:

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

我还需要在输入中添加aria-invalid="true"吗?

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

aria-invalid 是对屏幕 reader 字段错误的提示。当屏幕 reader 用户通过 <input> 字段切换时,如果字段无效,他们将收到通知。

使用 aria-invalid 也应该与将错误消息与字段相关联(通过 aria-describedby)结合使用。如果您在字段下方显示错误但未将该错误与该字段相关联,屏幕 reader 用户将不会知道。如果单独使用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,设置了伪classes(比如:invalid),但是screen readers,一般 (*),不知道也不关心CSS,对伪class一无所知。

((*) 唯一的例外是 :before/:after,可用于可访问名称计算,如步骤 [= https://www.w3.org/TR/accname-1.1/#step2 的 20=])。

但是,除了设置了伪class:invalid,还设置了obj.validity.valid。那么如果设置了那个属性,你还需要使用aria-invalid吗?或者换个方式问,screen readers 知道 validity.valid 属性吗?

我找不到任何与屏幕 readers 有关的文档参考,但从测试中,firefox 和 chrome 表面 validity.valid 到屏幕 reader( JAWS 和 NVDA),所以他们宣布该字段无效。但是 Internet Explorer(我在 Win7 上,所以没有 Edge)和 iOS 上的 Safari(我没有要测试的 Mac)做 not 出现错误的字段。

因此,为了涵盖所有基础,我建议设置 aria-invalid。不想冗余是好事,但至少冗余不会有什么坏处。这只是您必须做的额外代码或输入。