Driver.js — это библиотека для создания пошаговых интерактивных гидов по интерфейсу веб-приложений. Один из ключевых аспектов её работы — управление фокусом элементов и корректное взаимодействие с клавиатурной навигацией через tab-индексы. Эти механизмы обеспечивают как доступность для пользователей с клавиатурой, так и правильное визуальное выделение активного шага.
Driver.js автоматически управляет фокусом на текущем активном
элементе. Это достигается через методы .highlight() и
.moveNext() / .movePrevious(), которые
обеспечивают плавное выделение и фокусировку.
Основные моменты:
Фокусировка элемента: при переходе к следующему
шагу библиотека устанавливает tabindex="-1" на элемент и
вызывает метод .focus(). Это позволяет пользователю сразу
взаимодействовать с выделенным элементом.
Возврат фокуса: после завершения тура Driver.js может вернуть фокус к первоначальному элементу страницы или на body, чтобы избежать потери управления клавиатурой.
Обработка модальных окон и скрытых элементов: если элемент не видим или находится внутри скрытого контейнера, Driver.js корректно игнорирует его или автоматически открывает родительский контейнер.
const driver = new Driver();
driver.defineSteps([
{
element: '#button1',
popover: {
title: 'Кнопка подтверждения',
description: 'Нажмите, чтобы подтвердить действие.',
position: 'bottom'
}
}
]);
driver.start();
В этом примере фокус автоматически переместится на элемент
#button1 при показе соответствующего шага.
Tab-индексы определяют порядок навигации по элементам страницы с клавиатуры. В Driver.js можно управлять этим для улучшения UX:
Временная установка tabindex:
Driver.js добавляет tabindex="-1" к элементу, если он
изначально не фокусируемый. Это делает любой элемент доступным для
.focus().
Сохранение оригинального tabindex: библиотека
запоминает исходное значение tabindex, чтобы вернуть его
после завершения тура.
Переопределение порядка навигации: при
необходимости можно вручную указать элементы с нужным
tabindex для конкретного шага, чтобы избежать случайного
перехода фокуса на другие элементы страницы.
driver.defineSteps([
{
element: '#input1',
popover: {
title: 'Поле ввода',
description: 'Введите данные для поиска.',
position: 'top'
},
onNext: function(el) {
el.setAttribute('tabindex', '0'); // временно делаем элемент фокусируемым
}
}
]);
В современных SPA (Single Page Application) элементы могут появляться динамически. Driver.js поддерживает такие случаи через:
Отслеживание появляющихся элементов: если элемент отсутствует на момент инициализации шага, библиотека использует MutationObserver и повторно пытается установить фокус, когда элемент станет доступен.
Обновление фокуса при изменении контента: при асинхронной подгрузке контента или изменении layout, Driver.js корректирует позицию поповера и фокус элемента.
driver.defineSteps([
{
element: '#dynamicButton',
popover: {
title: 'Динамическая кнопка',
description: 'Кнопка появится после загрузки данных.',
position: 'right'
}
}
]);
driver.start();
Driver.js полностью поддерживает клавиатурную навигацию:
Для корректной работы с клавиатурой важно, чтобы все элементы тура
были фокусируемыми. Driver.js автоматически решает этот вопрос,
устанавливая временный tabindex и возвращая исходные
значения после завершения шага.
tabindex
вручную, если элементы уже фокусируемы.onNext,
onPrevious и onHighlightStarted для
дополнительного контроля над фокусом.Фокус и tab-индексы — фундаментальная часть взаимодействия с пользователем в Driver.js. Грамотная настройка этих механизмов обеспечивает не только удобство и наглядность тура, но и соблюдение принципов доступности для всех типов пользователей.