Choices.js — библиотека для улучшения стандартных HTML-элементов
<select> и <input>. Она
предоставляет расширенные возможности выбора, поиска, фильтрации,
мультиселекта, работы с тегами и динамическими данными без необходимости
создавать интерфейс с нуля.
Основная задача библиотеки заключается в модернизации пользовательского ввода при сохранении совместимости со стандартной HTML-разметкой. Choices.js не заменяет форму полностью, а расширяет её возможности, сохраняя нативное поведение браузера и совместимость с серверной обработкой данных.
Стандартный HTML-элемент <select> обладает
ограниченным набором возможностей:
Choices.js решает эти проблемы и предоставляет:
Пример базового подключения:
<sel ect id="countries">
<option value="kz">Казахстан</option>
<option value="ru">Россия</option>
<option value="uz">Узбекистан</option>
</select>
const element = document.getElementById('countries');
const choices = new Choices(element);
После инициализации стандартный <select>
преобразуется в интерактивный компонент с расширенным функционалом.
Одной из наиболее востребованных возможностей Choices.js является встроенный поиск.
При наличии большого количества элементов пользователь может быстро находить нужные значения без прокрутки длинного списка.
Пример:
new Choices('#countries', {
searchEnabled: true
});
Поиск поддерживает:
Пример ограничения результатов:
new Choices('#countries', {
searchResultLimit: 5
});
Choices.js значительно улучшает работу с
multiple select.
Стандартный HTML-мультиселект неудобен в использовании и имеет устаревший внешний вид. Choices.js преобразует его в современный интерфейс с тегами и кнопками удаления.
Пример:
<sel ect id="skills" multiple>
<option>JavaScript</option>
<option>TypeScript</option>
<option>Node.js</option>
<option>React</option>
</select>
new Choices('#skills', {
removeItemButton: true
});
Choices.js позволяет превращать обычное текстовое поле в систему тегов.
Это особенно полезно для:
Пример:
<input type="text" id="tags">
new Choices('#tags', {
delimiter: ',',
editItems: true,
removeItemButton: true
});
Библиотека автоматически:
Choices.js может принимать значения, которых нет в исходном списке.
Пример:
new Choices('#tags', {
addItems: true,
addChoices: true
});
Это полезно для:
Библиотека предоставляет большое количество параметров конфигурации.
Можно изменять:
Пример:
new Choices('#countries', {
placeholder: true,
placeholderValue: 'Выберите страну',
noResultsText: 'Ничего не найдено'
});
Choices.js не навязывает конкретный дизайн и легко интегрируется с:
Библиотека использует обычные CSS-классы, которые можно переопределять.
Пример:
.choices__inner {
border-radius: 10px;
border: 2px solid #444;
}
.choices__list--dropdown {
background: #f5f5f5;
}
Choices.js поддерживает программное управление списками.
Можно:
choices.setChoices([
{ value: 'js', label: 'JavaScript' },
{ value: 'ts', label: 'TypeScript' },
{ value: 'vue', label: 'Vue' }
], 'value', 'label', true);
fetch('/api/tags')
.then(response => response.json())
.then(data => {
choices.setChoices(data, 'id', 'name', true);
});
Библиотека поддерживает <optgroup> и логическое
разделение данных.
Пример:
<select id="frameworks">
<optgroup label="Frontend">
<option>React</option>
<option>Vue</option>
</optgroup>
<optgroup label="Backend">
<option>Express</option>
<option>NestJS</option>
</optgroup>
</select>
После инициализации группы сохраняются и отображаются в интерфейсе.
Choices.js оптимизирована для работы с большими списками данных.
Преимущества:
Библиотека может работать со списками из сотен и тысяч элементов без критического ухудшения производительности.
Одно из ключевых преимуществ библиотеки — независимость от сторонних фреймворков.
Choices.js не требует:
Это делает библиотеку:
Несмотря на отсутствие зависимостей, Choices.js хорошо интегрируется с современными технологиями:
import { useEffect, useRef } fr om 'react';
import Choices fr om 'choices.js';
function Select() {
const ref = useRef(null);
useEffect(() => {
const choices = new Choices(ref.current);
return () => {
choices.destroy();
};
}, []);
return (
<select ref={ref}>
<option>JavaScript</option>
<option>TypeScript</option>
</select>
);
}
Choices.js предоставляет набор событий для отслеживания действий пользователя.
Пример:
element.addEventListener('addItem', event => {
console.log(event.detail.value);
});
| Событие | Назначение |
|---|---|
| addItem | Добавление элемента |
| removeItem | Удаление элемента |
| search | Выполнение поиска |
| showDropdown | Открытие списка |
| hideDropdown | Закрытие списка |
| change | Изменение значения |
Библиотека предоставляет API для взаимодействия с компонентом.
choices.clearStore();
choices.removeActiveItems();
const values = choices.getValue();
console.log(values);
Choices.js учитывает требования доступности интерфейсов.
Поддерживаются:
Поддерживаются:
Это особенно важно для корпоративных и государственных интерфейсов, где accessibility является обязательным требованием.
Choices.js сохраняет оригинальный HTML-элемент.
Если JavaScript отключён:
<select> останется доступным;Такой подход улучшает:
Библиотека обладает сравнительно небольшим размером по сравнению с тяжёлыми UI-решениями.
Преимущества:
Choices.js содержит десятки параметров настройки.
Наиболее используемые:
| Параметр | Назначение |
|---|---|
| searchEnabled | Включение поиска |
| removeItemButton | Кнопка удаления |
| maxItemCount | Максимум элементов |
| duplicateItemsAllowed | Разрешение дублей |
| placeholderValue | Placeholder |
| addItems | Добавление значений |
| addChoices | Добавление новых вариантов |
| shouldSort | Сортировка |
| searchFields | Поля поиска |
| itemSelectText | Текст выбора |
Choices.js может автоматически сортировать элементы.
Пример:
new Choices('#countries', {
shouldSort: true
});
Для пользовательской сортировки:
new Choices('#countries', {
sorter: (a, b) => {
return a.label.length - b.label.length;
}
});
Для мультиселектов можно ограничивать число выбранных значений.
new Choices('#skills', {
maxItemCount: 3
});
После достижения лимита библиотека блокирует дальнейший выбор.
Choices.js позволяет переопределять HTML-шаблоны компонентов.
Это даёт возможность:
Пример кастомного шаблона:
new Choices('#users', {
callbackOnCreateTemplates(template) {
return {
item: ({ classNames }, data) => {
return template(`
<div class="${classNames.item}">
<strong>${data.label}</strong>
</div>
`);
}
};
}
});
Choices.js сохраняет совместимость с:
Это особенно важно при интеграции в существующие формы.
Библиотека корректно работает на:
Поддерживаются:
Минимальное подключение включает:
<link rel="stylesheet" href="choices.min.css">
<script src="choices.min.js"></script>
После этого библиотека готова к использованию.
Благодаря простому API внедрение Choices.js возможно даже в уже существующие legacy-проекты без серьёзной переработки архитектуры интерфейса.