Система событий в Tom Select играет ключевую роль при синхронизации интерфейса, данных формы и удалённых источников. События изменения данных позволяют отслеживать выбор элементов, удаление значений, создание новых записей и любые операции, влияющие на внутреннее состояние компонента.
Грамотное использование событий обеспечивает:
Tom Select предоставляет собственную систему событий через метод
on(). Все события регистрируются на экземпляре
компонента.
Пример инициализации:
const select = new TomSelect('#users', {
maxItems: 5
});
Подписка на событие:
select.on('change', function(value) {
console.log(value);
});
Удаление обработчика:
select.off('change');
Регистрация одноразового обработчика:
select.once('change', function(value) {
console.log('Событие сработало один раз');
});
Событие change вызывается при любом изменении выбранных
значений:
Это основное событие синхронизации состояния компонента.
select.on('change', function(value) {
console.log(value);
});
Для одиночного выбора:
"admin"
Для множественного выбора:
["admin", "editor"]
Tom Select также инициирует стандартное DOM-событие:
document.querySelector('#users')
.addEventListener('change', function(e) {
console.log(e.target.value);
});
Это особенно важно при интеграции с:
Tom Select обновляет оригинальный <select> или
<input> автоматически.
<select id="skills" multiple>
<option value="js">JavaScript</option>
<option value="php">PHP</option>
</select>
new TomSelect('#skills');
После выбора значения форма будет содержать актуальные данные.
select.on('change', function(value) {
if (value === 'company') {
companyFields.style.display = 'block';
} else {
companyFields.style.display = 'none';
}
});
countrySelect.on('change', function(country) {
loadCities(country);
});
tagsSelect.on('change', function(values) {
preview.innerHTML = values.join(', ');
});
Событие item_add вызывается при добавлении нового
выбранного элемента.
select.on('item_add', function(value, item) {
console.log(value);
console.log(item);
});
Параметры:
| Параметр | Описание |
|---|---|
| value | Значение элемента |
| item | DOM-узел выбранного элемента |
select.on('item_add', function(value) {
console.log(`Добавлен элемент: ${value}`);
});
select.on('item_add', function() {
if (this.items.length >= 5) {
this.lock();
}
});
select.on('item_add', function() {
counter.textContent = this.items.length;
});
| Событие | Когда вызывается |
|---|---|
| change | При любом изменении |
| item_add | Только при добавлении |
Событие item_remove вызывается после удаления выбранного
элемента.
select.on('item_remove', function(value) {
console.log(`Удалён элемент: ${value}`);
});
select.on('item_remove', function(value) {
const section = document.querySelector(`[data-tag="${value}"]`);
if (section) {
section.remove();
}
});
select.on('item_remove', function() {
this.unlock();
});
| Событие | Действие |
|---|---|
| item_add | Добавление |
| item_remove | Удаление |
Событие clear вызывается после полной очистки выбранных
значений.
select.on('clear', function() {
console.log('Все элементы удалены');
});
select.on('clear', function() {
preview.innerHTML = '';
counter.textContent = '0';
});
select.on('clear', function() {
submitButton.disabled = true;
});
Событие option_add вызывается при добавлении новой опции
в список доступных вариантов.
Важно отличать:
option_add — добавление варианта в список;item_add — выбор пользователем.select.on('option_add', function(value, data) {
console.log(value);
console.log(data);
});
select.addOption({
value: 10,
text: 'Backend'
});
Сработает:
option_add
select.on('option_add', function(value, data) {
cache[value] = data;
});
Событие вызывается при удалении опции из внутреннего списка.
select.on('option_remove', function(value) {
console.log(`Опция удалена: ${value}`);
});
select.on('option_remove', function(value) {
delete cache[value];
});
Событие вызывается после полной очистки всех доступных опций.
select.on('option_clear', function() {
console.log('Список опций очищен');
});
select.on('option_clear', function() {
loadDefaultOptions();
});
Вызывается при добавлении группы опций.
select.on('optgroup_add', function(id, data) {
console.log(id);
console.log(data);
});
Срабатывает после удаления группы.
select.on('optgroup_remove', function(id) {
console.log(`Группа удалена: ${id}`);
});
Полная очистка групп.
select.on('optgroup_clear', function() {
console.log('Все группы удалены');
});
Вызывается после завершения инициализации компонента.
select.on('initialize', function() {
console.log('Tom Select готов');
});
select.on('initialize', function() {
initValidation();
initAnalytics();
});
Вызывается перед уничтожением экземпляра.
select.on('destroy', function() {
console.log('Компонент уничтожается');
});
select.on('destroy', function() {
clearInterval(timer);
observer.disconnect();
});
Вызывается при вводе текста пользователем.
select.on('type', function(str) {
console.log(str);
});
select.on('type', function(query) {
analytics.track(query);
});
select.on('type', function(query) {
if (query.length < 3) {
return;
}
loadResults(query);
});
Срабатывает после завершения асинхронной загрузки данных.
select.on('load', function(data) {
console.log(data);
});
select.on('load', function() {
loader.style.display = 'none';
});
select.on('load', function(data) {
resultCount.textContent = data.length;
});
Вызывается при открытии выпадающего списка.
select.on('dropdown_open', function(dropdown) {
console.log(dropdown);
});
select.on('dropdown_open', function() {
analytics.track('dropdown_open');
});
Срабатывает при закрытии выпадающего списка.
select.on('dropdown_close', function(dropdown) {
console.log(dropdown);
});
Вызывается при получении фокуса компонентом.
select.on('focus', function() {
console.log('Фокус получен');
});
Срабатывает при потере фокуса.
select.on('blur', function() {
console.log('Фокус потерян');
});
select.on('item_add', function(value) {
console.log('Добавлено:', value);
});
select.on('item_remove', function(value) {
console.log('Удалено:', value);
});
select.on('change', function(values) {
save(values);
});
function registerEvents(select) {
select.on('change', handleChange);
select.on('item_add', handleAdd);
select.on('item_remove', handleRemove);
}
function handleChange(values) {
console.log(values);
}
function handleAdd(value) {
console.log(value);
}
Внутри обработчиков this указывает на экземпляр Tom
Select.
select.on('change', function() {
console.log(this.items);
});
select.on('change', function() {
console.log(this.getValue());
});
select.on('change', function() {
console.log(this.options);
});
let updating = false;
select.on('change', function(values) {
if (updating) {
return;
}
updating = true;
sync(values);
updating = false;
});
select.off('change');
select.off();
| Событие | Назначение |
|---|---|
| change | Синхронизация данных |
| item_add | Реакция на добавление |
| item_remove | Реакция на удаление |
| type | Поиск |
| load | Работа с AJAX |
| clear | Очистка интерфейса |
Ошибка:
select.on('change', function(value) {
sendNotification(value);
});
При удалении события также будут отправляться уведомления.
Правильно:
select.on('item_add', function(value) {
sendNotification(value);
});
Ошибка:
function init() {
select.on('change', handler);
}
При повторной инициализации события будут дублироваться.
Ошибка особенно опасна в SPA-приложениях.
select.destroy();
Без очистки связанных ресурсов возможны:
const select = new TomSelect('#users', {
valueField: 'id',
labelField: 'name',
searchField: 'name',
load(query, callback) {
fetch(`/api/users?q=${query}`)
.then(res => res.json())
.then(data => callback(data));
}
});
select.on('type', function(query) {
loader.style.display = 'block';
});
select.on('load', function() {
loader.style.display = 'none';
});
select.on('item_add', function(value) {
console.log(`Выбран пользователь ${value}`);
});
select.on('change', function(values) {
saveForm(values);
});
select.on('change', function(values) {
store.commit('updateTags', values);
});
select.on('item_add', function(value) {
renderTag(value);
});
const events = [
'change',
'item_add',
'item_remove',
'clear',
'type',
'load'
];
events.forEach(event => {
select.on(event, function(...args) {
console.log(event, args);
});
});
Плохо:
select.on('type', function(query) {
expensiveOperation();
});
Лучше:
select.on('type', debounce(function(query) {
expensiveOperation();
}, 300));
select.on('change', function(values) {
if (JSON.stringify(values) === lastState) {
return;
}
lastState = JSON.stringify(values);
save(values);
});
Многие действия вызывают цепочку событий.
Например:
select.addItem('admin');
Может вызвать:
item_addchangeОчистка:
select.clear();
Вызывает:
clearchangeПонимание последовательности событий критично при построении сложной логики интерфейса.