В основе механизма управления фокусом в Tom Select лежит разделение
на несколько логических узлов интерфейса: исходный
<select>-элемент, контейнер управления
(control), поле ввода (input) и выпадающий
список (dropdown). Фокусное состояние не закрепляется за
одним DOM-элементом, а динамически перемещается между компонентами в
зависимости от состояния компонента.
Контейнер управления выступает основным точечным получателем фокуса. Он эмулирует поведение нативного элемента формы, сохраняя при этом возможность взаимодействия через клавиатуру и программный API.
При создании экземпляра Tom Select исходный элемент
<select> скрывается, а на его месте формируется
интерактивная структура. Фокус, первоначально принадлежащий нативному
элементу, переопределяется через tabindex у контейнера
управления.
Ключевые элементы инициализации:
tabindex="0" для контейнера управленияfocus и blur к
контейнеруСобытие focus на исходном элементе перенаправляется на
кастомный контейнер, обеспечивая единое поведение независимо от способа
активации.
При получении фокуса контейнером управления активируется внутренняя логика состояния. В зависимости от конфигурации компонент может автоматически открывать выпадающий список и переносить фокус в поле ввода.
Поведение включает:
input при включённой опции поискаВ момент открытия списка активное состояние фиксируется, а навигация клавиатурой перенаправляется на элементы опций.
В режиме поиска фокус динамически переключается между двумя узлами:
control — основной контейнер взаимодействияinput — поле ввода фильтрацииПри активации ввода фокус смещается в input, при
завершении ввода или выборе значения может возвращаться в
control.
Состояния переключения:
Такое разделение позволяет поддерживать непрерывный ввод без потери контекста интерфейса.
Фокусное поведение интегрируется в общий tab order документа через
управление tabindex.
Основные принципы:
При использовании клавиши Tab происходит выход из
компонента с фиксацией выбранного значения или состояния ввода.
Событие blur обрабатывается с учётом структуры
компонента. Потеря фокуса не всегда означает завершение взаимодействия,
поскольку dropdown может оставаться активным.
Учитываются следующие сценарии:
Логика проверки осуществляется через анализ
relatedTarget и принадлежности элемента к DOM-структуре
компонента.
При открытии выпадающего списка активируется режим захвата фокуса. В этом режиме взаимодействие ограничивается внутренними элементами компонента.
Поведение при открытии:
Поведение при закрытии:
Закрытие может происходить как через выбор значения, так и через внешнее действие (например, blur или нажатие Escape).
В режиме множественного выбора (multiple) фокусная
модель усложняется за счёт наличия токенов выбранных значений.
Особенности:
Удалённые элементы не требуют возврата фокуса на control, если сохраняется активный input.
Фокусное поведение синхронизируется с состоянием формы через скрытый
<select>-элемент. Несмотря на кастомный UI, состояние
фокуса не нарушает стандартную модель HTML-форм.
Особенности интеграции:
Некоторые состояния требуют дополнительной обработки фокуса:
Отключённое состояние
disabled фокус не может быть установлен на
controlReadonly режим
Программное управление
Фокусное поведение сопровождается набором событий, отражающих изменения состояния:
onFocus — активация controlonBlur — потеря фокуса компонентомonDropdownOpen — открытие спискаonDropdownClose — закрытие спискаЭти события формируют основу для синхронизации состояния интерфейса и управления логикой взаимодействия, не нарушая внутреннюю модель фокусировки.