Библиотека aria-query в JavaScript представляет собой инструмент для работы с ARIA-ролями и свойствами, обеспечивая возможность проверки соответствия элементов доступности (a11y) стандартам WAI-ARIA. Одним из важных аспектов является управление обязательными свойствами ARIA-ролей и сценариев их игнорирования в специфических случаях.
aria-query предоставляет два ключевых объекта:
Каждая роль описывается объектом с полями:
name: строка с именем роли.abstract: логическое значение, указывающее, что роль
абстрактная и не предназначена для прямого использования в DOM.requiredProps: массив с именами обязательных
свойств.superClass: массив строк с родительскими ролями (для
наследования свойств).Например:
const { roles } = require('aria-query');
const buttonRole = roles.get('button');
console.log(buttonRole.requiredProps); // []
Здесь видно, что роль button не имеет обязательных
ARIA-свойств, а, например, роль textbox имеет обязательное
свойство aria-multiline в определённых контекстах.
В библиотеке aria-query не реализована встроенная
валидация DOM-элементов, однако roles и
properties позволяют строить собственные
валидаторы, проверяя, что все requiredProps
присутствуют и соответствуют типу.
Пример алгоритма проверки:
function validateRequiredProps(roleName, elementProps) {
const role = roles.get(roleName);
if (!role) return false;
const missingProps = role.requiredProps.filter(prop => !(prop in elementProps));
return missingProps.length === 0;
}
// Пример использования
const elementProps = { 'aria-multiline': true };
console.log(validateRequiredProps('textbox', elementProps)); // true или false
Существуют сценарии, когда обязательные свойства могут не применяться:
requiredProps.aria-owns у элемента
списка.Пример условного игнорирования:
function getRequiredProps(roleName, options = {}) {
const role = roles.get(roleName);
if (!role) return [];
// Если включена опция игнорирования обязательных свойств
if (options.ignoreRequiredProps) {
return [];
}
return role.requiredProps;
}
// Пример
console.log(getRequiredProps('textbox', { ignoreRequiredProps: true })); // []
Игнорирование обязательных свойств полезно при:
Важно отметить, что игнорирование должно быть осознанным, так как в реальных приложениях пропуск обязательных свойств может нарушить доступность.
Каждое ARIA-свойство в properties имеет тип:
string, integer, token,
id, idlist, boolean.Пример извлечения типа:
const { properties } = require('aria-query');
const ariaValue = properties.get('aria-multiline');
console.log(ariaValue.type); // boolean
При игнорировании свойства можно пропустить и проверку типа:
function validatePropsWithIgnore(roleName, elementProps, options = {}) {
const requiredProps = getRequiredProps(roleName, options);
return requiredProps.every(prop => prop in elementProps);
}
ARAI-ролей имеет иерархию. Например, combobox наследует
свойства input и listbox. При
игнорировании:
function getAllRequiredProps(roleName, options = {}) {
const role = roles.get(roleName);
if (!role) return [];
if (options.ignoreRequiredProps) return [];
const inheritedProps = role.superClass.flatMap(parent => getAllRequiredProps(parent, options));
return [...new Set([...role.requiredProps, ...inheritedProps])];
}
Это обеспечивает гибкость при построении валидаторов.
Игнорирование обязательных свойств в aria-query предоставляет разработчикам контроль над строгой проверкой ARIA, позволяя строить гибкие и динамичные интерфейсы без лишнего кода, при этом сохраняя возможность последующей корректной валидации.