Choices.js реализует систему событий, ориентированную на управление
жизненным циклом выпадающего списка, и два ключевых события, связанных с
отображением интерфейса выбора, — showDropdown и
hideDropdown — относятся к уровню управления визуальным
состоянием компонента. Эти события возникают в момент открытия и
закрытия выпадающего списка и позволяют синхронизировать внешний код с
внутренними изменениями состояния компонента.
Событие showDropdown срабатывает в момент, когда
выпадающий список становится видимым для пользователя. Это не просто
визуальный эффект, а переход компонента в активное состояние
взаимодействия.
При вызове внутреннего метода открытия списка библиотека:
После завершения этих операций диспатчится событие
showDropdown.
Событие доступно через стандартный механизм событий экземпляра
Choices:
const element = document.querySelector('.js-choice');
const choices = new Choices(element);
choices.passedElement.element.addEventListener(
'showDropdown',
function () {
console.log('Dropdown открыт');
},
false
);
Событие используется для управления интерфейсом и интеграции с внешними системами:
Пример блокировки прокрутки:
choices.passedElement.element.addEventListener('showDropdown', () => {
document.body.style.overflow = 'hidden';
});
showDropdown может вызываться:
В последнем случае событие также генерируется, что позволяет унифицировать реакцию внешнего кода независимо от источника действия.
Событие hideDropdown возникает при закрытии выпадающего
списка. Оно является зеркальным по отношению к showDropdown
и фиксирует момент возврата компонента в неактивное состояние.
Закрытие списка происходит в нескольких сценариях:
После завершения внутренних операций очистки и обновления интерфейса
генерируется hideDropdown.
const element = document.querySelector('.js-choice');
const choices = new Choices(element);
choices.passedElement.element.addEventListener(
'hideDropdown',
function () {
console.log('Dropdown закрыт');
},
false
);
Событие hideDropdown применяется для синхронизации
внешнего состояния приложения:
Пример восстановления прокрутки:
choices.passedElement.element.addEventListener('hideDropdown', () => {
document.body.style.overflow = '';
});
Важно учитывать, что hideDropdown может вызываться как
следствие выбора значения, однако само событие выбора
(addItem) и событие закрытия списка не являются идентичными
по смыслу.
addItem фиксирует изменение данныхhideDropdown фиксирует изменение визуального
состоянияЭти события часто используются совместно, но обрабатывают разные уровни логики.
При типичном взаимодействии последовательность выглядит следующим образом:
showDropdownhideDropdownВ случае выбора элемента дополнительно возникает цепочка событий
изменения данных, но визуальный цикл всегда завершается
hideDropdown.
При использовании программных методов управления списком важно
учитывать, что события showDropdown и
hideDropdown генерируются даже при отсутствии
пользовательского взаимодействия.
choices.showDropdown();
choices.hideDropdown();
При таких вызовах:
showDropdown срабатывает после завершения рендера
спискаhideDropdown срабатывает после очистки DOM-состояния
dropdownЭто позволяет строить детерминированную логику интерфейса, основанную исключительно на событиях, а не на проверке состояния вручную.
В приложениях с большим количеством интерактивных компонентов эти события часто применяются для координации поведения нескольких слоёв интерфейса:
Пример закрытия других dropdown при открытии текущего:
choices.passedElement.element.addEventListener('showDropdown', () => {
document.querySelectorAll('.js-choice').forEach((el) => {
if (el !== choices.passedElement.element) {
el.choices.hideDropdown();
}
});
});
Если в конфигурации включён поиск, showDropdown
дополнительно сопровождается инициализацией фильтрационного механизма.
При этом hideDropdown выполняет очистку временного
состояния поиска.
Это означает:
При быстром открытии и закрытии списка события могут вызываться в тесной последовательности. В таких случаях:
showDropdown → hideDropdownДля стабилизации состояния часто используют флаги:
let isOpen = false;
choices.passedElement.element.addEventListener('showDropdown', () => {
isOpen = true;
});
choices.passedElement.element.addEventListener('hideDropdown', () => {
isOpen = false;
});
CSS-логика часто строится вокруг состояния dropdown, которое косвенно отражается через эти события:
showDropdownhideDropdownПример:
choices.passedElement.element.addEventListener('showDropdown', (event) => {
event.target.classList.add('is-open');
});
choices.passedElement.element.addEventListener('hideDropdown', (event) => {
event.target.classList.remove('is-open');
});
showDropdown и hideDropdown формируют
фундаментальный слой реактивности компонента. Они отделяют:
Такое разделение позволяет строить расширяемую архитектуру, где внешний код не зависит от внутренней реализации рендеринга, а реагирует исключительно на изменения состояния отображения.