允许屏幕阅读器读取Kendo UI Chart数据

时间:2015-04-29 23:50:54

标签: c# .net kendo-ui screen-readers wcag

我正在开发的网站需要遵守WCAG 2.0 guidelines,这意味着一个人应该能够使用屏幕阅读器访问网站上的所有信息。由于这是一个大量使用Kendo Charts的BI仪表板,因此无法通过测试。

我需要一种方法让屏幕阅读器能够在我的网站上阅读Kendo Charts,同时重用图表的数据源。

1 个答案:

答案 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")
    )
)

<强>结果

Result HTML