Библиотека Choices.js предоставляет несколько уровней управления
выбранными значениями: от встроенного UI-удаления до программного API и
событийной модели. Удаление выбранных элементов является частью
внутреннего состояния инстанса и синхронизируется как с DOM, так и с
исходным <select> или виртуальным списком опций.
Архитектура удаления строится вокруг трёх основных механизмов:
removeItemButtonОдним из ключевых способов удаления выбранных элементов является включение встроенной кнопки удаления у каждого выбранного тега.
const choices = new Choices('#select', {
removeItemButton: true
});
После активации данной опции каждый выбранный элемент получает кнопку
удаления (×), при нажатии на которую происходит:
<select>;removeItem.Поведение кнопки полностью управляется библиотекой и не требует дополнительного кода.
Choices.js предоставляет метод removeItemByValue,
предназначенный для удаления элемента по его значению.
choices.removeItemByValue('value_1');
При вызове метода происходит:
<select>.Особенности поведения:
Внутренне Choices.js оперирует объектами выбора, содержащими:
valuelabelselecteddisabledНекоторые версии API позволяют работать через объект:
choices.removeActiveItems();
Этот метод удаляет все активные выбранные элементы.
Полное сбрасывание выбора осуществляется через:
choices.removeActiveItems();
Поведение метода:
<select>;Альтернативный подход через состояние:
choices.setChoiceByValue([]);
setChoiceByValueМетод setChoiceByValue может использоваться для
переопределения текущего выбора.
choices.setChoiceByValue(['a', 'b']);
Передача пустого массива фактически эквивалентна очистке:
choices.setChoiceByValue([]);
Этот подход полезен при:
Choices.js предоставляет событийную модель, позволяющую реагировать на удаление элементов.
removeItemconst element = document.querySelector('#select');
element.addEventListener('removeItem', function(event) {
console.log(event.detail);
});
Содержимое event.detail:
value — удалённое значение;label — отображаемый текст;id — внутренний идентификатор;choice — объект выбора.Событие вызывается при:
removeItemByValue;changeЛюбое удаление также вызывает стандартное событие
change, что обеспечивает совместимость с нативными
формами.
element.addEventListener('change', function(event) {
console.log('Изменение состояния выбора');
});
Удаление невозможно для элементов, которые:
disabled;Пример:
choices.setChoices([
{ value: 'a', label: 'A', disabled: true }
]);
Такой элемент:
В режиме одиночного выбора поведение отличается:
removeItemByValue очищает текущее значение.Пример:
choices.setChoiceByValue('value_1');
choices.removeItemByValue('value_1');
После выполнения состояние становится пустым.
В multi-select режиме каждый элемент независим:
Пример удаления:
choices.removeItemByValue('value_2');
После выполнения:
Кнопка удаления может быть стилизована или заменена через CSS.
.choices__button {
background: transparent;
border: none;
cursor: pointer;
}
Также можно полностью отключить стандартное удаление:
const choices = new Choices('#select', {
removeItemButton: false
});
И реализовать кастомную логику:
document.addEventListener('click', (e) => {
if (e.target.classList.contains('custom-remove')) {
choices.removeItemByValue(e.target.dataset.value);
}
});
<select>Choices.js всегда поддерживает синхронизацию состояния:
option.selected = false;<select> остаётся источником истины для
формы;Пример поведения:
<select id="select" multiple>
<option value="1">One</option>
<option value="2">Two</option>
</select>
После удаления значения:
<option> теряет атрибут
selected;Удаление можно частично контролировать через перехват событий.
element.addEventListener('removeItem', function(event) {
if (event.detail.value === 'protected') {
event.preventDefault();
}
});
Хотя не все версии Choices.js поддерживают полноценный
preventDefault для этого события, часто применяется
обходной путь:
element.addEventListener('removeItem', function(event) {
if (event.detail.value === 'protected') {
setTimeout(() => {
choices.setChoiceByValue('protected');
}, 0);
}
});
Расширенные сценарии требуют удаления по условию:
const values = choices.getValue(true);
values.forEach(value => {
if (value.startsWith('temp_')) {
choices.removeItemByValue(value);
}
});
Такая схема применяется при:
При большом количестве выбранных элементов:
removeItemByValue могут быть
дорогими;removeActiveItems для
полной очистки;Оптимизированный подход:
choices.removeActiveItems();
choices.setChoiceByValue(filteredValues);
При работе с API часто возникает необходимость синхронного удаления:
async function deleteAndSync(value) {
await fetch(`/api/delete/${value}`, { method: 'DELETE' });
choices.removeItemByValue(value);
}
В этом случае Choices.js выступает только как UI-слой, а источник истины находится на сервере.
При сбросе формы (<form>.reset()):
<select>;Для контроля используется:
choices.clearStore();
или повторная инициализация инстанса.