Библиотека Aria-query предоставляет мощные инструменты для анализа и работы с ARIA-ролями и их соответствующими HTML-элементами. Одним из центральных объектов является roleElements Map, представляющий сопоставление между ARIA-ролями и элементами, на которые эти роли могут быть назначены. Этот объект является ключевым при построении систем проверки доступности и инструментов автоматизированного тестирования.
roleElements представляет собой Map,
где:
"button", "checkbox",
"dialog").Пример структуры:
import { roleElements } from "aria-query";
console.log(roleElements.get("button"));
/*
{
name: "button",
requiredProps: [],
superClassRoles: ["command", "widget"],
baseElements: ["button", "input[type=button]", "input[type=submit]"]
}
*/
Ключевые поля значения Map:
name — строка с именем роли.requiredProps — массив ARIA-свойств, обязательных для
корректного функционирования роли.superClassRoles — массив ролей, от которых текущая роль
наследует поведение.baseElements — массив селекторов HTML-элементов,
которые нативно соответствуют роли.roleElements позволяет определить, какой HTML-элемент
является корректным для заданной ARIA-роли. Это особенно важно при
разработке доступных интерфейсов и написании линтеров.
Пример проверки соответствия:
import { roleElements } from "aria-query";
function isValidRoleForElement(role, tagName, type = null) {
const roleInfo = roleElements.get(role);
if (!roleInfo) return false;
return roleInfo.baseElements.some(elementSelector => {
if (type) {
return elementSelector === `${tagName}[type=${type}]` || elementSelector === tagName;
}
return elementSelector === tagName;
});
}
console.log(isValidRoleForElement("button", "button")); // true
console.log(isValidRoleForElement("button", "input", "submit")); // true
console.log(isValidRoleForElement("button", "div")); // false
Такой подход позволяет строить динамические проверки без необходимости жестко хранить соответствие ролей и элементов вручную.
Каждая ARIA-роль может наследовать свойства от одной или нескольких
суперролей. Это отражается в поле
superClassRoles. Использование этой информации
позволяет:
Пример анализа суперролей:
const buttonRole = roleElements.get("button");
console.log(buttonRole.superClassRoles); // ["command", "widget"]
// Проверка, является ли роль командой
const isCommandRole = buttonRole.superClassRoles.includes("command");
console.log(isCommandRole); // true
Некоторые роли требуют наличия определённых ARIA-атрибутов. Это
хранится в requiredProps. Например, роль
checkbox требует aria-checked:
const checkboxRole = roleElements.get("checkbox");
console.log(checkboxRole.requiredProps); // ["aria-checked"]
Это позволяет создавать утилиты для автоматической проверки доступности, предупреждая об отсутствии критических ARIA-атрибутов.
roleElements активно используется в:
Пример динамического создания компонента с корректной ролью:
function createAccessibleButton(tag = "button") {
const roleInfo = roleElements.get("button");
const element = document.createElement(tag);
if (roleInfo.baseElements.includes(tag)) {
element.setAttribute("role", "button");
roleInfo.requiredProps.forEach(prop => element.setAttribute(prop, ""));
}
return element;
}
document.body.appendChild(createAccessibleButton("button"));
roleElements — это централизованная карта всех
ARIA-ролей и соответствующих им элементов.roles и elementRoles, позволяя строить
полноценную систему анализа и валидации ARIA.Эффективное использование roleElements Map существенно
повышает качество кода, делая веб-интерфейсы более доступными и
соответствующими стандартам ARIA.