2016-11-29 6 views
1

У меня есть простой кусок кода, который я пытаюсь сделать клавиатурой доступной при использовании устройства чтения 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 должен быть вложенным.

ответ

1

Это не ошибка в NVDA.

Прежде всего, вы не можете иметь вложенные элементы с кликом. В частности, you cannot have nested interactive content. Вы не можете вставлять ссылки, и вы не можете вставлять кнопки. Вы не можете вставлять ссылки в кнопки, и вы не можете вставлять кнопки в ссылки. Есть и другие виды interactive content, которые можно найти в будущем.

Вы можете обнаружить, что ваш код технически действителен, но это только потому, что то, что вы написали, является фиброй.

Вместо того, чтобы использовать правильный элемент (<button>), вы решили поставить role=button на <div> s. HTML-валидатор передаст ваш код, потому что он действителен для гнезда <div>.

Однако, указав каждому из них role=button, вы указали, что пользовательский агент обрабатывает их как <button> (минус все преимущества, которые приходят с ними, такие как доступность, обработчики ключей, семантика и т. Д.).

Теперь вернемся назад и подтвердим этот код еще раз, когда пользовательский агент увидит его (как вложенный <button> s).Проверки W3C Nu HTML потерпит неудачу (я знаю, потому что я провел тест):

Error: Start tag button seen but an element of the same type was already open.

Мое предложение:

  • не гнездо им,
  • конвертировать их в <button> с,
  • удалить недействительный tabindex=1 (который вам не нужен),
  • удалите чек на код ключа, так как <button> дает вам это бесплатно (включая символ 32) ,
  • сделать свой <div class="result"> в ARIA live region (есть some tips here)
  • и поставить обертки вокруг кнопки, чтобы дать вам визуальный эффект, который вы хотите.

Образец rejiggered код:

<div class="wrapper"> 
    <button class="outerDiv"> 
    Outer Div 
    </button> 
    <button class="innderDiv"> 
    Inner Div 
    </button> 
</div> 

<div class="result" role="alert" aria-live="assertive"></div> 
+0

Спасибо, что нашли время, чтобы предоставить такое подробное объяснение. К сожалению, это будет сложно реализовать, так как фактическая спецификация, которую я разрабатываю, представляет собой навигацию с некоторыми элементами, у которых есть выпадающие меню, связанные с ними, а затем выпадающие элементы имеют дополнительное подменю, отображаемое как всплывающее меню. И каждый из этих элементов иногда может быть кнопками (которые открывают подменю) или ссылками, и поэтому в настоящее время я использую JavaScript для динамического изменения их из role = "button" в role = "link". Причина, по которой элементы вложены, заключается в том, что подменю являются дочерними элементами родительских элементов. – jennEDVT

+0

Чтобы избежать кнопок вложенности, вы могли бы перестроить свой код, чтобы использовать список с вложенными подсписками (содержащими кнопки)? Требуется немного больше усилий для контроля видимости на основе фокуса элементов списка (или переключения кнопок), но он избегает вложенного интерактивного контента, упомянутого @aardrian. Вот код, чтобы проиллюстрировать, что я имею в виду: http://codepen.io/anon/pen/KNyZYm – Skerrvy

+0

@jennEDVT, у вас может быть мало выбора, кроме как рефакторинг, так как вы всегда столкнетесь с проблемами с помощью вспомогательных технологий. У Skerrvy есть хорошая быстрая демонстрация того, что вы можете попробовать. Кроме того, найдите существующие шаблоны, которые вы можете изменить. Например, у Adobe есть сложное мега-меню, которое, хотя слишком много для большинства сайтов, может быть подходящим? http://adobe-accessibility.github.io/Accessible-Mega-Menu/ – aardrian

0

Если это может вас заинтересовать, то WAI-ARIA Authoring Practices (APG) имеет указания о том, как сделать различные шаблоны дизайна доступны. Он также включает описание того, что вы описываете: Menu or menubar, который содержит примеры кода для меню с подменю.

+0

Пожалуйста, отредактируйте код, который поможет OP в вашем ответе. Ответы только на связь (что означает любой ответ, когда само решение представляется как ссылка и не объясняется в самой записи, даже если присутствует другой текст без ссылки), как правило, неодобрились, поскольку они могут быть признаны недействительными, если ссылка идет вниз и использовались в прошлом для саморекламы. –

+0

Спасибо за ресурсы! – jennEDVT