Современные веб-приложения активно используют динамические интерфейсы, в которых валидация форм выполняется на стороне клиента. При этом стандартная HTML-валидация часто заменяется пользовательской логикой на JavaScript. Такая практика нередко приводит к проблемам доступности: экранные дикторы и другие вспомогательные технологии не получают корректной информации о состоянии элементов формы.
Спецификация WAI-ARIA предоставляет набор атрибутов, позволяющих явно сообщать о состоянии интерфейсных компонентов. Эти атрибуты могут описывать ошибки ввода, обязательность полей, связь между элементами и статус сообщений об ошибках.
Библиотека Aria-query играет важную роль при разработке инструментов, обеспечивающих корректное использование ARIA. Она предоставляет программный доступ к справочным данным спецификации ARIA: ролям, состояниям, свойствам и их допустимым комбинациям. Благодаря этому возможно реализовывать интеллектуальную валидацию форм и автоматически проверять корректность атрибутов доступности.
aria-query — это JavaScript-библиотека, содержащая структурированное описание ролей, свойств и состояний ARIA. Она используется инструментами статического анализа, фреймворками тестирования доступности и библиотеками UI.
Основные задачи библиотеки:
Aria-query не выполняет валидацию форм напрямую. Вместо этого библиотека предоставляет данные, на основе которых строятся механизмы проверки интерфейсов.
При валидации форм используются несколько ключевых ARIA-атрибутов.
Основные атрибуты состояния:
aria-invalid — указывает на наличие ошибки в поле;aria-required — сообщает, что поле обязательно для
заполнения;aria-describedby — связывает поле с элементом,
содержащим сообщение об ошибке;aria-live — определяет область, в которой обновления
должны озвучиваться экранным диктором.Корректное использование этих атрибутов обеспечивает доступность динамической валидации.
Пример HTML-структуры формы:
<label for="email">Email</label>
<input id="email" type="email" aria-required="true" aria-describedby="email-error">
<div id="email-error" role="alert"></div>
Если ввод некорректный, JavaScript изменяет состояние:
<input id="email" aria-invalid="true">
Экранный диктор сообщает пользователю о наличии ошибки.
Одной из распространённых проблем является использование атрибутов ARIA в недопустимых контекстах. Например, некоторые роли не поддерживают определённые состояния.
Aria-query предоставляет набор коллекций, содержащих:
Импорт библиотеки:
import { roles } from "aria-query";
Получение информации о роли:
const textboxRole = roles.get("textbox");
console.log(textboxRole.props);
Объект props содержит список поддерживаемых атрибутов
состояния и свойств.
Использование этих данных позволяет инструментам анализа проверять, допустимо ли использование конкретного атрибута для элемента.
В динамических интерфейсах форма может генерироваться программно. В таких случаях полезно проверить, соответствует ли используемый ARIA-набор спецификации.
Алгоритм проверки:
Пример проверки:
import { roles } from "aria-query";
function validateAriaAttributes(roleName, attributes) {
const role = roles.get(roleName);
if (!role) return false;
const supportedProps = Object.keys(role.props);
return attributes.every(attr => supportedProps.includes(attr));
}
const attrs = ["aria-invalid", "aria-required"];
console.log(validateAriaAttributes("textbox", attrs));
Такая проверка предотвращает использование некорректных атрибутов.
Aria-query содержит таблицы соответствия HTML-элементов и ролей ARIA. Это позволяет выявлять ситуации, когда роль назначена неправильно.
Импорт данных:
import { elementRoles } from "aria-query";
Получение ролей для HTML-элемента:
for (const [element, roles] of elementRoles) {
console.log(element, roles);
}
Эта информация используется инструментами линтинга для проверки разметки форм.
Например, элемент <input type="text">
автоматически соответствует роли textbox. Указание другой
роли может нарушить семантику интерфейса.
В доступных интерфейсах обязательные поля должны быть обозначены не только визуально, но и программно.
ARIA-подход включает использование атрибута:
aria-required="true"
Валидация может проверять:
Пример функции проверки:
function validateRequiredField(input) {
const value = input.value.trim();
const isRequired = input.getAttribute("aria-required") === "true";
if (isRequired && value === "") {
input.setAttribute("aria-invalid", "true");
return false;
}
input.removeAttribute("aria-invalid");
return true;
}
Если поле пустое, интерфейс сообщает о состоянии ошибки.
ARIA требует явной связи поля с текстом ошибки. Это реализуется с
помощью aria-describedby.
Пример:
<input
id="username"
aria-describedby="username-error"
aria-invalid="true"
/>
<span id="username-error">Имя пользователя обязательно</span>
При фокусе на поле экранный диктор озвучивает сообщение.
Aria-query может использоваться для проверки корректности роли
контейнера ошибки. Например, элементы уведомлений часто используют роль
alert.
Получение информации о роли:
const alertRole = roles.get("alert");
console.log(alertRole);
Некоторые ARIA-атрибуты поддерживают строго определённые значения. Например:
aria-invalid: true, false,
grammar, spellingaria-live: off, polite,
assertiveAria-query содержит описание этих значений. Это позволяет создавать механизмы строгой проверки.
Пример логики проверки:
function validateAriaInvalid(value) {
const allowed = ["true", "false", "grammar", "spelling"];
return allowed.includes(value);
}
Такой подход предотвращает появление нестандартных значений.
Aria-query активно используется инструментами анализа доступности. Наиболее известный пример — правила линтера для JSX и HTML-разметки.
eslint-plugin-jsx-a11y применяет данные Aria-query для проверки:
При анализе форм такие проверки позволяют обнаруживать ошибки до выполнения приложения.
Пример предупреждения линтера:
Invalid ARIA attribute aria-required on element role="button"
Ошибка указывает на несоответствие спецификации.
Валидация доступности может быть частью автоматических тестов интерфейса.
Тест может проверять:
aria-invalid после неудачной отправки
формы;Пример проверки:
function hasAccessibleError(input) {
const describedBy = input.getAttribute("aria-describedby");
if (!describedBy) return false;
const errorElement = document.getElementById(describedBy);
return errorElement && errorElement.textContent.length > 0;
}
Такой тест подтверждает, что ошибка не только отображается визуально, но и доступна вспомогательным технологиям.
В современных SPA-приложениях формы часто валидируются при каждом изменении значения.
При этом важно соблюдать последовательность:
Пример обновления состояния:
function setFieldError(input, messageElement, message) {
input.setAttribute("aria-invalid", "true");
messageElement.textContent = message;
}
function clearFieldError(input, messageElement) {
input.setAttribute("aria-invalid", "false");
messageElement.textContent = "";
}
Если контейнер ошибки имеет role="alert" или
aria-live, сообщение будет автоматически озвучено.
В крупных приложениях логика проверки доступности форм может быть вынесена в отдельный модуль.
Компоненты такой архитектуры:
1. Модуль данных ARIA
Использует Aria-query для получения информации о ролях и свойствах.
2. Модуль проверки разметки
Анализирует DOM и выявляет:
3. Модуль валидации формы
Проверяет пользовательские данные и обновляет состояние интерфейса.
4. Модуль сообщений доступности
Отвечает за корректное отображение и озвучивание ошибок.
Такой подход позволяет поддерживать высокий уровень доступности интерфейса даже в сложных динамических приложениях.