В ранних версиях Awesomplete основная точка входа была предельно
простой: конструктор new Awesomplete(input, options)
принимал DOM-элемент и объект конфигурации, однако поведение
значительной части опций было менее формализовано. Со временем интерфейс
инициализации стал более строгим и предсказуемым.
Изначально список автодополнения часто задавался через атрибут
data-list, поддерживающий строковый формат с разделителями.
Позднее приоритет сместился в сторону передачи массива или внешнего
источника данных через JavaScript, что позволило унифицировать обработку
и упростить динамическое обновление данных без пересоздания
экземпляра.
Ключевое изменение заключается в том, что конфигурация перестала рассматриваться как вторичный слой над HTML-атрибутами и стала основным механизмом управления поведением:
data-list как основной источник
данныхoptions.list как предпочтительный
источникОдним из наиболее заметных сдвигов в API стало расширение формата
list. В ранних реализациях предполагалось, что элементы
списка — это строки. Позже появилась поддержка объектов, что повлекло
изменение логики отображения и выбора.
Современная модель допускает:
label, value,
пользовательские поля)Это изменение привело к переработке внутренних механизмов сравнения и фильтрации. Если раньше сопоставление происходило напрямую по строке, то позже появилась нормализация значения через внутренние преобразования, чтобы унифицировать работу со сложными структурами данных.
Первоначально логика фильтрации была жёстко встроена в библиотеку и использовала простое сопоставление подстроки. Это обеспечивало минимальную гибкость, но максимальную предсказуемость.
Позднее API было расширено за счёт функций:
filter(text, input) — определяет, подходит ли
элементsort(a, b, input) — задаёт порядок отображенияitem(text, input) — формирует DOM-элемент
результатаreplace(text) — управляет подстановкой значения в
inputЭто изменение стало ключевым с точки зрения архитектуры: библиотека перестала навязывать алгоритм подбора и перешла к модели «поведения через переопределение функций».
Ранее подобная кастомизация требовала модификации исходного кода, тогда как новая модель позволила внедрять сложные сценарии (например, приоритетные совпадения, контекстный поиск, семантическую сортировку) без форков.
Ранние версии Awesomplete использовали фиксированную структуру списка
результатов, где шаблон элементов был практически неизменяемым. Со
временем появилась возможность управлять формированием DOM-узлов через
опцию item, что стало важной точкой расширения API.
Изменился и подход к обновлению списка:
Также была усилена изоляция компонентов: библиотека стала меньше зависеть от внешних стилей и структуры страницы, делая поведение более предсказуемым при интеграции в сложные интерфейсы.
Событийная система претерпела важную эволюцию: от минимального набора триггеров к более структурированному набору событий, отражающих жизненный цикл автодополнения.
Базовые события:
awesomplete-openawesomplete-closeawesomplete-selectВ более поздних версиях акцент сместился на консистентность: события стали более стабильными по поведению и унифицированными по моменту срабатывания. Это снизило количество неоднозначных состояний, например ситуаций, когда список считался открытым, но DOM уже был частично обновлён.
Дополнительно усилилась роль событий как основного механизма интеграции: вместо прямого вмешательства в методы экземпляра стало предпочтительным использовать подписку на события.
Параметр minChars в ранних версиях имел более
ограниченную интерпретацию. В ряде сценариев он влиял только на
отображение списка, но не на внутреннюю логику подготовки данных.
Позднее поведение было унифицировано: проверка минимального количества символов стала частью единого цикла обработки ввода. Это устранило расхождения между состоянием «данные готовы» и «интерфейс отображает результаты».
Также были уточнены правила обработки пустых строк и пробельных символов, что повысило предсказуемость поведения при очистке input-поля.
Механизм выбора элемента (select) и подстановки значения
в input подвергся заметной переработке. Изначально логика подстановки
была тесно связана с текстовым представлением элемента списка.
Позднее появилась явная функция replace, которая
отделила:
Это изменение позволило реализовать сценарии, где пользователь видит одно значение (например, «Москва — город»), а в поле вводится другое (например, идентификатор или чистое название).
Также была улучшена обработка клавиатурной навигации: выбор стрелками и подтверждение Enter стали более строго синхронизированы с внутренним состоянием компонента.
Одним из ключевых принципов развития Awesomplete стало сохранение обратной совместимости. Вместо удаления устаревших параметров использовалась стратегия постепенного смещения:
Такой подход позволил интеграциям, построенным на ранних версиях, продолжать функционировать без переписывания логики, при этом постепенно переходя на более гибкую модель API.
В раннем API кастомизация ограничивалась набором параметров. Позднее архитектура сместилась в сторону переопределяемых точек расширения.
Основные точки кастомизации:
Это изменение фактически превратило библиотеку из фиксированного автокомплита в мини-фреймворк для построения логики подсказок. Разработчик получил контроль над каждым этапом pipeline обработки данных: от ввода до финального значения в input.
Поздние изменения в API были направлены не столько на добавление новых возможностей, сколько на стабилизацию существующих. Особое внимание уделялось:
Это привело к тому, что API стал менее «экспериментальным» и более детерминированным: одинаковые входные данные стали давать одинаковое поведение независимо от контекста использования.