Ролевое приложение для специальных возможностей

Ниже представлена ​​фиктивная реализация нашего веб-приложения https://roleapplication.herokuapp.com/index.html

Элемент appArea имеет ролевое приложение, поскольку он содержит очень сложные виджеты, такие как ms paint / editor / ms office. Навигатор содержит стандартные веб-виджеты, такие как раскрывающийся список и кнопки.

HTML-код похож на указанный ниже.

<body> <div class="appArea" role="application"> .......//Complex widgets </div> <div class="toolbar"> ......//Buttons, dropdowns </div> </body>

Функциональность клавиатуры appArea обрабатывается ее кодом, а для панели инструментов мы полагаемся на обработку клавиатуры с помощью программы чтения с экрана, поскольку они работают в веб-браузере.

Проблема. Когда пользователь нажимает escape в области навигатора, мы размываем навигатор, поэтому по умолчанию фокус переходит на тело. Теперь, когда фокус находится в теле, клавиши со стрелками перемещают фокус на панель инструментов, и поэтому пользователь никогда не сможет войти в appArea. Если фокус находится в appArea, все работает нормально.

Ожидание - когда фокус находится на теле, то при нажатии стрелки вниз фокус должен находиться внутри appArea, а затем appArea получит ключ вместо программы чтения с экрана.

Проверьте работу клавиши со стрелкой вниз при загрузке страницы с программой чтения с экрана и без нее.

Заметки на клавиатуре

  • Нажмите f6, чтобы перейти от виджета 1 к виджету 2 и навигатору.
  • Для навигации в виджетах можно использовать клавиши со стрелками / табуляцией.
  • Перейдите к навигатору с помощью f6 и нажмите вкладку, чтобы перейти к любой кнопке, а затем нажмите escape. Теперь основное внимание уделяется телу (проверьте с помощью document.activeElement).
  • Без программы чтения с экрана наши виджеты захватывают ключ на теле и обрабатывают его, даже если у них нет фокуса.
  • Однако с помощью средства чтения с экрана, когда тело имеет фокус и пользователь нажимает стрелку вниз, средство чтения с экрана потребляет ключ и перемещает фокус в навигатор вместо области приложения, в которой есть виджеты, и пользователь не может перейти в appArea с помощью клавиш со стрелками или других клавиш, которые используются для чтения с экрана. потреблять.

Примечание -

  • Если мы передадим ролевое приложение для завершения приложения, то обработка клавиш со стрелками по умолчанию для навигатора перестанет работать, что нежелательно.
  • Удаление ролевого приложения невозможно, так как appArea довольно сложна с сотнями виджетов, каждый из которых управляется клавиатурой.

person Nikhil Mittal    schedule 11.06.2018    source источник


Ответы (2)


Есть три способа взаимодействия с role = "application".

  1. Нажмите Enter в элементе приложения, выйдите из режима редактирования (или режима форм) и используйте приложение, как если бы это была другая веб-страница. Вы можете поместить туда другие элементы, и программа чтения с экрана будет перемещаться по этим элементам в режиме просмотра.

  2. Нажмите «Enter» в приложении, и программа чтения с экрана перейдет в режим редактирования, где все ключи передаются виджету редактирования внутри приложения. и вы обрабатываете все в своем приложении, возможно, в случае нажатия клавиши.

  3. Управляйте tabindex, когда программа чтения с экрана нажимает клавиши, используя подвижный tabindex .

В настоящее время у вас есть 1 и 3, что действительно сбивает с толку. Если вы удалите элемент приложения, он все равно будет работать нормально. Звучит так, как будто вы хотите 2. 2 крайне не рекомендуется, если у вас нет пользователя программы чтения с экрана, постоянно тестирующего UX или создающего ваше приложение. Номер 2 в основном предназначен для игр и считается элементом «холста» для программ чтения с экрана. Вы делаете 2, выполнив следующие действия:

    <div role="application">
    <input type="button" autoFocus="true" value="Click me" />
    <p aria-live="polite" id="spk"></p>
    </div>

Элемент spk предназначен для отправки сообщений программе чтения с экрана, что вам нужно сделать в этом интерфейсе Window, Icon, Menu, Message (WIMM). Помните, что в этом режиме нужно все программировать, и пользователи расстраиваются, если ожидания не оправдываются.

Вы сказали, что делаете текстовый процессор. Этот последний вариант (номер 2) НЕ предназначен для создания текстового процессора. Как пользователь программы чтения с экрана, у меня есть ожидания и рабочие процессы для текстовых процессоров. Вы не можете получить эту функциональность, если запрограммируете ее вручную на Javascript. Вместо этого используйте существующие поля редактирования, которые HTML предоставляет по этой причине, например: Этот пример текстового редактора

Пожалуйста, дайте мне знать, если по какой-либо причине вы не хотите использовать указанный выше виджет.

Вы можете обойтись без использования 3 вместе с обычными виджетами, но лучше делать то, что делает Google Диск, и разрешать пользователям переходить в режим редактирования при загрузке страницы, или нажимать клавишу, например escape, чтобы войти в область приложения tabindex (которая не обязательно должен быть в элементе приложения, хотя может быть).

Изменить: после повторного чтения вашего вопроса кажется, что вы не можете понять, как ввести элемент приложения. Вы указываете стрелку туда, где в программе чтения с экрана написано «приложение», и нажимаете клавишу «Ввод». Чтобы выйти, вы либо переходите к следующему элементу tabindex, находящемуся вне приложения, либо нажимаете специальную ключевую команду для выхода из приложения. В NVDA эта ключевая команда - ctrl + nvda + space. В вашем приложении элемент приложения является первым элементом.

person Brandon Keith Biggs    schedule 21.06.2018
comment
Да, проблема в том, как войти в приложение, но в нашем случае мы не можем заставить пользователя нажать клавишу ВВОД. Итак, есть ли способ указать, что если фокус находится на теле, он должен быть в режиме приложения. - person Nikhil Mittal; 25.06.2018
comment
добавьте элемент ввода, например кнопку, с autoFocus = true, как в примере выше. Это заставит пользователя сосредоточиться на этой кнопке по умолчанию, а затем вы можете поместить preventDefault в событие onKeyDown, которое позволит приложению захватывать большинство, но не все нажатия клавиш, даже alt. Windows и FN - единственные две клавиши, которые вы не получаете в этом preventDefault, поэтому, возможно, вы можете сделать клавишу Windows alt + windows, или вы можете переключить левую клавишу alt на клавишу Windows. Если вы имитируете компьютер с Windows, пользователи программ чтения с экрана часто используют ключевые команды Windows. - person Brandon Keith Biggs; 26.06.2018

role='application' следует использовать в редких случаях. Как вы заметили, это заставляет все события клавиатуры пропускать программу чтения с экрана и переходить непосредственно в ваше приложение. Это приводит к тому, что виртуальный курсор программы чтения с экрана не работает. Обычно программа чтения с экрана автоматически переходит в режим «приложения» (часто называемый «режимом форм») для определенных типов виджетов, таких как поле ввода. Если вы используете роли виджетов, вы получите этот «режим форм» бесплатно.

Когда вы говорите, что «клавиши со стрелками» не работают, вы имеете в виду стрелки вверх / вниз или стрелки влево / вправо? У них разное поведение для программы чтения с экрана.

person slugolicious    schedule 12.06.2018
comment
Ролевое приложение используется потому, что виджет является довольно сложным, чем-то похожим на полное офисное приложение, такое как Word. Вот почему мы использовали ролевое приложение, поскольку никакая другая роль не показалась бы подходящей. - person Nikhil Mittal; 14.06.2018
comment
Теперь, когда фокус находится на теле, клавиши со стрелками захватываются программой чтения с экрана, так как она находится за пределами role = application, а нам нужно, чтобы она обрабатывалась нашим приложением. Мы не можем переместить приложение роли в тело, так как у нас есть другие элементы, которые являются обычными элементами html. - person Nikhil Mittal; 14.06.2018
comment
хорошо, пытаюсь понять исходную проблему. когда вы говорите, что фокус находится на теле, вы имеете в виду, что фокус клавиатуры находится на фактическом теге <body>? у вас нет tabindex на <body>, поэтому он не может получать фокус. или вы имеете ввиду фокус программы чтения с экрана? вы используете клавиши вверх / вниз в средстве чтения с экрана, чтобы переместить фокус на каждый элемент DOM? у вас есть образец сайта, который я могу попробовать? - person slugolicious; 14.06.2018
comment
В теле есть tabindex. Я обновил вопрос. Позвольте мне попробовать создать образец и вернуться. - person Nikhil Mittal; 18.06.2018
comment
Я вижу, вы добавили tabindex="-1" в <body>, но это все еще не позволяет фокусу клавиатуры перемещаться в тело, кроме как из javascript. пользователь не может перейти к телу. это поможет, если вы уточните, используется ли клавиша TAB для перемещения фокуса или используются клавиши навигации DOM программы чтения с экрана (вверх / вниз). - person slugolicious; 18.06.2018
comment
Я обновил вопрос примером и дополнительным описанием. - person Nikhil Mittal; 19.06.2018