Библиотека Axe-core предназначена для автоматизированного тестирования доступности веб-приложений. Одной из ключевых особенностей современных интерфейсов является динамическое обновление DOM, когда элементы добавляются, изменяются или удаляются без перезагрузки страницы. Для отслеживания таких изменений используется стандартный веб-API MutationObserver.
MutationObserver позволяет наблюдать за изменениями в DOM и реагировать на них асинхронно. Основные сценарии применения:
childList).attributes).characterData).subtree).Пример базового создания наблюдателя:
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'childList') {
console.log('Добавлены или удалены узлы:', mutation.addedNodes, mutation.removedNodes);
} else if (mutation.type === 'attributes') {
console.log('Изменён атрибут:', mutation.attributeName);
}
}
});
observer.observe(document.body, { attributes: true, childList: true, subtree: true });
Параметры observe определяют, какие изменения
отслеживать. Опция subtree: true позволяет отслеживать
изменения во всех вложенных элементах, что важно для динамических
интерфейсов.
Axe-core предоставляет возможность автоматического повторного
анализа доступности при изменении DOM. Для этого используется
его API run совместно с MutationObserver. Основная задача —
запуск проверки только на изменённой части страницы, чтобы
оптимизировать производительность.
Пример интеграции:
import axe from 'axe-core';
const targetNode = document.getElementById('app');
const observer = new MutationObserver(() => {
axe.run(targetNode, {}, (err, results) => {
if (err) throw err;
console.log('Результаты проверки доступности:', results.violations);
});
});
observer.observe(targetNode, { childList: true, subtree: true, attributes: true });
Здесь наблюдатель запускает axe.run при каждом
изменении, фиксируя новые нарушения доступности.
Прямой запуск axe.run при каждом изменении может быть
затратным при высокой активности DOM. Для оптимизации применяются
следующие техники:
let timeout;
const observer = new MutationObserver(() => {
clearTimeout(timeout);
timeout = setTimeout(() => {
axe.run(targetNode).then(results => console.log(results.violations));
}, 300);
});
const observer = new MutationObserver((mutationsList) => {
const shouldRun = mutationsList.some(m =>
m.type === 'childList' && m.addedNodes.length > 0 ||
(m.type === 'attributes' && ['aria-label', 'role'].includes(m.attributeName))
);
if (shouldRun) {
axe.run(targetNode).then(results => console.log(results.violations));
}
});
Использование MutationObserver в сочетании с Axe-core является ключевым инструментом для поддержания доступности современного динамического веб-контента, обеспечивая своевременное выявление нарушений и возможность их оперативного исправления.