Доступность HTML-формы: фокус клавиши Tab пропускает новое отображаемое поле

У меня есть форма, содержащая поле выбора, которое отображается только тогда, когда значение предыдущего поля выбора установлено на определенное значение. Вот упрощенная версия, в которой появляется скрытое поле выбора «штаты», если в качестве страны выбрано «США»:

HTML:

<style>
  label {
    display:inline-block;    
    min-width:100px;        
    padding:3px;
  }
  .hidden{
    display:none;
  }
</style>

<div>
  <label for="country">Country</label>
  <select id="country">
    <option>Czech Republic</option>
    <option>USA</option>
  </select>
</div>
<div id="stateContainer"  class="hidden">
  <label for="state">State</label>
  <select id="state">
    <option>Alabama</option>
    <option>Arizona</option>
    <option>Arkansas</option>
  </select>
</div>
<div>
  <label for="name">Name</label>
  <input type="text" id="name" />
</div>

JS:

$(function(){
  $("#country").on("change",function(){
    if ( $(this).val() === "USA") {
      $("#stateContainer").removeClass("hidden");
    } else {
      $("#stateContainer").addClass("hidden");
    }
  })
})

... и вот он в JSFiddle:

http://jsfiddle.net/xoundboy/a2HdZ/5/

он отлично работает при использовании мыши, но если пользователь ограничен только вводом с клавиатуры, тогда UX нарушается. Вы можете увидеть это, если фокус находится в поле страны, и вы используете стрелки вверх / вниз, чтобы выбрать «США» в качестве страны, а затем клавишу табуляции, чтобы перейти к следующему полю. Вместо перехода к недавно показанному полю «состояние» он переходит к полю «имя».

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


person Xoundboy    schedule 28.07.2013    source источник
comment
не могли бы вы проверить, какое решение приемлемо для вас. Мне действительно не нравится, когда за мой ответ проголосовали, если он работает.   -  person Puneet    schedule 28.07.2013
comment
Я согласен - довольно грубо отрицать рабочее решение без каких-либо объяснений.   -  person Xoundboy    schedule 28.07.2013


Ответы (2)


Событие изменения не запускается при нажатии клавиши вверх/вниз. Таким образом, событие change может быть вызвано нажатием клавиши.

Пример js fiddle для изменения кода. Надеюсь, поможет.

РЕДАКТИРОВАТЬ 1 Я проверил в разных браузерах и обнаружил, что эта проблема связана с firefox, и, следовательно, решение предназначено для firefox. Для хрома рассматриваемая скрипка отлично работает для меня.

EDIT 2 Моя предыдущая скрипка запускала change на keypress. Кажется, Firefox что-то изменил, и он больше не работает. Я обновил событие до keyup.

person Puneet    schedule 28.07.2013
comment
событие изменения запускается при использовании клавиш вверх и вниз в поле выбора. - person Patrick Evans; 28.07.2013
comment
@ Патрик Эванс, похоже, что Пунит прав, пожалуйста, удалите отрицательный голос (если это вы его поставили), так как это правильный ответ. Когда я задал вопрос, я тестировал его только в FF, а не в Chrome. - person Xoundboy; 28.07.2013

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

Скрипка

<div>
  <label for="country">Country</label>
  <select id="country" tabindex=1>
    <option>Czech Republic</option>
    <option>USA</option>
  </select>
</div>
<div id="stateContainer"  class="hidden">
  <label for="state">State</label>
  <select id="state" tabindex=2>
    <option>Alabama</option>
    <option>Arizona</option>
    <option>Arkansas</option>
  </select>
</div>
<div>
  <label for="name">Name</label>
  <input type="text" id="name" tabindex=3 />
</div>
person Patrick Evans    schedule 28.07.2013
comment
Tabindex работает только тогда, когда виден div. Следовательно, это не решит проблему. - person Puneet; 28.07.2013
comment
@Puneet, работает отлично, проверь скрипку. Его проблема заключается в том, что когда отображается ранее скрытое поле, оно не получает фокуса при переходе по табуляции. - person Patrick Evans; 28.07.2013
comment
Это не работает для меня. Я использую фаерфокс 22.0. И я дал решение относительно моего браузера. Я не думаю, что мой ответ должен был быть отвергнут из-за этого. - person Puneet; 28.07.2013