Для работы с библиотекой Axe-core в JavaScript
используется пакет axe-core, который можно установить через
npm:
npm install axe-core --save-dev
После установки библиотеку подключают в проекте:
const axe = require('axe-core');
Для браузерных окружений доступна версия через
<script>:
<script src="https://cdnjs.cloudflare.com/ajax/libs/axe-core/4.9.6/axe.min.js"></script>
Axe-core выполняет проверку доступности DOM-дерева
страницы. Основной метод — axe.run, который принимает
корневой элемент для анализа и объект опций.
Пример базового запуска:
axe.run(document, {
runOnly: {
type: 'tag',
values: ['wcag2a', 'wcag2aa']
},
reporter: 'v2'
}).then(results => {
console.log(results.violations);
});
Ключевые моменты:
runOnly позволяет ограничивать проверку конкретными
стандартами (например, WCAG 2.1).reporter задает формат отчета (v2,
v3, json).results.violations содержит массив найденных проблем
доступности.Динамический контент, создаваемый через JavaScript (AJAX-запросы,
SPA-фреймворки), требует особого подхода. Axe-core анализирует DOM в
момент вызова axe.run, поэтому элементы, загруженные позже,
без повторного запуска останутся вне проверки.
Повторный запуск после загрузки контента
Если данные подгружаются асинхронно, axe.run следует
вызывать после рендеринга:
fetch('/api/data')
.then(res => res.json())
.then(data => {
renderContent(data); // вставка контента в DOM
axe.run(document.body).then(results => {
console.log(results.violations);
});
});Использование MutationObserver
Для автоматической проверки элементов, которые появляются после
первоначальной загрузки страницы, применяется
MutationObserver:
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (mutation.addedNodes.length) {
axe.run(mutation.target).then(results => {
console.log(results.violations);
});
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
Такой подход позволяет анализировать новые узлы в реальном времени без необходимости вручную запускать проверки.
Axe-core предоставляет гибкую систему настройки правил:
rules — включение или отключение конкретных
проверок.exclude — исключение элементов по селекторам.elementRef — проверка только конкретного узла.Пример конфигурации для динамических форм:
axe.run(document.body, {
rules: {
'color-contrast': { enabled: true },
'label': { enabled: false }
},
include: [['#dynamic-form']]
}).then(results => {
console.log(results.violations);
});
Для React, Vue или
Angular важно запускать проверку после полного
рендеринга компонентов. В React это делается через
useEffect:
import { useEffect } from 'react';
import axe from 'axe-core';
function DynamicComponent({ data }) {
useEffect(() => {
axe.run(document.getElementById('dynamic-container'))
.then(results => console.log(results.violations));
}, [data]);
return <div id="dynamic-container">{data.map(item => <p>{item}</p>)}</div>;
}
Ключевое: axe.run должен вызываться после того, как DOM
обновлен, иначе новые элементы не будут проверены.
Результаты проверки включают:
id — идентификатор нарушения.impact — уровень серьезности (critical,
serious, moderate, minor).description — описание проблемы.nodes — массив элементов с нарушениями.Для динамического контента удобно строить визуальный интерфейс:
results.violations.forEach(violation => {
violation.nodes.forEach(node => {
const el = node.target[0];
el.style.outline = '2px solid red';
});
});
Это позволяет сразу видеть проблемные зоны на странице.
runOnly с нужными тегами или
правилами.MutationObserver и отложенный вызов
axe.run через setTimeout для сглаживания
нагрузки при больших динамических страницах.В SPA (Single Page Application) важно учитывать:
axe.run необходимо запускать на каждом изменении вида.if,
v-if, ngIf), проверка запускается после
вставки в DOM.Эти подходы обеспечивают полноценную проверку доступности динамического контента с помощью Axe-core, позволяя выявлять проблемы как на этапе разработки, так и при реальном взаимодействии пользователей с приложением.