替换整个表格内容时的咏叹调相关

时间:2014-01-11 07:36:25

标签: html5 accessibility wai-aria screen-readers jaws-screen-reader

我正在使用JAWS测试一些可访问性实现,并注意到对于我的一个表,每次添加一行时都会读取整个表,尽管使用了aria-relevant=additions

相关标记如下:

<table role=log aria-live=polite aria-relevant=additions>
    <thead>
        <tr>
            <th scope=col>Name</th>
            <th scope=col>Time</th>
            <th scope=col>Comment</th>
        </tr>
    </thead>
    <tbody id=eventComments></tbody>
</table>

现在更新表的代码是通过一个AJAX请求完成的,该请求会提取所有注释并将其放入tbody

window.setInterval(function() {
    $.ajax({
        type: 'GET',
        url: 'event.php',
        data: {
            eventID: ...
            page: 'getComments'
        },
        dataType: 'html',
        success: function(data) {
            $('#eventComments').html(data);
        }
    });
}, 10000);

所以第一条评论会返回,例如:

<tr><th scope=row>Richard</th><td>2014-01-11 01:01:00</td><td>Security check in</td></tr>

如果有两条评论,数据将如下所示:

<tr><th scope=row>Justin</th><td>2014-01-11 01:18:31</td><td>Equipment failure</td></tr>
<tr><th scope=row>Richard</th><td>2014-01-11 01:01:00</td><td>Security check in</td></tr>

每次发生更新时,都会读出整个表,而我只想读取新添加的行。实际上,即使没有添加新行,整个表也会每10秒读出一次!我知道使用.prepend()预先添加行是可能的,但从服务器中检索新行是不可行的。

有没有办法仍然从服务器检索所有行并告诉屏幕阅读器只读新行?

1 个答案:

答案 0 :(得分:2)

最好的解决方案是从服务器中仅检索新行,因为响应会更小并且可能更快。但是,如果这是不可能的,您可以从DOM获取旧行,并使用replace方法从服务器检索的数据中减去它们。然后你可以使用prepend将新行添加到DOM中,这会导致JAWS只宣告新行。

window.setInterval(function() {
    $.ajax({
        type: 'GET',
        url: 'event.php',
        data: {
            eventID: ...
            page: 'getComments'
        },
        dataType: 'html',
        success: function(data) {
            // strip the old rows from the data retrieved from the server
            var oldRows = $('#eventComments').html();
            var reg = new RegExp(oldRows,"g");
            var newRows = data.replace(reg,"");
            $('#eventComments').prepend(newRows);
        }
    });
}, 10000);