Библиотека aria-query является мощным инструментом для работы с ARIA-атрибутами и ролями в среде JavaScript. Одной из ключевых особенностей является поддержка множественных вариантов ролей для элементов, что позволяет создавать более гибкие и семантически корректные интерфейсы.
Роль (role) в ARIA определяет назначение элемента в
интерфейсе. Роли бывают простые и
композитные. Простые роли однозначно описывают
поведение элемента, например button или
checkbox. Комбинированные роли допускают множественные
варианты, например menuitem может быть как
menuitemcheckbox, так и menuitemradio, в
зависимости от контекста использования.
В aria-query роли представлены объектами, содержащими информацию о:
name)props)childRoles)attributes)Это позволяет программно определять совместимость элементов и проверять их корректность в DOM.
Для работы с ролями используются два основных объекта библиотеки:
import { roles, elementRoles } from 'aria-query';
roles — карта всех ARIA-ролей с их свойствами и
ограничениями.elementRoles — карта соответствия HTML-элементов ролям
ARIA.Каждая роль хранится в виде объекта с набором свойств:
roles.get('menuitem');
// Пример возвращаемого объекта
{
name: 'menuitem',
props: { 'aria-disabled': 'boolean' },
superclass: ['widget', 'command'],
requiredContextRole: ['menu', 'menubar'],
childRoles: new Set(['menuitem', 'menuitemcheckbox', 'menuitemradio'])
}
Объект childRoles демонстрирует возможность
множественных вариантов. Элемент с ролью menuitem может
быть расширен до menuitemcheckbox или
menuitemradio.
Множественные варианты ролей позволяют проверять, какие роли могут
находиться внутри родительского элемента. Для этого используется
childRoles и requiredContextRole:
const menuItemRole = roles.get('menuitem');
menuItemRole.childRoles.has('menuitemcheckbox'); // true
menuItemRole.childRoles.has('menuitemradio'); // true
menuItemRole.childRoles.has('button'); // false
Это обеспечивает строгую проверку семантической совместимости и предотвращает ошибки в структуре интерфейса.
elementRoles содержит набор HTML-тегов и их возможные
роли. Это позволяет выбирать подходящую роль для элемента:
elementRoles.get('li');
// пример возвращаемого объекта
{
role: new Set(['menuitem', 'option'])
}
Если элемент <li> находится внутри
<ul role="menu">, его роль может быть любым вариантом
menuitem. Таким образом, библиотека позволяет динамически
определять допустимые комбинации ролей в зависимости от контекста.
Для сложных компонентов интерфейса с динамическими ролями можно использовать фильтрацию множественных вариантов:
function getAllowedChildRoles(parentRoleName) {
const parentRole = roles.get(parentRoleName);
return Array.from(parentRole.childRoles);
}
console.log(getAllowedChildRoles('menu'));
// ['menuitem', 'menuitemcheckbox', 'menuitemradio']
Это особенно полезно при построении кастомных меню, таблиц или комбинированных виджетов, где один элемент может принимать несколько ARIA-ролей в зависимости от состояния.
Использование aria-query позволяет создавать утилиты для
проверки ARIA-структур на лету:
function isValidChild(parent, child) {
const parentRole = roles.get(parent.getAttribute('role'));
const childRole = child.getAttribute('role');
return parentRole.childRoles.has(childRole);
}
Такой подход обеспечивает контроль над семантикой интерфейса, предотвращает ошибки доступности и улучшает совместимость с вспомогательными технологиями.
superclass), что позволяет
добавлять новые варианты без изменения исходного объекта.requiredContextRole).Множественные варианты ролей позволяют:
Использование aria-query в связке с JavaScript открывает
возможности построения интерфейсов, полностью соответствующих стандартам
доступности, с учётом всех допустимых вариантов ролей.