Работоспособность Tom Sel ect начинается с корректного создания
экземпляра и привязки к DOM-элементу. Основной этап диагностики —
подтверждение того, что исходный <select>
действительно был преобразован в управляемый компонент.
<select id="cities" multiple>
<option value="1">Алматы</option>
<option value="2">Астана</option>
</select>
const element = document.getElementById('cities');
const tom = new TomSelect(element, {
maxItems: 3
});
Ключевой признак успешной инициализации — наличие свойства
tomselect у DOM-узла:
console.log(element.tomselect);
Если объект отсутствует, проверяются типовые причины:
destroy()<select> или
<input>Дополнительная проверка через внутренний экземпляр:
console.log(tom instanceof TomSelect);
После инициализации важна верификация внутреннего состояния: значения, список опций и синхронизация с DOM.
tom.getValue(); // текущее значение
tom.options; // доступные опции
tom.items; // выбранные элементы
Несоответствие между items и визуальным интерфейсом
указывает на проблемы синхронизации, часто вызванные внешними
изменениями DOM без уведомления компонента.
Корректное обновление состояния выполняется через API:
tom.setValue(['1', '2']);
tom.clear();
tom.refreshItems();
События Tom Select используются для контроля корректности взаимодействий и диагностики поведения интерфейса.
tom.on('initialize', () => {
console.log('инициализация завершена');
});
tom.on('change', (value) => {
console.log('значение изменено', value);
});
tom.on('item_add', (value) => {
console.log('добавлен элемент', value);
});
tom.on('item_remove', (value) => {
console.log('удален элемент', value);
});
Отсутствие событий change или item_add при
пользовательских действиях обычно указывает на:
disabled)При использовании асинхронной подгрузки важно контролировать
корректность функции load.
const tom = new TomSelect('#remote', {
valueField: 'id',
labelField: 'title',
searchField: 'title',
load: function(query, callback) {
fetch(`/api/items?q=${encodeURIComponent(query)}`)
.then(res => res.json())
.then(callback)
.catch(() => callback());
}
});
Диагностические точки:
load при вводе текстаcallbackОшибка отсутствия callback() приводит к зависанию
интерфейса без обновления списка.
Tom Select должен корректно синхронизироваться с HTML-формой при отправке.
<form id="form">
<select id="tags" name="tags[]" multiple>
<option value="js">JavaScript</option>
<option value="ts">TypeScript</option>
</select>
<button type="submit">Отправить</button>
</form>
Проверка отправляемых данных:
document.getElementById('form').addEventListener('submit', (e) => {
e.preventDefault();
const data = new FormData(e.target);
console.log(data.getAll('tags[]'));
});
Типовые проблемы:
name у <select>optgroup без корректных значенийsetValue без обновления
формыЧастая ошибка — создание нескольких экземпляров на одном элементе.
Признак:
Проверка:
if (element.tomselect) {
element.tomselect.destroy();
}
const tom = new TomSelect(element);
Метод destroy() восстанавливает исходный
<select> и удаляет слушатели событий.
tom.disable();
tom.enable();
Проверка включает:
Если визуальная блокировка отсутствует, проверяется конфликт CSS или переопределение классов.
При использовании render важно убедиться, что шаблоны
возвращают валидный HTML.
new TomSelect('#users', {
render: {
option: (data) => {
return `<div>${data.name}</div>`;
},
item: (data) => {
return `<span>${data.name}</span>`;
}
}
});
Диагностика:
undefined в UIПри больших наборах данных основная проблема — деградация скорости открытия и поиска.
Контрольные параметры:
Практический тест:
console.time('update');
for (let i = 0; i < 1000; i++) {
tom.addOption({ value: i, text: `Item ${i}` });
}
console.timeEnd('update');
Замедление указывает на необходимость оптимизации:
Tom Select не отслеживает внешние изменения
<option> автоматически.
element.add(new Option('Новый элемент', 'new'));
tom.sync();
Если sync() не вызывается, UI и DOM расходятся.
Проверка:
<option>Критически важно отслеживать ошибки инициализации и выполнения:
try {
new TomSelect('#broken', {});
} catch (e) {
console.error('Ошибка Tom Select:', e);
}
Типовые источники ошибок:
valueFieldloadimport TomSelect fr om 'tom-select';
test('инициализация select', () => {
document.body.innerHTML = `
<select id="test">
<option value="1">A</option>
</select>
`;
const el = document.getElementById('test');
const ts = new TomSelect(el);
expect(el.tomselect).toBeDefined();
expect(ts.getValue()).toBe('');
});
Проверяется:
Основной критерий — соответствие поведения пользователя и состояния DOM.
При удалении компонента важно убедиться, что слушатели событий удалены:
tom.destroy();
console.log(element.tomselect); // undefined
Признаки утечек:
В динамических интерфейсах (SPA) компонент может создаваться и уничтожаться многократно.
Проверяется:
destroy()function recreate() {
if (element.tomselect) {
element.tomselect.destroy();
}
return new TomSelect(element);
}
Надёжная работа Tom Select в реальных приложениях определяется не только фактом инициализации, но и устойчивостью поведения при изменениях данных, повторных рендерах и асинхронных сценариях.