Интерфейсы автодополнения относятся к категории сложных UI-компонентов, поскольку они одновременно управляют вводом пользователя, динамическим списком вариантов и состоянием фокуса. Без корректной семантики такие элементы становятся недоступными для вспомогательных технологий. В Awesomplete встроена поддержка ARIA-атрибутов, которая обеспечивает корректное взаимодействие с экранными дикторами и клавиатурной навигацией.
Основная задача ARIA в контексте Awesomplete заключается в синхронизации состояния списка подсказок с текстовым полем ввода. Это включает передачу информации о том, открыт ли список, какой элемент активен и какие элементы доступны для выбора.
Ключевым элементом доступности является связь input-элемента с выпадающим списком. Awesomplete автоматически добавляет набор атрибутов:
aria-autocomplete="list" — указывает тип
автодополненияaria-expanded — отражает состояние раскрытия
спискаaria-owns — связывает input с контейнером спискаaria-activedescendant — указывает текущий активный
элементПример базовой разметки с активированным Awesomplete:
<input id="city" class="awesomplete" />
После инициализации библиотека динамически расширяет DOM:
<input id="city"
class="awesomplete"
aria-autocomplete="list"
aria-expanded="false"
aria-owns="awesomplete_list_1"
aria-activedescendant="">
Такое связывание позволяет вспомогательным технологиям отслеживать изменения без необходимости перерисовки DOM вручную.
Атрибут aria-expanded является одним из ключевых
индикаторов состояния компонента. Awesomplete обновляет его при каждом
изменении состояния списка:
false — список скрытtrue — список отображаетсяЭто состояние синхронизируется с открытием и закрытием popup-элемента. При этом изменение происходит не только визуально, но и семантически, что критично для корректного чтения экранными дикторами.
input.addEventListener("awesomplete-open", function () {
console.log("Список открыт");
});
input.addEventListener("awesomplete-close", function () {
console.log("Список закрыт");
});
Хотя события не относятся напрямую к ARIA, они отражают моменты
обновления aria-expanded.
Одним из наиболее важных механизмов является управление активным
элементом списка. Awesomplete не переносит фокус на элементы списка.
Вместо этого используется модель aria-activedescendant.
Это означает, что фокус остается в input, а активный элемент определяется через идентификатор:
<input aria-activedescendant="awesomplete_list_1_item_3">
Такой подход обеспечивает:
Каждый элемент списка получает уникальный id, который
формируется библиотекой автоматически.
Контейнер списка оформляется как ARIA-совместимый элемент:
role="listbox" — контейнер предложенийrole="option" — отдельные элементы спискаПример структуры:
<ul id="awesomplete_list_1" role="listbox">
<li id="awesomplete_list_1_item_0" role="option">Almaty</li>
<li id="awesomplete_list_1_item_1" role="option">Astana</li>
</ul>
Awesomplete обновляет эти атрибуты при каждой перерисовке списка. Это позволяет сохранять корректную семантику даже при динамической фильтрации данных.
ARIA-атрибуты тесно связаны с управлением клавиатурой. Навигация реализуется через стандартные клавиши:
При перемещении по элементам обновляется
aria-activedescendant, что позволяет вспомогательным
технологиям отслеживать текущую позицию без изменения фокуса.
input.addEventListener("keydown", function (e) {
if (e.key === "ArrowDown") {
// перемещение по списку
}
});
Awesomplete работает с динамическими данными, поэтому ARIA-атрибуты пересоздаются при каждом изменении набора подсказок. Это включает:
id для элементовaria-owns при пересоздании спискаaria-activedescendant при закрытииОсобое внимание уделяется состоянию пустого списка. В этом случае:
aria-expanded устанавливается в falsearia-activedescendant очищаетсяКаждое изменение значения input приводит к пересчету предложений и синхронному обновлению ARIA-состояния. Это обеспечивает соответствие между визуальным интерфейсом и доступной моделью документа.
Ключевой момент заключается в том, что Awesomplete не разделяет визуальное и доступное состояние — они всегда изменяются одновременно.
input.addEventListener("input", function () {
// пересчет списка
// обновление ARIA состояния выполняется автоматически
});
При использовании пользовательских шаблонов элементов важно сохранять ARIA-структуру. Любое изменение DOM внутри списка должно учитывать:
role="option"idНарушение этих правил приводит к рассинхронизации между визуальным интерфейсом и доступной моделью.
Awesomplete допускает сценарии, в которых список может быть полностью отключен. В этом случае:
aria-expanded всегда falsearia-owns может быть удаленaria-autocomplete сохраняется, но не
активируетсяТакой режим используется при условной активации автодополнения или серверной фильтрации с задержкой.
Реализация ARIA в Awesomplete ориентирована на:
Корректное использование ARIA-атрибутов позволяет сохранять предсказуемое поведение интерфейса независимо от платформы и способа взаимодействия с пользователем.