Библиотека Aria-query предоставляет мощный инструмент для работы с ARIA-ролями и их свойствами в контексте веб-разработки. Одной из важных задач при работе с ARIA является корректная обработка элементов, у которых отсутствует явно указанная роль. Aria-query позволяет систематизировать проверку таких элементов и обеспечивать соответствие спецификации ARIA.
В ARIA-спецификации роль элемента определяет его семантику и поведение для технологий доступности (assistive technologies, AT). Если роль не задана явно, браузеры и AT могут использовать implicit role, то есть роль, выводимую на основе тега HTML и контекста. Aria-query предоставляет набор таблиц соответствий, которые позволяют программно определить:
role
attribute)Пример структуры данных в Aria-query:
import { roles } from 'aria-query';
console.log(roles.get('button'));
Каждая запись в roles содержит:
name: название ролиabstract: флаг абстрактной роли, которую нельзя
использовать напрямуюsuperClass: наследование ролей и их свойствprops: поддерживаемые ARIA-свойстваЭлементы без явно указанной роли можно проверять с помощью Aria-query следующим образом:
import { roles } from 'aria-query';
import { dom } from 'aria-query'; // набор соответствий для HTML-элементов
const elementTag = 'div';
const elementProps = {};
// Проверяем, есть ли implicit role для данного тега
const implicitRole = dom.get(elementTag)?.[0] || null;
console.log(implicitRole);
В этом примере:
dom содержит соответствие между HTML-тегами и их
implicit roles.null, значит элемент
не имеет роли по умолчанию.Для элементов, у которых не задана роль и нет implicit role, необходимо:
role.Пример добавления роли:
const el = document.createElement('div');
if (!dom.has(el.tagName.toLowerCase())) {
el.setAttribute('role', 'region');
}
Таким образом, даже для простых блоков можно обеспечить совместимость с технологиями доступности.
Aria-query позволяет выполнять валидацию ролей и их свойств, включая случаи отсутствия роли:
import { roles, elementRoles } from 'aria-query';
function validateRole(element) {
const tag = element.tagName.toLowerCase();
const explicitRole = element.getAttribute('role');
if (explicitRole && !roles.has(explicitRole)) {
return `Некорректная роль: ${explicitRole}`;
}
const implicit = elementRoles.get(tag);
if (!explicitRole && !implicit) {
return `Элемент <${tag}> не имеет роли`;
}
return 'Роль корректна';
}
Ключевые моменты:
roles.has()elementRoles.get(tag)Даже при отсутствии роли некоторые свойства ARIA могут применяться:
aria-label — для присвоения названия элементуaria-hidden — для исключения из доступностиaria-describedby — для создания связей с другими
элементамиAria-query позволяет определить, какие свойства поддерживаются конкретной ролью. Для элементов без роли можно использовать список универсальных свойств, доступных для всех элементов.
import { roles } from 'aria-query';
const universalProps = Array.from(roles.values())
.filter(role => !role.abstract)
.map(role => Object.keys(role.props));
console.log(universalProps.flat());
<div> и
<span> без роли. Aria-query помогает определить, где
стоит добавить role для совместимости с AT.Aria-query обеспечивает гибкое управление ролями, включая обработку случаев, когда роль отсутствует явно. Это критично для разработки доступных интерфейсов и автоматизированной валидации ARIA.