我正在开发的网站需要遵守WCAG 2.0 guidelines,这意味着一个人应该能够使用屏幕阅读器访问网站上的所有信息。由于这是一个大量使用Kendo Charts的BI仪表板,因此无法通过测试。
我需要一种方法让屏幕阅读器能够在我的网站上阅读Kendo Charts,同时重用图表的数据源。
答案 0 :(得分:0)
我通过自动为页面上的每个图表生成一个表来解决这个问题。
创建生成HTML表格的部分视图
@{
var divId = Guid.NewGuid().ToString();
var tableId = Guid.NewGuid().ToString();
var templateId = Guid.NewGuid().ToString();
}
/* Chart ID */
@model string
<div id="@divId" class="hiddenTable"></div>
<script>
(function () {
var template = kendo.template($("#@templateId").html());
var chartData = $("#@Model").data("kendoChart").dataSource;
$("#@divId").prepend(template(chartData.data()));
})();
</script>
<script id="@templateId" type="text/x-kendo-tmpl">
# var columnNames = Chart.getColumnNamesFromData(data) #
<table id="@tableId">
<thead>
<tr>
# for(var columnIndex = 0; columnIndex < columnNames.length; columnIndex++) { #
<th scope="col">#= S(columnNames[columnIndex]).humanize().s #</th>
# } #
</tr>
</thead>
<tbody>
# for(var i = 0, len = data.length; i < len; i++) { #
# if (data[i][columnNames[0]] != undefined) { #
<tr>
# for(var columnIndex = 0; columnIndex < columnNames.length; columnIndex++) { #
# if(columnNames[columnIndex] == 'Date') { #
<th scope="row">#= kendo.toString(data[i][columnNames[columnIndex]], "MMMM yyyy") #</th>
#} else { #
<td>#= kendo.toString(data[i][columnNames[columnIndex]] != undefined ? data[i][columnNames[columnIndex]] : 0, "n1") #</td>
# } #
# } #
</tr>
# } #
# } #
</tbody>
</table>
</script>
添加CSS以隐藏来自视图的表格
.hiddenTable {
position: absolute;
left: -10000px;
top: auto;
width: 1px;
height: 1px;
overflow: hidden;
}
将img角色添加到图表
@(Html.Kendo().Chart<MyModel>()
.Name(Guid.NewGuid().ToString())
.HtmlAttributes(new { role = "img" })
.DataSource(ds => ds
.Read("GetData", "Home")
)
)
<强>结果强>