我正在使用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()
预先添加行是可能的,但从服务器中检索新行是不可行的。
有没有办法仍然从服务器检索所有行并告诉屏幕阅读器只读新行?
答案 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);