我正在使用JSF对我的应用程序进行编码,它有一个数据表。
数据表的每一行在第一列中都有一个复选框,其余列中有一些文本。
我的应用程序需要符合WCAG 2.0,并且我正在使用Chrome扩展程序"Axe"来扫描我的应用程序。
"Axe"工具指出,带有复选框的数据表不符合"确保每个表单元素都有一个标签"的条款,建议的解决方案是添加"aria-label"属性。
但是,JSF 数据表没有 "aria-label" 属性。
需要问是否有任何专家有任何解决方案?
JSF 2.2 支持传递属性。因此,将自定义属性添加到素数标签中很容易。
- 在顶部添加标记引用:
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
- 在素数标签中声明它:
p:inputText value="#{bean.value}" pt:aria-label="Whatever you want"
复选框需要一个标签(无论是否可见(,以便屏幕阅读器正确朗读该复选框。 对于视力正常的用户,在表中有一个列标题就足以作为其下方复选框的标签。 但是,对于屏幕阅读器用户,除非您将列标题与每个复选框相关联,否则不会宣布它。 暂时忽略JSF,如果你正在编写直接的html,你可能会有这样的东西:
<table border="1" style="border-collapse: collapse">
<tr>
<th scope="col" id="check_label">select me</th>
<th scope="col">some other value</th>
</tr>
<tr>
<td>
<input type="checkbox" aria-labelledby="check_label">
</td>
<td>hello</td>
</tr>
<tr>
<td>
<input type="checkbox" aria-labelledby="check_label">
</td>
<td>there</td>
</tr>
</table>
每个复选框都有一个指向列标题("check_label"(的aria-labelledby
属性。 这对于大多数屏幕阅读器来说都非常有效,但在某些情况下,复选框标签不会被读取,例如在NVDA中,如果您使用表格导航键(ctrl + alt + arrow(并向下导航复选框列,则不会读取复选框的名称。 这可能是NVDA的一个错误,我不确定。
上述方法的替代方法是将视觉上隐藏的<label>
专门与每个复选框相关联。 无论您使用Tab键还是 ctrl+alt+箭头导航表,这都有效。
<table border="1" style="border-collapse: collapse">
<tr>
<th scope="col">select me</th>
<th scope="col">some other value</th>
</tr>
<tr>
<td>
<input type="checkbox" id="check1">
<label for="check1" class="sr-only">select me</span>
</td>
<td>hello</td>
</tr>
<tr>
<td>
<input type="checkbox" id="check2">
<label for="check2" class="sr-only">select me</span>
</td>
<td>there</td>
</tr>
</table>
现在,回到JSF,在我读到这个问题之前我对此一无所知,看起来有两种方法可以指定复选框,https://docs.oracle.com/javaee/5/tutorial/doc/bnaqd.html#bnaqh。
- 选择布尔值复选框
- 选择"多个"复选框
selectBooleanCheckbox
,默认情况下,没有与复选框关联的标签,就像selectManyCheckbox
一样。 但是,您也可以指定要与selectBooleanCheckbox
配对的<h:outputLabel>
,所以我认为这就是您的答案。 请参阅选择布尔复选框文档中的示例。
对于较新版本的 JSF,您还可以使用 JSF Passtrough 属性(规范(添加与 aria 相关的属性。
因此,只要您添加了正确的命名空间声明,您就可以这样做
<h:selectBooleanCheckbox pt:aria-labbeledby="check_label" ...>
但它也可以放在数据表上
<h:datatable pt:aria-labbeledby="check_label" ...>