Tom Select формирует собственную HTML-структуру поверх стандартного
<select> или <input>, полностью
переопределяя отображение списка выбора и создавая управляемую
DOM-модель для поиска, мультивыбора и кастомного рендера элементов.
Внутренняя разметка генерируется динамически, но опирается на
предсказуемый набор узлов и CSS-классов, которые определяют поведение
компонента.
После инициализации исходный элемент оборачивается в основной контейнер:
<div class="ts-wrapper">
...
</div>
Этот контейнер становится корневым элементом, через который реализуются:
<select>Исходный <select> или <input>
либо скрывается, либо заменяется логической моделью, но сохраняется в
DOM для синхронизации значений.
При использовании <select> создаётся скрытая копия
значения:
<select class="original-select" hidden>
<option value="1">Option 1</option>
</select>
или:
<input type="text" class="ts-control-input" autocomplete="off">
Скрытый input выполняет функции:
Центральный элемент интерфейса:
<div class="ts-control">
<div class="ts-input">
<input type="text" autocomplete="off">
</div>
</div>
ts-control — область взаимодействия (клик, фокус,
ввод)ts-input — контейнер для текстового вводаinput — поле поиска и фильтрацииПри мультивыборе внутри ts-control дополнительно
добавляются токены:
<div class="ts-item">Value 1 <span class="remove">×</span></div>
В режиме single select выбранный элемент может отображаться как текст:
<div class="ts-control">
<div class="ts-single">Option 1</div>
</div>
В режиме multi select используется набор элементов:
<div class="ts-control">
<div class="ts-item">Item 1 <span class="remove">×</span></div>
<div class="ts-item">Item 2 <span class="remove">×</span></div>
<input type="text">
</div>
Выпадающий список создаётся отдельно от control:
<div class="ts-dropdown">
<div class="ts-dropdown-content">
...
</div>
</div>
ts-dropdown — позиционируемый контейнерts-dropdown-content — список опцийts-option — отдельная опцияКаждая опция в списке имеет стандартную структуру:
<div class="ts-option" data-value="1">
Option 1
</div>
<div class="ts-option active"></div>
<div class="ts-option selected"></div>
<div class="ts-option disabled"></div>
active — текущая навигация клавиатуройselected — уже выбранное значениеdisabled — недоступная опцияГруппировка опций реализуется через контейнеры:
<div class="ts-optgroup">
<div class="ts-optgroup-label">Group 1</div>
<div class="ts-option">A</div>
<div class="ts-option">B</div>
</div>
ts-optgroup — контейнер группыts-optgroup-label — заголовок группыts-option — элементы группыГруппы могут быть вложены только логически, но не рекурсивно.
Input для поиска находится внутри control:
<input type="text" class="ts-input" autocomplete="off">
Функционально он:
ts-optionПри вводе текста изменяется видимость опций через:
ts-option[hidden]
или через динамическое удаление из DOM (в зависимости от конфигурации).
Корневой элемент изменяет классы в зависимости от состояния:
<div class="ts-wrapper focus"></div>
<div class="ts-wrapper dropdown-active"></div>
<div class="ts-wrapper disabled"></div>
focus — активный фокус вводаdropdown-active — открыт списокdisabled — блокировка взаимодействияloading — ожидание данныхКаждая опция может содержать служебные атрибуты:
<div class="ts-option" data-value="10" data-selectable="1"></div>
data-value — значение элементаdata-selectable — доступность выбораdata-disabled — блокировкаВнутренняя модель синхронизирует эти значения с состоянием компонента.
В multi-select режиме caret (курсор вставки) представлен как часть DOM:
<div class="ts-control">
<div class="ts-item">A</div>
<input class="ts-input">
</div>
Caret позиция влияет на:
HTML-структура опций может быть расширена через шаблоны:
<div class="ts-option">
<span class="title">Option</span>
<span class="subtitle">Description</span>
</div>
При этом базовый класс ts-option остаётся обязательным,
так как он участвует в:
Tom Select формирует ARIA-совместимую структуру:
<div role="combobox" aria-expanded="false">
<input aria-autocomplete="list">
<div role="listbox">
<div role="option"></div>
</div>
</div>
combobox — основной контролlistbox — контейнер спискаoption — элементы выбораARIA-атрибуты обновляются синхронно с DOM:
aria-expandedaria-selectedaria-activedescendantDOM-структура не статична и может изменяться:
ts-option при async загрузкеКаждое изменение отражается в следующих узлах:
ts-wrapperts-controlts-dropdown-contentДополнительные элементы, создаваемые библиотекой:
<div class="ts-loading">Loading...</div>
<div class="ts-no-results">No results found</div>
Они появляются внутри ts-dropdown-content и управляются
состоянием поиска и загрузки данных.