Работа с множественным вводом email в Tom Select строится на механике тегов (tagging), где каждое значение рассматривается как отдельная сущность с возможностью создания, удаления и валидации. В контексте email-полей это превращает обычный input в управляемый контейнер адресов, где каждый email становится отдельным токеном.
Основная идея заключается в том, что поле ввода перестаёт хранить одну строку и переходит к массиву значений:
Инициализация обычно опирается на режим создания новых значений:
new TomSelect("#emails", {
plugins: ["remove_button"],
persist: false,
create: true
});
Ключевой параметр create: true активирует режим
добавления произвольных значений, что критично для email-сценариев.
HTML-элемент, предназначенный для множественного ввода, как правило, выглядит как обычный select с возможностью множественного выбора:
<select id="emails" multiple></select>
После инициализации каждый введённый email превращается в отдельный объект выбора. Внутренне библиотека хранит структуру:
[
{ value: "a@mail.com", text: "a@mail.com" },
{ value: "b@mail.com", text: "b@mail.com" }
]
Такой подход обеспечивает унифицированную работу с данными независимо от источника — пользовательский ввод или предзаполненные значения.
Для email-форматов критично поддерживать ввод через разделители. На практике используются:
Конфигурация delimiter задаёт базовый символ
разделения:
new TomSelect("#emails", {
create: true,
delimiter: ","
});
Однако для email-логики чаще требуется расширенная обработка, включающая разбиение строки по нескольким символам.
При вставке строки:
user1@mail.com, user2@mail.com user3@mail.com
логика должна преобразовать её в набор значений. Это реализуется
через createFilter и обработку onPaste.
Ключевой элемент системы — проверка корректности email перед добавлением в список. Стандартный подход — регулярное выражение:
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
Интеграция в конфигурацию:
new TomSelect("#emails", {
create: (input) => {
const value = input.trim();
if (emailRegex.test(value)) {
return { value, text: value };
}
return false;
}
});
Такой механизм предотвращает попадание некорректных значений в модель данных.
При работе с email важно приводить значения к единому формату:
Пример нормализации:
create: (input) => {
const email = input.trim().toLowerCase();
if (!emailRegex.test(email)) return false;
return {
value: email,
text: email
};
}
Дополнительно применяется фильтрация уже существующих значений, чтобы избежать повторного добавления.
Встроенного механизма дедупликации недостаточно, поэтому используется проверка текущего состояния:
create: (input) => {
const email = input.trim().toLowerCase();
if (!emailRegex.test(email)) return false;
if (this.items.includes(email)) return false;
return { value: email, text: email };
}
Логика исключает повторное добавление уже выбранного адреса, сохраняя целостность списка.
Часто email должен создаваться не только по разделителям, но и при потере фокуса поля:
new TomSelect("#emails", {
create: true,
createOnBlur: true
});
Это поведение позволяет завершать ввод без дополнительных действий, что критично для быстрого набора адресов.
Помимо базовой проверки, часто применяется расширенная логика:
На стороне клиента Tom Select используется как первый слой защиты, а серверная валидация выступает финальным фильтром.
Каждый email может отображаться в виде кастомного тега:
new TomSelect("#emails", {
render: {
item: (data, escape) => {
return `<div class="email-tag">${escape(data.value)}</div>`;
},
option: (data, escape) => {
return `<div>${escape(data.value)}</div>`;
}
}
});
Это позволяет добавлять визуальные индикаторы, например:
В более сложных сценариях email проверяется через сервер:
create: async (input) => {
const email = input.trim().toLowerCase();
const res = await fetch("/api/validate-email", {
method: "POST",
body: JSON.stringify({ email })
});
const result = await res.json();
if (!result.valid) return false;
return { value: email, text: email };
}
Такая модель позволяет учитывать:
Tom Select предоставляет API для программного контроля:
const control = new TomSelect("#emails");
// добавление email
control.addItem("test@mail.com");
// удаление
control.removeItem("test@mail.com");
// очистка
control.clear();
Это используется при:
Для сценариев импорта применяется пакетное добавление:
const emails = "a@mail.com,b@mail.com,c@mail.com"
.split(",")
.map(e => e.trim());
emails.forEach(email => {
if (emailRegex.test(email)) {
control.addItem(email);
}
});
Такой подход часто используется при вставке из Excel или CRM-систем.
Для контроля перегрузки формы вводится лимит:
new TomSelect("#emails", {
maxItems: 10
});
При достижении лимита добавление новых email блокируется, что важно для:
При отправке формы данные автоматически сериализуются:
const data = control.getValue();
Результат — массив email-адресов, готовый для передачи на сервер без дополнительного парсинга.
Множественный ввод email в Tom Select представляет собой комбинацию теговой модели данных, строгой валидации и расширенной обработки пользовательского ввода, обеспечивающую предсказуемую структуру массива адресов при высокой гибкости интерфейса.