Допустим, у меня есть документ, полный фокусируемых элементов, либо потому, что они изначально фокусируются (например, <input type="text">
), либо потому, что они имеют tabindex="0"
или тому подобное.
Теперь предположим, что есть раздел моего документа, который я хочу отобразить в виде модального диалогового окна, и я не хочу, чтобы пользователь отвлекался на что-либо за пределами диалогового окна. Я хотел бы, чтобы клавиша табуляции циклически проходила только через фокусируемые элементы внутри элемента контейнера для диалогового окна. Какой самый простой способ сделать это?
Если возможно, я ищу решение, которое не заботится о содержании диалогового окна или остальной части страницы и не пытается их изменить. То есть я не хочу, чтобы элементы вне диалогового окна, например, не фокусировались. Во-первых, это требует внесения обратимых изменений и отслеживания состояния. Во-вторых, для этого необходимо знать все возможные способы фокусировки элемента. Мне это кажется грязным, хрупким и не масштабируемым.
Моя первая попытка выглядит следующим образом, но работает только в прямом направлении (нажатие клавиши Tab). Он не работает в обратном направлении (нажатие Shift + Tab).
<div>Focusable stuff outside the dialog.</div>
<div class="dialog" tabindex="0">
<!-- Focus should be trapped inside this dialog while it's open -->
<div class="content">
Form contents and focusable stuff here.
</div>
<div class="last-focus" tabindex="0" onfocus="this.parentNode.focus()"></div>
</div>
<div>More focusable stuff outside the dialog.</div>
Я бы предпочел увидеть чистые решения JavaScript. Если есть способ сделать это с библиотекой, такой как jQuery, я бы предпочел ссылку на код библиотеки, который делает это.