Библиотека Aria-query предназначена для работы с спецификацией ARIA в JavaScript. Одним из ключевых аспектов при работе с ARIA является понимание наследования свойств ролей, так как многие роли наследуют свойства от базовых или родительских ролей. Это позволяет избежать дублирования данных и создавать более гибкие структуры интерфейсов.
В ARIA каждая роль может определять следующие элементы:
abstract – флаг, указывающий, что роль
является абстрактной и не предназначена для прямого использования в
элементах DOM.superClass – массив родительских
ролей, от которых текущая роль наследует свойства.props – объект с конкретными
свойствами роли, такими как aria-label,
aria-checked и другими.Наследование позволяет ролям автоматически получать свойства всех своих родительских ролей, формируя полный набор доступных атрибутов.
Aria-query предоставляет два основных объекта:
roles – коллекция всех ролей ARIA с
описанием их свойств и наследования.elementRoles – отображение
HTML-элементов на роли, которые они могут выполнять.Пример структуры роли:
{
name: 'button',
abstract: false,
superClass: ['command'],
props: {
'aria-pressed': { type: 'boolean', default: false },
'aria-expanded': { type: 'boolean' }
}
}
Здесь роль button наследует свойства от роли
command. Если у роли command есть свойство
aria-disabled, то button также получит его
через наследование.
В Aria-query наследование реализуется через рекурсивное объединение свойств родителей. Для каждой роли алгоритм можно представить так:
superClass.Пример функции для получения всех свойств роли:
function getAllProps(roleName, rolesMap) {
const role = rolesMap.get(roleName);
if (!role) return {};
let inheritedProps = {};
role.superClass.forEach(parentRoleName => {
inheritedProps = {
...inheritedProps,
...getAllProps(parentRoleName, rolesMap)
};
});
return { ...inheritedProps, ...role.props };
}
Таким образом, getAllProps('button', roles) вернёт
полный набор свойств, включая aria-disabled из
command и aria-pressed,
aria-expanded из button.
Абстрактные роли (abstract: true) не используются
напрямую в DOM, но служат базой для наследования. Например,
widget или command являются абстрактными:
widget – определяет базовые свойства
всех интерактивных элементов.command – наследует свойства от
widget, добавляя специфические для команд свойства.С помощью Aria-query можно получить только наследуемые свойства абстрактной роли, не создавая лишних DOM-элементов. Это удобно при валидации доступности интерфейсов.
Aria-query предоставляет следующие методы и структуры для анализа:
roles.get(roleName) – получение
объекта роли по имени.roles.keys() – список всех ролей.getSuperClass(roleName) – возвращает
массив родительских ролей.getProps(roleName) – возвращает объект
свойств роли, включая наследуемые.Пример:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
const allProps = getAllProps('button', roles);
console.log(allProps);
Результат покажет, что button наследует свойства от
command, а также содержит свои специфические свойства.
menuitemcheckbox наследует от menuitem,
которая, в свою очередь, наследует от command и
widget.Наследование свойств в Aria-query — это мощный инструмент для работы с ARIA, который обеспечивает корректное распространение атрибутов через иерархию ролей, позволяя создавать доступные и стандартизированные интерфейсы на JavaScript.