Класс Awesomplete представляет собой конструктор, реализующий
механизм автодополнения для текстовых полей ввода. Архитектура построена
вокруг расширяемого экземпляра, который связывается с DOM-элементом
<input> и динамически управляет списком подсказок, их
фильтрацией, отображением и выбором.
Инициализация экземпляра выполняется через
new Awesomplete(input, options).
Сигнатура:
new Awesomplete(input, options)
input DOM-элемент <input>, к
которому привязывается логика автодополнения. Элемент становится
источником пользовательского ввода и точкой взаимодействия с
подсказками.
options — объект конфигурации:
list — массив значений или функция, возвращающая список
подсказок.minChars — минимальное количество символов для
активации списка (по умолчанию 1).maxItems — максимальное число отображаемых
элементов.autoFirst — автоматический выбор первого элемента
списка.filter — функция фильтрации элементов.sort — функция сортировки результатов.item — шаблон генерации DOM-элемента списка.replace — функция подстановки выбранного значения в
input.data — функция извлечения значения из объекта
списка.Экземпляр Awesomplete содержит набор ключевых свойств, обеспечивающих работу компонента:
Ссылка на связанный DOM-элемент. Используется для чтения и записи
значения, а также для отслеживания событий input,
keydown, blur.
DOM-элемент списка подсказок (<ul>), создаваемый
автоматически. В него помещаются элементы <li>.
Индекс текущего выбранного элемента списка. Значение -1
означает отсутствие активного выбора.
Текущий индекс навигации по списку. Используется при перемещении стрелками клавиатуры.
Булево состояние отображения списка. Определяет, открыт ли выпадающий блок подсказок.
Открывает список подсказок и делает его видимым. При вызове
выполняется построение DOM-структуры элементов на основе текущего списка
list.
awesomplete.open();
Поведение:
ulopened = trueЗакрывает список и скрывает его из DOM-видимости.
awesomplete.close();
При выполнении:
opened устанавливается в falseПеремещает активный индекс на следующий элемент списка.
awesomplete.next();
Если достигнут конец списка, происходит циклический переход к началу.
Перемещает активный индекс на предыдущий элемент.
awesomplete.previous();
При достижении начала списка происходит переход к последнему элементу.
Устанавливает активный индекс на конкретное значение.
awesomplete.goto(2);
Используется для программного управления навигацией.
Выбирает текущий активный элемент и применяет его к input.
awesomplete.select();
Алгоритм:
data()replace()input.valueКлючевой метод пересчёта и отображения списка.
awesomplete.evaluate();
Функциональность:
listmaxItemsopenedAwesomplete не использует сложную систему событий, но опирается на стандартные DOM-события и внутренние колбэки.
Основное событие — input:
evaluate()minCharsОбрабатываются следующие клавиши:
При потере фокуса список закрывается, если не активировано взаимодействие с элементами списка.
Функция определяет, попадает ли элемент в результат.
Типовая реализация:
filter: function (text, input) {
return RegExp(input, "i").test(text);
}
Фильтрация выполняется на каждом вводе символа.
Функция сортировки определяет порядок отображения.
По умолчанию реализуется лексикографическое сравнение или приоритет совпадений в начале строки.
Определяет структуру <li>.
item: function(text, input) {
return Awesomplete.$("li", {
innerHTML: text.replace(RegExp(input, "gi"), "<mark>$&</mark>")
});
}
Элемент может включать подсветку совпадений через
<mark>.
Определяет, как значение вставляется в input.
replace: function(text) {
this.input.value = text;
}
Возможны модификации, включая форматирование, обрезку или добавление префиксов/суффиксов.
new Awesomplete(input, {
list: ["Apple", "Apricot", "Banana"]
});
list: [
{ label: "Apple", value: "apple" },
{ label: "Banana", value: "banana" }
]
Для объектов используется data():
data: function(item) {
return item.value;
}
Состояние контролируется через комбинацию свойств:
opened — видимостьselected — выбранный элементindex — текущая позицияИзменение состояния синхронизируется с DOM в реальном времени, без необходимости ручного рендера.
Awesomplete создает и управляет следующими элементами:
контейнер списка <ul>
элементы подсказок <li>
классы состояния:
awesompleteactiveselectedДобавление классов происходит динамически при навигации и выборе элементов.
Архитектура допускает переопределение всех ключевых методов:
filtersortitemreplacedataТакой подход позволяет адаптировать поведение под разные сценарии: поиск по API, работа с асинхронными данными, кастомный рендеринг UI.
Поддерживается использование функции вместо массива:
list: function() {
return fetch("/api/suggest")
.then(res => res.json());
}
При этом evaluate() ожидает результат перед построением
списка.
Цикл обработки ввода включает последовательные этапы:
Каждый этап выполняется синхронно в рамках одного вызова
evaluate(), что обеспечивает предсказуемость поведения
интерфейса.