NVDA スクリーン リーダーの使用中にキーボードをアクセス可能にしようとしている単純なコードのチャンクがあります。
具体的には、「ボタン」の役割を持つ div があり、その中にネストされた「ボタン」の別の役割を持つ別の div があります。各 div には異なる onkeydown イベントがあり、ユーザーがその div にタブ移動して「Enter」を押したときに発生します。
このキーボード機能はすべて、NVDA スクリーン リーダーをオンにしていない場合でも、希望どおりに機能します。
ただし、スクリーン リーダーをオンにすると、ネストされたキーダウン イベントが発生しなくなります。代わりに、ネストされたイベントがフォーカスされている場合でも、親イベントのみが発生します。
ただし、NVDA を手動で「ブラウズ モード」から「フォーカス モード」に変更すると (NVDA キー + スペースバーを押すことで)、キー イベントは再び希望どおりに機能します。
残念ながら、NVDA を使用している人が手動で「フォーカス モード」に切り替えることを知っていると期待するのは、私には受け入れられません。自動的に「フォーカス モード」に変更するか、「ブラウズ モード」で動作する必要があります。
コードは次のとおりです。
HTML:
<div role="button"
tabindex="1"
onkeydown="keyEvent(event, outerDivAction)"
class="outerDiv">
Outer Div
<div role="button"
tabindex="1"
onkeydown="keyEvent(event, innerDivAction)"
class="innderDiv">
Inner Div</div>
</div>
<div class="result"></div>
JavaScript:
function outerDivAction(event) {
event.stopPropagation();
console.log('outer div');
$('.result').html('<p>outer div!</p>');
}
function innerDivAction(event) {
event.stopPropagation();
console.log('inner div')
$('.result').html('<p>inner div!</p>');
}
function keyEvent(event, callback) {
event.stopPropagation();
if (event.which === 13) {
callback(event);
}
}
$('.outerDiv').click(outerDivAction);
$('.innderDiv').click(innerDivAction);
ここで codepen を表示することもできます: http://codepen.io/jennEDVT/pen/Yprova
誰でも提供できるヘルプをいただければ幸いです。
ps ネストされた div を移動してネストされないようにすると、最初の div の兄弟になることがわかります。すべてが希望どおりに機能します。残念ながら、それはオプションではありません。div はネストする必要があります。