В библиотеке Choices.js механизм ограничения ввода строится вокруг нескольких уровней контроля: параметров инициализации, фильтрации вводимых значений, перехвата событий добавления и управления состоянием выбранных элементов. В совокупности это позволяет формировать строгие правила формирования списка значений в поле выбора.
Основная идея заключается в том, что ввод пользователя не принимается напрямую, а проходит цепочку проверок:
Одним из ключевых параметров является maxItemCount,
который задаёт верхнюю границу количества выбранных значений.
const choices = new Choices('#example', {
maxItemCount: 5
});
При достижении лимита:
Типичный сценарий применения — формы с фиксированным числом тегов, категорий или участников.
Дополнительное поведение часто комбинируется с:
removeItemButton: true
что позволяет пользователю освобождать место для новых значений, не нарушая ограничение.
Для контроля длины текста используется параметр
maxItemTextLength. Он ограничивает количество символов в
каждом элементе.
const choices = new Choices('#example', {
maxItemTextLength: 20
});
Поведение при превышении:
Для более гибкого контроля иногда используется кастомная фильтрация:
const choices = new Choices('#example', {
addItemFilter: function (value) {
return value.length <= 20;
}
});
Параметр addItemFilter является одним из наиболее мощных
инструментов ограничения ввода. Он позволяет полностью переопределить
логику допустимости нового элемента.
const choices = new Choices('#example', {
addItemFilter: function (value) {
const regex = /^[a-zA-Z0-9_-]+$/;
return regex.test(value);
}
});
Возможности фильтра:
Пример комбинированной логики:
addItemFilter: function (value) {
if (value.length < 3) return false;
if (value.length > 15) return false;
return /^[a-z0-9]+$/i.test(value);
}
Такой подход полностью заменяет стандартные ограничения и позволяет строить доменную валидацию прямо в компоненте.
Контроль уникальности реализуется через параметр
duplicateItemsAllowed.
const choices = new Choices('#example', {
duplicateItemsAllowed: false
});
При отключённой возможности дублирования:
Дополнительно можно усиливать контроль через
addItemFilter:
const existing = new Set();
const choices = new Choices('#example', {
addItemFilter: function (value) {
if (existing.has(value.toLowerCase())) {
return false;
}
existing.add(value.toLowerCase());
return true;
}
});
Хотя это не прямое ограничение ввода, параметр
searchResultLimit влияет на то, сколько вариантов
пользователь может выбрать из доступного списка.
const choices = new Choices('#example', {
searchResultLimit: 10
});
Это ограничение снижает когнитивную нагрузку и косвенно влияет на ввод, особенно в сценариях автодополнения.
Параметр addItems определяет, можно ли пользователю
создавать новые значения.
const choices = new Choices('#example', {
addItems: true
});
При false:
Это один из самых жёстких способов ограничения ввода.
Choices.js предоставляет событийную модель, которая позволяет реализовать внешнюю валидацию перед добавлением значения.
Основное событие:
document.querySelector('#example').addEventListener('addItem', function (event) {
const value = event.detail.value;
});
На практике чаще используется событие addItem совместно
с удалением некорректных значений:
const element = document.querySelector('#example');
const choices = new Choices(element);
element.addEventListener('addItem', function (event) {
if (event.detail.value.includes('bad')) {
choices.removeActiveItemsByValue(event.detail.value);
}
});
Это позволяет реализовать пост-валидацию, когда ограничение не блокирует ввод, но корректирует состояние.
Формат вводимых значений часто контролируется через регулярные выражения или внешние правила, но также может быть связан с типом данных.
Примеры типичных ограничений:
addItemFilter: function (value) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
}
addItemFilter: function (value) {
return /^\d+$/.test(value);
}
addItemFilter: function (value) {
return !/\s/.test(value);
}
Хотя Choices.js не всегда напрямую ограничивает ввод в текстовом поле на уровне DOM, можно контролировать ввод через обработку событий клавиатуры.
const input = document.querySelector('.choices__input');
input.addEventListener('input', function () {
if (this.value.length > 10) {
this.value = this.value.slice(0, 10);
}
});
Такой подход используется для жёсткого контроля UX, когда визуальная часть должна соответствовать бизнес-логике без ожидания подтверждения добавления элемента.
Ограничения могут распространяться и на вставку текста:
const input = document.querySelector('.choices__input');
input.addEventListener('paste', function (e) {
const text = (e.clipboardData || window.clipboardData).getData('text');
if (text.length > 20) {
e.preventDefault();
}
});
В связке с addItemFilter это формирует двойной слой
защиты:
В реальных сценариях ограничения редко используются изолированно. Чаще формируется набор правил:
const choices = new Choices('#example', {
maxItemCount: 5,
maxItemTextLength: 12,
duplicateItemsAllowed: false,
addItems: true,
addItemFilter: function (value) {
return /^[a-z0-9_-]+$/i.test(value);
}
});
Логика такого набора:
При одновременном использовании нескольких механизмов важно учитывать порядок срабатывания:
addItems)maxItemCount)duplicateItemsAllowed)addItemFilterЛюбое из ограничений может остановить процесс на своём уровне, не доходя до следующего шага.
При срабатывании ограничений Choices.js не выбрасывает критические ошибки, а изменяет поведение интерфейса:
Это делает систему устойчивой к пользовательским ошибкам и позволяет управлять логикой без разрушения UI-состояния.