Поведение автодополнения в Awesomplete формируется не отдельными разрозненными событиями, а последовательностями состояний, которые образуют цепочки: от ввода данных до отображения списка, навигации, выбора и финального применения значения. Эти цепочки важны для контроля интерфейса, синхронизации внешней логики и предотвращения конфликтов между обработчиками.
Каждое пользовательское действие в Awesomplete проходит через несколько стадий:
Каждая стадия сопровождается событиями, которые можно перехватывать
через addEventListener.
Цепочка начинается с изменения значения поля ввода. Awesomplete
реагирует на стандартное событие input, после чего
запускается пересчет списка.
input.addEventListener("input", function () {
console.log("Ввод изменился");
});
На этом этапе формируется первичная выборка данных, но список ещё не отображается.
После ввода активируется внутренняя логика фильтрации. Хотя прямого
публичного события для этого шага нет, он логически предшествует
awesomplete-open.
Фильтрация может зависеть от:
minCharsfilter (кастомная функция)item (рендер элемента)sortИзменение этих параметров влияет на продолжение цепочки, особенно на момент открытия списка.
Событие awesomplete-open фиксирует момент, когда список
становится видимым.
input.addEventListener("awesomplete-open", function () {
console.log("Список открыт");
});
preventDefault() в
некоторых реализациях расширенийПосле открытия начинается активная часть цепочки — перемещение по списку.
Срабатывает при смене активного элемента списка.
input.addEventListener("awesomplete-highlight", function (e) {
console.log("Выделен элемент:", e.text);
});
Характеристики:
Срабатывает до фактического применения значения.
input.addEventListener("awesomplete-select", function (e) {
console.log("Выбор элемента:", e.text);
});
Особенность этого события — возможность вмешательства в процесс выбора. На этом этапе можно:
Пример блокировки выбора:
input.addEventListener("awesomplete-select", function (e) {
if (e.text === "запрещено") {
e.preventDefault();
}
});
Финальная стадия выбора, когда значение уже установлено в input.
input.addEventListener("awesomplete-selectcomplete", function (e) {
console.log("Значение установлено:", input.value);
});
Этот этап используется для:
Завершает цепочку событий.
input.addEventListener("awesomplete-close", function () {
console.log("Список закрыт");
});
Причины закрытия:
При стандартном вводе последовательность выглядит следующим образом:
inputawesomplete-openawesomplete-highlight (0-й элемент)awesomplete-highlightawesomplete-selectawesomplete-selectcompleteawesomplete-closeЦепочки событий не всегда линейны. Возможны ветвления:
Если в awesomplete-select вызывается
preventDefault(), цепочка обрывается:
select → отмена → отсутствует
selectcompleteЕсли фильтрация не возвращает совпадений:
inputopenhighlightcloseAwesomplete допускает повторные циклы внутри одной сессии:
Это требует осторожности при работе с состоянием:
let lock = false;
input.addEventListener("awesomplete-selectcomplete", function () {
lock = true;
setTimeout(() => lock = false, 200);
});
input.addEventListener("input", function () {
if (lock) return;
});
Цепочки событий часто используются совместно с несколькими обработчиками:
Порядок регистрации обработчиков влияет на итоговое поведение:
input.addEventListener("awesomplete-select", handlerA);
input.addEventListener("awesomplete-select", handlerB);
Сначала выполнится handlerA, затем
handlerB, что может изменить итоговую цепочку логики.
Типичные конфликты возникают при:
input.value в select и
одновременном использовании selectcomplete.evaluate() внутри событийПример проблемной схемы:
input.addEventListener("awesomplete-selectcomplete", function () {
awesomplete.evaluate(); // может перезапустить цепочку
});
Для контроля последовательностей используется явное разделение логики:
select — перехват решенияselectcomplete — побочные эффектыopen — UI-реакцииclose — очистка состоянияТакое разделение предотвращает смешивание этапов и разрыв цепочки логики.
Хотя Awesomplete работает синхронно, внешняя логика часто добавляет асинхронность:
input.addEventListener("awesomplete-select", async function (e) {
const result = await fetch("/api/check?q=" + e.text);
if (!result.ok) e.preventDefault();
});
В таких случаях цепочка событий становится условной и зависит от завершения промисов, что требует блокировки дальнейших шагов до получения результата.
Одни и те же цепочки могут переиспользоваться в разных сценариях:
Разница заключается только в обработчиках, а сама структура событий остаётся одинаковой, что делает Awesomplete предсказуемым в построении UI-логики.