Библиотека Tabbable в JavaScript предназначена для
определения всех элементов на странице, которые могут получать фокус
через клавишу Tab. Она используется для обеспечения доступности
интерфейсов и контроля навигации с клавиатуры. В отличие от ручного
перебора DOM-элементов, Tabbable предоставляет высокоуровневый API,
который корректно учитывает такие особенности, как скрытые элементы,
элементы с disabled и специфические правила для форм.
Основные функции:
tabbable(container) — возвращает массив элементов
внутри указанного контейнера, которые могут быть сфокусированы через
Tab.isTabbable(element) — проверяет, является ли отдельный
элемент доступным для фокусировки с Tab.focusable(container) — возвращает все элементы, которые
можно сфокусировать, включая те, которые не входят в порядок
табуляции.Эти функции учитывают скрытые элементы (display: none и
visibility: hidden), атрибут tabindex и
элементы <input>, <button>,
<a> с соответствующими условиями.
Библиотека ally.js также предназначена для управления фокусом и доступностью, но отличается по подходу и набору возможностей.
В Tabbable API минималистичное и узкоспециализированное:
import { tabbable } from 'tabbable';
const elements = tabbable(document.body);
elements.forEach(el => console.log(el.tagName));В ally.js API более разветвлённое:
import * as ally from 'ally.js';
const tabbableElements = ally.query.tabstoppable({ context: document.body });tabindex="-1", скрытыми элементами и встроенными элементами
формы, но не управляет фокусом динамически.Поиск всех табулируемых элементов на странице:
import { tabbable } from 'tabbable';
const allTabbable = tabbable(document.body);
console.log(allTabbable); // [button, input, a, ...]
Проверка, можно ли сфокусировать конкретный элемент:
import { isTabbable } from 'tabbable';
const button = document.querySelector('#submit');
if (isTabbable(button)) {
button.focus();
}
Фокусировка первого доступного элемента:
import { tabbable } from 'tabbable';
const firstFocusable = tabbable(document.querySelector('#form'))[0];
if (firstFocusable) {
firstFocusable.focus();
}
Tabbable идеальна для лёгких инструментов проверки фокусируемости, создания собственных систем управления клавиатурой и анализа доступности элементов формы. В то время как ally.js подходит для комплексных приложений, где необходимо полное управление доступностью и модальными состояниями.