对于这个用例,我将添加aria-live
和aria-atomic
属性,示例代码:
<select id="foo" aria-live="assertive" aria-atomic="true">
<option value="nw">Northwest</option>
<option value="ne">Northeast</option>
<option value="se">Southeast</option>
<option value="sw">Southwest</option>
</select>
我认为这assertive
是该aria-live
属性的正确值,但polite
可能更合适。该aria-atomic
属性用于告诉浏览器/AT,当发生更改时,必须将区域作为一个整体呈现。您也可以考虑aria-disabled: true
最初在选择上使用,然后false
在使用与状态选择关联的值更新它之前将其切换到。
编辑
好的,我已经使用 NVDA 和 IE9 以及 Firefox 13.01 进行了一些测试。我目前没有可用的 JAWS,所以如果有人可以使用 JAWS 测试页面,那就太好了。
据我所知,VoiceOver 尚不支持aria
属性刚刚在 10.7 (Lion) 上使用 Chrome + Voiceover 进行了测试,Voiceover 确实似乎支持aria-live
.
此处提供测试页面。
我使用了一个简单的脚本来模拟将数据加载到区域选择中(使用对象):
var options = [],
regions = {
'nw': 'Northwest',
'ne': 'Northeast',
'se': 'Southeast',
'sw': 'Southwest'
}
$(document).ready(function() {
$.each(regions, function(key, value) {
options.push('<option value="'+ key +'">'+ value +'</option>');
});
$('.block').on('change, focusout', '.states', function() {
$(this).parent().children('.regions')
.attr({'disabled': false, 'aria-disabled': false})
.html(options.join(''));
});
window.setTimeout(
function() {
$('#speak').text('assertive!');
},
3000
);
});
玩了一会儿之后的一些观察(我当然不是屏幕阅读器方面的专家,所以如果我错过了什么,请告诉我)......
不建议使用 HTMLdisabled
属性,因为您真的不希望在状态选择被聚焦之前加载区域数据,并且由于关联的区域选择在聚焦时被禁用,因此在跳到下一个控件时会跳过它(您可以在下面的录音中听到这一点。)奇怪的是,Firefox 会宣布区域选择的值,即使它没有聚焦它。
在没有属性的示例中,我发现polite
and之间的行为没有区别assertive
,或者就此而言。aria-live
我认为 FF13 和 IE9 都支持aria-live
,但从最后但代码 ( $('#speak')...
) 看来 IE9 不支持?
也许通过 AJAX 模拟加载的延迟将是一件好事。
您可以收听录音:IE9、Firefox 13