В библиотеке Choices.js управление доступностью элементов списка строится на нескольких уровнях: исходные HTML-атрибуты, конфигурация при инициализации, а также программное API. Отключение опций (choices) означает запрет их выбора пользователем при сохранении их визуального отображения в выпадающем списке.
Ключевой принцип: disabled-состояние может быть задано как на уровне DOM, так и на уровне JavaScript-структуры данных Choices.js.
Самый базовый способ — использование стандартного HTML-атрибута
disabled внутри <option>:
<select id="example">
<option value="1">Активный пункт</option>
<option value="2" disabled>Недоступный пункт</option>
<option value="3">Ещё один активный</option>
</select>
После инициализации Choices.js такие элементы автоматически интерпретируются как недоступные для выбора. Они:
При использовании JavaScript-инициализации список может задаваться
вручную через параметр choices. В этом случае отключение
элемента выполняется через свойство disabled.
const instance = new Choices('#example', {
choices: [
{ value: '1', label: 'Активный пункт' },
{ value: '2', label: 'Отключённый пункт', disabled: true },
{ value: '3', label: 'Активный пункт 2' }
]
});
Каждый объект choice может содержать:
value — значениеlabel — отображаемый текстdisabled: true — флаг недоступностиChoices.js не удаляет disabled-элементы из DOM-списка, а только изменяет их поведение:
Это важно для сохранения контекста списка, особенно при больших наборах данных.
При динамической загрузке данных используется метод
setChoices, который также поддерживает параметр
disabled.
instance.setChoices([
{ value: '10', label: 'Доступно' },
{ value: '11', label: 'Недоступно', disabled: true }
], 'value', 'label', true);
Последний параметр (true) указывает на замену текущего
списка.
Типичная ошибка — попытка обновить список без учёта флага
disabled, что приводит к потере состояния доступности.
Choices.js позволяет изменять доступность элементов после инициализации, но напрямую API для “toggle disabled” ограничен. Поэтому применяются обходные стратегии:
const updated = instance._store.choices.map(item => {
if (item.value === '2') {
return { ...item, disabled: true };
}
return item;
});
instance.setChoices(updated, 'value', 'label', true);
Этот подход используется при сложной бизнес-логике, где состояние опций зависит от внешних факторов.
Choices.js поддерживает мультивыбор, и в этом режиме важно различать:
Чтобы запретить повторное добавление или ограничить выбор, используется логика отключения после выбора:
instance.passedElement.element.addEventListener('addItem', (event) => {
const value = event.detail.value;
const updated = instance._store.choices.map(choice => {
if (choice.value === value) {
return { ...choice, disabled: true };
}
return choice;
});
instance.setChoices(updated, 'value', 'label', true);
});
Такой подход часто применяется для:
Поиск в Choices.js (searchEnabled) учитывает состояние
опций:
choice.disabledПример логики фильтрации:
const filtered = choices.filter(choice => {
return !choice.disabled && choice.label.includes(query);
});
UI-состояние disabled в Choices.js выражается через:
При кастомизации стилей важно учитывать, что библиотека не удаляет элементы из DOM, а только меняет их интерактивность.
Пример переопределения:
.choices__item--disabled {
opacity: 0.4;
pointer-events: none;
}
В мультиселекте часто используется комбинация:
maxItemCountremoveItemButtondisabled choicesПример конфигурации:
new Choices('#example', {
maxItemCount: 3,
removeItemButton: true
});
При достижении лимита элементы могут программно помечаться как disabled, чтобы визуально сигнализировать невозможность дальнейшего выбора.
Choices.js поддерживает группы (optgroup), и отключение
может применяться на двух уровнях:
HTML-пример:
<select>
<optgroup label="Группа 1" disabled>
<option value="1">A</option>
<option value="2">B</option>
</optgroup>
</select>
В этом случае все дочерние элементы наследуют состояние недоступности.
В сложных интерфейсах отключение опций часто зависит от других селектов. Пример каскадной логики:
countrySelect.passedElement.element.addEventListener('change', (event) => {
const country = event.detail.value;
fetchCities(country).then(cities => {
citySelect.setChoices(
cities.map(city => ({
value: city.id,
label: city.name,
disabled: !city.available
})),
'value',
'label',
true
);
});
});
При работе с отключёнными опциями важно учитывать архитектурные особенности Choices.js:
disabled требует пересборки списка через
setChoicesПри включённых настройках:
shouldSortsearchEnabledfuseOptionsdisabled-элементы могут:
Пример защиты от попадания disabled в сортировку:
const sorted = choices
.filter(c => !c.disabled)
.sort((a, b) => a.label.localeCompare(b.label));
Отключение опций часто используется как часть валидации формы:
Типовой подход:
setChoicesВ режиме мультиселекта удаление элемента
(removeItemButton) не обязательно снимает
disabled-состояние. Это зависит от логики приложения:
Пример снятия блокировки:
instance.passedElement.element.addEventListener('removeItem', (event) => {
const value = event.detail.value;
const updated = instance._store.choices.map(choice => {
if (choice.value === value) {
return { ...choice, disabled: false };
}
return choice;
});
instance.setChoices(updated, 'value', 'label', true);
});