Библиотека Awesomplete предоставляет набор событий, позволяющих отслеживать весь жизненный цикл автодополнения: от ввода текста до выбора элемента и закрытия списка подсказок. Логирование этих событий превращает компонент в прозрачный инструмент, пригодный для отладки, аналитики поведения пользователей и построения расширенной бизнес-логики поверх стандартного UI.
Каждое событие в Awesomplete диспатчится на исходный input-элемент
через CustomEvent, что делает механизм интеграции событий
предсказуемым и совместимым с нативным DOM API.
Awesomplete генерирует события на уровне input-поля, к которому
привязан экземпляр автодополнения. Подписка осуществляется стандартным
способом через addEventListener.
Основные события:
awesomplete-open — список подсказок открытawesomplete-close — список закрытawesomplete-select — пользователь выбрал элемент (до
подстановки значения)awesomplete-selectcomplete — выбор завершён, значение
установлено в inputawesomplete-highlight — изменение активного
(подсвеченного) элементаinput — нативное событие ввода, часто используется в
связкеКаждое событие содержит объект event.detail, который
предоставляет контекст происходящего.
Логирование событий строится через единый обработчик, регистрируемый на input:
const input = document.querySelector("#search");
const awesomplete = new Awesomplete(input, {
list: ["Apple", "Apricot", "Banana", "Blueberry", "Cherry"]
});
function logEvent(name) {
return function (event) {
console.log(`[Awesomplete:${name}]`, event.detail);
};
}
input.addEventListener("awesomplete-open", logEvent("open"));
input.addEventListener("awesomplete-close", logEvent("close"));
input.addEventListener("awesomplete-select", logEvent("select"));
input.addEventListener("awesomplete-selectcomplete", logEvent("selectcomplete"));
input.addEventListener("awesomplete-highlight", logEvent("highlight"));
Такой подход формирует централизованную точку наблюдения, где каждый шаг взаимодействия фиксируется в консоли.
Содержимое event.detail зависит от конкретного события,
но обычно включает:
text — выбранный или подсвеченный элементvalue — финальное значение для inputitem — DOM-узел элемента спискаindex — позиция элемента в спискеoriginalEvent — нативное событие (клавиатура,
мышь)Пример анализа выбора:
input.addEventListener("awesomplete-selectcomplete", (event) => {
const { text, value } = event.detail;
console.log("Выбран текст:", text);
console.log("Установленное значение:", value);
});
Awesomplete можно рассматривать как конечный автомат, где события отражают переходы между состояниями:
Для трассировки состояния удобно вести журнал:
const stateLog = [];
function trace(state) {
return (event) => {
stateLog.push({
state,
time: Date.now(),
detail: event.detail
});
};
}
input.addEventListener("awesomplete-open", trace("open"));
input.addEventListener("awesomplete-close", trace("close"));
input.addEventListener("awesomplete-highlight", trace("highlight"));
input.addEventListener("awesomplete-selectcomplete", trace("selectcomplete"));
Такой лог позволяет восстановить поведение пользователя постфактум, включая последовательность навигации по списку.
При интеграции в крупные системы логирование событий автодополнения обычно разделяется на уровни:
Реализация уровневого логирования:
const Logger = {
debug: (msg, data) => console.debug(msg, data),
info: (msg, data) => console.info(msg, data),
warn: (msg, data) => console.warn(msg, data),
error: (msg, data) => console.error(msg, data)
};
input.addEventListener("awesomplete-open", (e) => {
Logger.debug("dropdown opened", e.detail);
});
input.addEventListener("awesomplete-selectcomplete", (e) => {
Logger.info("value selected", e.detail);
});
События Awesomplete часто используются для отправки аналитических сигналов в системы трекинга.
Типовые метрики:
Пример отправки событий в абстрактный трекер:
function track(eventName, payload) {
analytics.send(eventName, payload);
}
input.addEventListener("awesomplete-open", () => {
track("autocomplete_open", { field: "search" });
});
input.addEventListener("awesomplete-selectcomplete", (e) => {
track("autocomplete_select", {
value: e.detail.value
});
});
Awesomplete передаёт исходное событие в originalEvent,
что позволяет различать источник действия.
input.addEventListener("awesomplete-selectcomplete", (event) => {
const origin = event.detail.originalEvent;
const method = origin && origin.type === "keydown"
? "keyboard"
: "mouse";
console.log("Метод выбора:", method);
});
Это особенно важно для UX-аналитики, где поведение клавиатурных пользователей отличается от мышиных сценариев.
Вместо множественных подписок возможно создание универсального слушателя:
const events = [
"awesomplete-open",
"awesomplete-close",
"awesomplete-select",
"awesomplete-selectcomplete",
"awesomplete-highlight"
];
events.forEach(eventName => {
input.addEventListener(eventName, (event) => {
console.log(eventName, event.detail);
});
});
Такой подход снижает вероятность пропуска новых событий при расширении логики.
Для системного подхода применяется декоратор экземпляра:
function createLoggedAwesomplete(input, config) {
const instance = new Awesomplete(input, config);
const events = [
"awesomplete-open",
"awesomplete-close",
"awesomplete-select",
"awesomplete-selectcomplete",
"awesomplete-highlight"
];
events.forEach(name => {
input.addEventListener(name, (event) => {
console.log(`[AWSP:${name}]`, event.detail);
});
});
return instance;
}
Такой слой позволяет внедрять логирование без изменения остального кода приложения.
Несмотря на простоту Awesomplete, ошибки часто возникают на уровне данных:
Для диагностики полезно отслеживать состояние списка перед открытием:
input.addEventListener("awesomplete-open", (event) => {
const instance = event.target.awesomplete;
if (!instance.list || instance.list.length === 0) {
console.warn("Awesomplete открыт без данных");
}
});
Избыточное логирование может влиять на производительность, особенно
при частых событиях highlight и input.
Оптимизация включает:
Пример debounce:
function debounce(fn, delay) {
let t;
return (...args) => {
clearTimeout(t);
t = setTimeout(() => fn(...args), delay);
};
}
input.addEventListener("awesomplete-highlight",
debounce((e) => {
console.log("highlight", e.detail);
}, 100)
);
Для долговременного хранения событий формируется единый формат записи:
function createLogEntry(type, detail) {
return {
type,
timestamp: performance.now(),
payload: detail
};
}
И применение:
input.addEventListener("awesomplete-selectcomplete", (e) => {
const entry = createLogEntry("selectcomplete", e.detail);
logs.push(entry);
});
Такой журнал становится основой для последующего анализа поведения автодополнения в интерфейсе.