Tom Select представляет собой легковесную библиотеку, построенную
поверх стандартного HTML <select> и предназначенную
для расширения его возможностей без привязки к фреймворкам. В режиме
Vanilla JavaScript библиотека подключается напрямую через CDN или
локальный файл и инициализируется на уже существующих DOM-элементах.
Базовая модель работы строится вокруг преобразования стандартного элемента формы в управляемый компонент с внутренним состоянием, событиями и API для манипуляции списком опций.
Минимальная интеграция выполняется через подключение CSS и JS файлов библиотеки:
<link rel="stylesheet" href="tom-select.default.css">
<script src="tom-select.complete.js"></script>
После загрузки DOM выполняется инициализация:
<select id="countries">
<option value="kz">Kazakhstan</option>
<option value="ru">Russia</option>
<option value="us">USA</option>
</select>
new TomSelect("#countries");
При создании экземпляра происходит:
<select>Каждый экземпляр Tom Select хранит внутреннее представление опций в виде нормализованного массива объектов:
[
{ value: "kz", text: "Kazakhstan" },
{ value: "ru", text: "Russia" }
]
Эта структура используется для:
Состояние выбора отделено от DOM и обновляется через API, что снижает количество прямых манипуляций с HTML.
Инициализация принимает объект настроек, влияющий на поведение компонента:
new TomSelect("#countries", {
maxItems: 1,
create: false,
searchField: ["text"]
});
maxItems — ограничение количества выбранных
значенийcreate — разрешение добавления новых опций
пользователемsearchField — поля объекта, участвующие в поискеplaceholder — текст-подсказкаcloseAfterSelect — закрытие dropdown после выбораКаждый параметр влияет на внутренние алгоритмы фильтрации и рендера.
Поиск реализуется через проход по массиву опций и сравнении строки ввода с заданными полями:
query -> normalize -> match -> score -> sort
Алгоритм включает:
Пример настройки поиска:
new TomSelect("#countries", {
searchField: ["text", "value"]
});
API позволяет изменять список опций без перезагрузки страницы.
const select = new TomSelect("#countries");
select.addOption({
value: "de",
text: "Germany"
});
select.refreshOptions(false);
select.removeOption("de");
При изменении списка происходит пересборка внутреннего индекса поиска.
В Vanilla JavaScript режиме управление осуществляется через методы экземпляра:
select.setValue("kz");
select.addItem("ru");
select.removeItem("us");
Разница между уровнями:
setValue — полная замена выбораaddItem — добавление без сбросаremoveItem — удаление конкретного значенияКаждое действие вызывает синхронизацию с оригинальным
<select>.
Система событий построена поверх EventEmitter-подобной модели:
const select = new TomSelect("#countries");
select.on("change", (value) => {
console.log(value);
});
Основные события:
change — изменение выбранных значенийitem_add — добавление элементаitem_remove — удаление элементаdropdown_open — открытие спискаdropdown_close — закрытие спискаtype — ввод текстаСобытия позволяют интегрировать компонент в произвольную бизнес-логику.
Поддерживается режим динамической подгрузки через
load:
new TomSelect("#countries", {
load: function(query, callback) {
fetch("/api/countries?q=" + query)
.then(res => res.json())
.then(data => callback(data));
}
});
Механизм работает следующим образом:
UI состоит из нескольких ключевых компонентов:
Каждый элемент создается динамически и обновляется при изменении состояния.
Виртуального DOM нет — обновления происходят через прямые манипуляции с DOM, но оптимизированы через батчинг изменений.
В Vanilla JavaScript режиме доступны шаблоны рендера:
new TomSelect("#countries", {
render: {
option: function(data, escape) {
return `<div>${escape(data.text)}</div>`;
},
item: function(data, escape) {
return `<div class="item">${escape(data.text)}</div>`;
}
}
});
Шаблоны позволяют:
Функция escape защищает от XSS при выводе данных.
Компонент полностью совместим с HTML формами. При сабмите:
<select>Пример:
<form>
<select id="countries" name="country"></select>
<button type="submit">Send</button>
</form>
new TomSelect("#countries", {
maxItems: 3
});
При работе с большими списками применяются стратегии:
Особенно критично при списках от 1000+ элементов, где фильтрация и DOM-операции становятся узким местом.
Каждое изменение проходит через слой синхронизации:
<select>Эта цепочка гарантирует консистентность данных между формой и компонентом.
Удаление компонента выполняется через:
select.destroy();
Процесс включает:
<select>Механизм важен при SPA-навигации и динамических интерфейсах, где компоненты часто пересоздаются.