Добавление пользовательских значений через ввод в Choices.js реализуется через механизм динамического создания элементов списка, который позволяет превращать введённый текст в полноценные элементы выбора (items). Такой подход используется в теговых интерфейсах, системах фильтрации, формах с произвольными значениями и сценариях, где фиксированный набор опций недостаточен.
Ключевая возможность добавления значений через ввод активируется
опцией addItems и поддерживается логикой создания новых
элементов при отсутствии совпадений в списке доступных значений.
Основные параметры:
addItems: true — разрешает добавление новых
элементовduplicateItems: false — запрещает дублирование
значенийdelimiter — символ(ы) разделения при вводе нескольких
значенийeditItems: true — позволяет редактировать уже
добавленные элементыПри активированном режиме пользовательский ввод, не совпадающий с существующими опциями, может быть преобразован в новый элемент.
Типовая конфигурация, позволяющая добавлять элементы через ввод:
const choices = new Choices('#tags', {
addItems: true,
duplicateItems: false,
editItems: true,
delimiter: ',',
paste: true
});
В таком режиме ввод текста и нажатие Enter приводит к созданию нового элемента списка. При вводе нескольких значений через разделитель они разбиваются и добавляются по отдельности.
При обработке пользовательского ввода библиотека выполняет несколько этапов:
addItemsКлючевым является момент проверки на существование: если значение уже
присутствует, поведение зависит от duplicateItems.
Добавление через ввод чаще всего связано с клавишей Enter. Однако
возможна обработка нескольких значений сразу через
delimiter.
Пример:
const choices = new Choices('#tags', {
addItems: true,
delimiter: ','
});
Ввод:
javascript, html, css
Результат:
Каждое значение будет преобразовано в отдельный элемент.
Помимо пользовательского ввода, новые элементы можно добавлять программно через API.
choices.setChoiceByValue('react');
choices.setValue(['react']);
Однако для динамического добавления используется другой подход:
choices.setChoices([
{ value: 'vue', label: 'Vue' }
], 'value', 'label', true);
Внутренние методы позволяют расширять список доступных опций:
choices._addChoice({
value: 'angular',
label: 'Angular',
selected: false,
disabled: false
});
Хотя метод с подчёркиванием считается внутренним, он часто используется при кастомных расширениях.
Для контроля качества вводимых данных применяется
addItemFilter. Это функция, которая позволяет перехватывать
ввод перед созданием элемента.
Пример:
const choices = new Choices('#tags', {
addItems: true,
addItemFilter: (value) => {
return value.length > 2;
}
});
В этом случае значения короче 3 символов игнорируются.
Фильтр может использоваться для:
Перед добавлением часто требуется преобразование текста:
Пример:
const choices = new Choices('#tags', {
addItems: true,
addItemFilter: (value) => {
const normalized = value.trim().toLowerCase();
return normalized;
}
});
В данном сценарии фактически создаётся контролируемый pipeline обработки ввода.
При вставке текста из буфера обмена поведение аналогично вводу, но с возможностью пакетного добавления значений.
const choices = new Choices('#tags', {
addItems: true,
paste: true,
delimiter: ','
});
Если пользователь вставляет строку:
node.js, express, mongodb
она автоматически разбивается и добавляется как три отдельных элемента.
Контроль повторяющихся значений критичен при вводе через текстовое поле.
const choices = new Choices('#tags', {
addItems: true,
duplicateItems: false
});
Поведение:
false повтор игнорируетсяtrue создаются дубликатыВнутри система сравнивает value, а не
label, что важно при различии отображаемого текста и
реального значения.
Каждое добавление нового значения сопровождается событием
addItem, которое позволяет отслеживать изменения
состояния.
document.querySelector('#tags').addEventListener(
'addItem',
function(event) {
const item = event.detail;
}
);
event.detail содержит:
Это позволяет строить реактивные интерфейсы, где ввод пользователя сразу влияет на бизнес-логику.
При включённом delimiter система автоматически делит
строку на массив значений.
Алгоритм:
Пример конфигурации:
const choices = new Choices('#tags', {
addItems: true,
delimiter: ','
});
Пустые строки и строки из пробелов игнорируются на этапе обработки. При необходимости это поведение можно изменить через кастомный фильтр.
addItemFilter: (value) => value.trim().length > 0
При включённом поиске пользователь может вводить текст, который не соответствует существующим опциям. В зависимости от конфигурации:
Это поведение регулируется сочетанием addItems и
внутренней логикой поиска.
В продвинутых сценариях ввод может ограничиваться шаблоном:
Пример:
const choices = new Choices('#tags', {
addItems: true,
addItemFilter: (value) => {
return /^[a-z0-9-]+$/.test(value);
}
});
Такой подход превращает поле ввода в контролируемый генератор строго типизированных значений.
Комбинация ключевых параметров определяет модель добавления:
addItems — разрешение создания новых элементовduplicateItems — контроль уникальностиdelimiter — пакетный вводpaste — вставка нескольких значенийaddItemFilter — валидацияЭти параметры формируют основу логики динамического расширения списка и позволяют адаптировать поведение под любые интерфейсные задачи, связанные с пользовательским вводом и формированием набора значений.