Режим multiple предназначен для преобразования стандартного HTML
<select> в компонент, поддерживающий выбор нескольких
значений с расширенной логикой управления, поиском и визуализацией
выбранных элементов. В контексте Tom Select данный режим является
базовым механизмом построения теговых интерфейсов, фильтров и сложных
форм с множественными значениями.
Основой активации множественного выбора выступает стандартный атрибут
multiple у элемента <select>:
<select id="tags" multiple>
<option value="js">JavaScript</option>
<option value="ts">TypeScript</option>
<option value="css">CSS</option>
</select>
При наличии атрибута multiple библиотека автоматически
переводит компонент в режим работы с массивом значений.
new TomSelect("#tags", {
plugins: [],
});
При инициализации на элементе с multiple библиотека
начинает хранить значение не как строку, а как массив строковых
идентификаторов.
В режиме множественного выбора внутреннее значение представляется массивом:
["js", "css", "ts"]
Каждое добавление или удаление элемента изменяет состояние массива, что напрямую отражается на DOM и скрытом input.
Добавление выполняется через API:
const control = document.querySelector("#tags").tomselect;
control.addItem("js");
Если значение уже присутствует, повторное добавление игнорируется, предотвращая дублирование.
control.removeItem("css");
Удаление влияет на внутренний массив и обновляет визуальные теги.
control.setValue(["js", "ts"]);
Метод полностью перезаписывает текущее состояние.
control.getValue();
Возвращает массив выбранных значений.
В multiple-режиме выбранные элементы отображаются как отдельные UI-блоки (теги). Каждый элемент:
Визуализация формируется через шаблон render.item.
new TomSelect("#tags", {
render: {
item(data) {
return `<div class="item">${data.text}</div>`;
}
}
});
Tom Select автоматически синхронизирует значение с скрытым
<input>.
При multiple-режиме создаётся несколько значений с одинаковым
name:
<input type="hidden" name="tags[]" value="js">
<input type="hidden" name="tags[]" value="ts">
Использование [] в имени поля критично для корректной
обработки на сервере.
Параметр maxItems управляет верхним пределом:
new TomSelect("#tags", {
maxItems: 3
});
При достижении лимита:
При включённой опции create допускается добавление
пользовательских значений:
new TomSelect("#tags", {
multiple: true,
create: true
});
В multiple-режиме новые элементы сразу становятся частью массива значений.
Порядок хранения значений зависит от последовательности добавления.
Управление возможно через onItemAdd:
new TomSelect("#tags", {
onItemAdd(value) {
console.log("Добавлено:", value);
}
});
Для принудительной сортировки применяется переустановка массива:
control.setValue(control.getValue().sort());
control.clear();
Действие полностью сбрасывает состояние multiple-выбора.
control.lock();
В locked-режиме:
Разблокировка:
control.unlock();
Основные события:
Срабатывает при добавлении значения:
onItemAdd(value, item) {}
onItemRemove(value) {}
Срабатывает при любом изменении массива:
onChange(valueArray) {}
Множественный выбор поддерживает группировку:
<optgroup label="Frontend">
<option value="react">React</option>
<option value="vue">Vue</option>
</optgroup>
Поведение не отличается от одиночного выбора, но элементы визуально сохраняют принадлежность к группе в dropdown-списке.
Tom Select гарантирует уникальность значений внутри массива. Логика:
При фокусе на input:
Поиск применяется к выпадающему списку, но не влияет на уже выбранные значения. Это позволяет:
При обновлении источника данных:
control.addOption({ value: "node", text: "Node.js" });
или массово:
control.addOptions([
{ value: "node", text: "Node.js" },
{ value: "deno", text: "Deno" }
]);
multiple-режим автоматически интегрирует новые значения в доступный список без изменения уже выбранных элементов.
При использовании JSON-логики или AJAX отправки:
JSON.stringify(control.getValue());
результат всегда представляет массив строк, что упрощает серверную обработку без дополнительного парсинга строковых списков.
valueFieldPlaceholder отображается только при пустом массиве:
new TomSelect("#tags", {
placeholder: "Выбор технологий"
});
После добавления первого элемента placeholder скрывается автоматически.