Система событий в Awesomplete построена вокруг взаимодействия экземпляра автодополнения и DOM-элемента ввода. Основная идея заключается в том, что библиотека генерирует набор событий на разных этапах жизненного цикла подсказок: от открытия списка до финального выбора значения. Эти события позволяют встраивать дополнительную логику без модификации внутреннего кода библиотеки.
Каждый экземпляр Awesomplete связан с полем ввода и списком подсказок. При изменении состояния компонента происходят следующие ключевые этапы:
События генерируются как DOM CustomEvent и могут быть перехвачены
через стандартный addEventListener.
Важно учитывать, что события привязываются к элементу ввода, а не к экземпляру класса напрямую. Это влияет на архитектуру обработчиков в приложениях с динамически создаваемыми полями.
Базовый способ работы с событиями заключается в использовании стандартного механизма DOM:
const input = document.querySelector("#search");
const awesomplete = new Awesomplete(input, {
list: ["Apple", "Banana", "Cherry", "Date"]
});
input.addEventListener("awesomplete-open", function (event) {
console.log("Список открыт");
});
input.addEventListener("awesomplete-close", function (event) {
console.log("Список закрыт");
});
Каждое событие содержит объект event, который может
включать дополнительные данные в detail. Однако в
большинстве случаев основная логика строится на факте наступления
события.
awesomplete-open возникает в момент, когда список
подсказок становится видимым. Это событие полезно для:
Пример использования:
input.addEventListener("awesomplete-open", () => {
document.body.classList.add("autocomplete-active");
});
Состояние интерфейса часто связывается с этим событием для управления стилями, затемнением фона или блокировкой других элементов.
awesomplete-close вызывается при скрытии списка
подсказок. Закрытие может происходить по нескольким причинам:
Пример:
input.addEventListener("awesomplete-close", () => {
document.body.classList.remove("autocomplete-active");
});
В сложных интерфейсах это событие используется для очистки временных состояний и сброса вспомогательных индикаторов.
awesomplete-highlight срабатывает при изменении текущего
выделенного элемента в списке. Оно позволяет отслеживать навигацию
пользователя по подсказкам с помощью клавиатуры или мыши.
input.addEventListener("awesomplete-highlight", (event) => {
console.log("Выделен элемент:", event.text);
});
Типичная задача этого события — предварительный просмотр значения или отображение дополнительной информации о выбранной подсказке.
В некоторых интерфейсах используется механизм предпросмотра, где при изменении выделения обновляется отдельная область:
input.addEventListener("awesomplete-highlight", (event) => {
const preview = document.querySelector("#preview");
if (event.text) {
preview.textContent = event.text.label || event.text.value;
}
});
awesomplete-select возникает в момент, когда
пользователь инициирует выбор элемента, но до фактической подстановки
значения в поле ввода. Это важный этап, позволяющий отменить выбор или
модифицировать данные.
input.addEventListener("awesomplete-select", (event) => {
console.log("Выбран элемент:", event.text);
});
Объект event.text обычно содержит структуру вида:
{
label: "Apple",
value: "Apple"
}
На этом этапе возможно вмешательство в процесс, включая предотвращение выбора:
input.addEventListener("awesomplete-select", (event) => {
if (event.text.value === "Banana") {
event.preventDefault();
}
});
Подобный механизм используется для реализации ограничений на выбор или фильтрации значений в зависимости от внешних условий.
awesomplete-selectcomplete срабатывает после того, как
значение уже подставлено в поле ввода. Это финальная стадия обработки
выбора.
input.addEventListener("awesomplete-selectcomplete", (event) => {
console.log("Финальное значение:", input.value);
});
Данное событие используется для:
Важно учитывать, что в отличие от awesomplete-select,
здесь изменение значения уже завершено, и отменить его невозможно.
Обработчики событий могут добавляться динамически и удаляться при необходимости. Это особенно важно в SPA-приложениях, где элементы создаются и уничтожаются в процессе работы.
function onOpen() {
console.log("Открытие списка");
}
input.addEventListener("awesomplete-open", onOpen);
// Позднее удаление обработчика
input.removeEventListener("awesomplete-open", onOpen);
Такая практика предотвращает утечки памяти и неконтролируемое накопление обработчиков.
При наличии множества полей ввода с автодополнением используется делегирование событий через общий контейнер:
document.body.addEventListener("awesomplete-selectcomplete", (event) => {
if (event.target.matches(".search-input")) {
console.log("Выбор в поле поиска:", event.target.value);
}
});
Делегирование упрощает архитектуру при большом количестве динамических элементов.
Хотя Awesomplete предоставляет стандартный набор событий, возможно расширение логики через пользовательские свойства объекта события.
input.addEventListener("awesomplete-open", (event) => {
event.context = {
timestamp: Date.now(),
source: "search-bar"
};
});
Однако такая практика требует осторожности, так как не гарантируется сохранение данных между обработчиками в разных частях приложения.
События Awesomplete тесно связаны с действиями пользователя:
awesomplete-open;awesomplete-highlight;awesomplete-select;awesomplete-selectcomplete;awesomplete-close.Такая последовательность формирует предсказуемую модель взаимодействия, позволяющую синхронизировать UI без прямого доступа к внутренним механизмам библиотеки.
К одному событию может быть привязано несколько независимых обработчиков:
input.addEventListener("awesomplete-open", () => {
console.log("Логирование открытия");
});
input.addEventListener("awesomplete-open", () => {
document.querySelector("#hint").style.display = "block";
});
Порядок выполнения определяется порядком регистрации обработчиков.
В более сложных системах события Awesomplete становятся частью общей событийной шины приложения. Они используются как триггеры для:
При таком подходе Awesomplete рассматривается не как изолированный компонент, а как источник событий внутри более крупной системы пользовательского взаимодействия.