当我使用 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
。不想冗余是好事,但至少冗余不会有什么坏处。这只是您必须做的额外代码或输入。
据我了解,不建议向元素添加重复角色:
<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
。不想冗余是好事,但至少冗余不会有什么坏处。这只是您必须做的额外代码或输入。