lam*_*ade 8 html javascript validation wai-aria wcag2.0
据我了解,不建议向元素添加重复的角色:
<nav role="navigation"></nav>
Run Code Online (Sandbox Code Playgroud)
这是多余的,因为nav告诉屏幕阅读器内容的语义已经是什么。到现在为止还挺好。
现在我想使表单字段无效。我明白经典的我应该改变这个:
<input type="text" name="username">
Run Code Online (Sandbox Code Playgroud)
… 进入
<input type="text" name="username" aria-invalid="true">
Run Code Online (Sandbox Code Playgroud)
...提交表单后。
但是,我们使用 JavaScript 和HTML5 约束验证 API来检查输入,然后再将其发送到 API。是的,输入再次在服务器端进行测试。
所以,假设我使该字段无效:
input.setCustomValidity('This value is invalid');
Run Code Online (Sandbox Code Playgroud)
我还需要添加吗 aria-invalid="true"到输入中吗?
我会说不,因为它对于引擎已经知道的来说是多余的。但我找不到任何明确描述这种情况的来源。
aria-invalid提示屏幕阅读器该字段出错。当屏幕阅读器用户浏览这些<input>字段时,如果该字段无效,他们将收到通知。
Using 也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>
Run Code Online (Sandbox Code Playgroud)
更新:
在进一步澄清之后,我看到了 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. 不想成为多余的人固然好,但至少成为多余的人并没有什么坏处。这只是额外的代码或您必须输入的内容。