Инициализация текстового input в Choices.js строится вокруг
преобразования стандартного HTML-поля в управляемый компонент ввода,
поддерживающий токены, автодополнение и расширенные правила обработки
значений. В отличие от классического <input>,
библиотека перехватывает ввод пользователя, преобразует значения в
структурированные элементы и предоставляет API для контроля состояния
поля.
Работа начинается с обычного текстового поля:
<input type="text" id="tags-input" placeholder="Введите значения">
Choices.js подключается к этому элементу и заменяет стандартное поведение на управляемую модель ввода.
Ключевой момент заключается в том, что библиотека не требует изменения HTML-разметки. Всё поведение определяется JavaScript-конфигурацией.
Основной способ создания экземпляра Choices:
import Choices from 'choices.js';
const input = document.getElementById('tags-input');
const choices = new Choices(input);
После выполнения этого кода поле перестаёт работать как обычный input и начинает обрабатывать ввод как набор отдельных значений.
По умолчанию активируется режим добавления элементов, где каждое введённое значение может быть зафиксировано как отдельная единица.
Для текстовых input Choices.js чаще всего используется в режиме “тегов”. В этом режиме каждое значение преобразуется в отдельный элемент:
const choices = new Choices(input, {
delimiter: ',',
editItems: true,
removeItemButton: true
});
Определяет символ, разделяющий значения при вставке строки:
"," — стандартное разделение через запятую";" — альтернативный форматnull — отключение автоматического разделенияПозволяет редактировать уже добавленные значения. При включении пользователь может изменять текст токена без удаления.
Добавляет кнопку удаления рядом с каждым элементом, что критично для UX при работе с множественными значениями.
Choices.js предоставляет набор параметров, управляющих логикой ввода и сохранения значений.
const choices = new Choices(input, {
addItems: true,
duplicateItems: false,
maxItemCount: 10,
addItemFilter: (value) => value.trim().length > 2
});
Определяет, разрешено ли добавление новых значений. В контексте input это основной переключатель между режимом “просто ввод” и “структурированный ввод”.
Контролирует возможность добавления повторяющихся значений. При
false библиотека автоматически блокирует дубликаты на
уровне модели данных.
Ограничивает количество введённых элементов. После достижения лимита поле блокирует дальнейшее добавление.
Функция фильтрации, позволяющая валидировать ввод до добавления элемента:
addItemFilter: (value) => /^[a-zA-Z0-9]+$/.test(value)
Фильтр работает синхронно и может полностью блокировать добавление неподходящих значений.
Choices.js изменяет стандартный цикл обработки input:
Дополнительная настройка:
const choices = new Choices(input, {
paste: true,
duplicateItemsAllowed: false,
resetScrollPosition: true
});
Определяет поведение при вставке текста. При true
библиотека пытается разбить вставленный текст на несколько
элементов.
Управляет сбросом прокрутки после добавления новых элементов.
Choices.js предоставляет методы для программного управления значениями:
choices.setValue(['JavaScript', 'TypeScript']);
Добавление одного значения:
choices.setValue([{ value: 'React', label: 'React' }]);
Очистка всех значений:
choices.clearStore();
Удаление конкретного элемента:
choices.removeActiveItems();
Choices.js генерирует события, позволяющие отслеживать изменения состояния:
input.addEventListener('addItem', (event) => {
console.log(event.detail.value);
});
Основные события:
Срабатывает при добавлении нового значения.
Вызывается при удалении элемента.
Фиксирует любое изменение состояния поля.
Используется при навигации по списку через клавиатуру.
Клавиатурное управление является встроенной частью логики:
Поведение можно частично модифицировать через конфигурацию:
const choices = new Choices(input, {
removeItems: true,
removeItemButton: true,
searchEnabled: false
});
Choices.js не заменяет HTML-валидацию, но работает совместно с ней. Значения сохраняются внутри input как строка, разделённая delimiter:
<input type="text" id="tags-input" name="tags">
После заполнения:
JavaScript,TypeScript,React
Это позволяет использовать стандартные механизмы отправки формы без дополнительной сериализации.
Choices.js поддерживает обновление input в реальном времени:
choices.setValue(['Node.js', 'Express']);
choices.clearChoices();
Также возможно программное добавление элементов по мере выполнения логики приложения:
fetch('/api/tags')
.then(res => res.json())
.then(tags => {
choices.setValue(tags);
});
Повторное создание экземпляра на одном и том же элементе без уничтожения предыдущего приводит к конфликтам состояния. Перед повторной инициализацией используется:
choices.destroy();
Это возвращает input к исходному состоянию DOM-элемента.
Choices.js перехватывает события:
inputkeydownpasteи преобразует их в внутренние действия модели данных. Это позволяет унифицировать поведение независимо от браузера.
Особенно важно при работе с мобильными устройствами, где поведение клавиатуры может отличаться.
Комбинация параметров определяет характер взаимодействия:
searchEnabled превращает input в гибрид
поиска и вводаshouldSort влияет на порядок отображения значенийrenderChoiceLimit ограничивает количество отображаемых
элементов в спискеПример расширенной конфигурации:
const choices = new Choices(input, {
addItems: true,
duplicateItems: false,
delimiter: ',',
maxItemCount: 5,
removeItemButton: true,
editItems: true,
paste: true,
searchEnabled: true,
shouldSort: false
});
Такой набор формирует поведение, близкое к полноценному тег-редактору внутри текстового input.