У меня есть простой кусок кода, который я пытаюсь сделать клавиатурой доступной при использовании устройства чтения NVDA.Считыватель экрана NVDA не работает в режиме фокусировки
В частности, у меня есть div с ролью «кнопка», с другим div с другой ролью «кнопки», вложенной в нее. Каждый div имеет другое событие onkeydown, которое запускается, когда пользователь переходит к этому div и нажимает «enter».
Эта функциональность клавиатуры работает по желанию, если у меня нет включенного устройства чтения NVDA.
Однако, когда включен экранный ридер, вложенное событие keydown больше не срабатывает. Вместо этого только родительское событие срабатывает, даже если вложенное событие является объектом, в котором есть фокус.
Однако, если я вручную изменю 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
Любая помощь, что кто-то может предложить бы будем очень благодарны!
p.s. Я знаю, что если я возьму вложенный div и переместил его так, чтобы он больше не вложен, а скорее является родным братом первого div, тогда все работает по своему желанию. К сожалению, это не вариант. Div должен быть вложенным.
Спасибо, что нашли время, чтобы предоставить такое подробное объяснение. К сожалению, это будет сложно реализовать, так как фактическая спецификация, которую я разрабатываю, представляет собой навигацию с некоторыми элементами, у которых есть выпадающие меню, связанные с ними, а затем выпадающие элементы имеют дополнительное подменю, отображаемое как всплывающее меню. И каждый из этих элементов иногда может быть кнопками (которые открывают подменю) или ссылками, и поэтому в настоящее время я использую JavaScript для динамического изменения их из role = "button" в role = "link". Причина, по которой элементы вложены, заключается в том, что подменю являются дочерними элементами родительских элементов. – jennEDVT
Чтобы избежать кнопок вложенности, вы могли бы перестроить свой код, чтобы использовать список с вложенными подсписками (содержащими кнопки)? Требуется немного больше усилий для контроля видимости на основе фокуса элементов списка (или переключения кнопок), но он избегает вложенного интерактивного контента, упомянутого @aardrian. Вот код, чтобы проиллюстрировать, что я имею в виду: http://codepen.io/anon/pen/KNyZYm – Skerrvy
@jennEDVT, у вас может быть мало выбора, кроме как рефакторинг, так как вы всегда столкнетесь с проблемами с помощью вспомогательных технологий. У Skerrvy есть хорошая быстрая демонстрация того, что вы можете попробовать. Кроме того, найдите существующие шаблоны, которые вы можете изменить. Например, у Adobe есть сложное мега-меню, которое, хотя слишком много для большинства сайтов, может быть подходящим? http://adobe-accessibility.github.io/Accessible-Mega-Menu/ – aardrian