Одной из наиболее распространённых ошибок является некорректная инициализация ally.js. Библиотека требует правильного подключения и вызова функций для работы с фокусом и доступностью элементов. Часто встречается ошибка типа:
ally.focus('.my-element'); // Ошибка: ally.focus is не функцией
Причины:
ally не доступен глобально.Правильная инициализация через npm-модуль:
import * as ally from 'ally.js';
ally.focus('.my-element');
Через CDN:
<script src="https://unpkg.com/ally.js/dist/ally.min.js"></script>
<script>
ally.query.firstTabbable(document.body).focus();
</script>
Важно убедиться, что скрипт подключён после DOM-элементов, которые нужно обработать.
Ally.js предоставляет методы для поиска фокусируемых и tabbable-элементов. Частая ошибка — попытка сфокусировать элемент, который недоступен для фокуса:
const element = document.querySelector('.hidden-element');
ally.focus(element); // Не сработает
Причины:
display: none или
visibility: hidden.<div>
без tabindex).Решение:
ally.query.focusable:const focusableElements = ally.query.focusable(document.body);
console.log(focusableElements);
tabindex="0":<div class="custom-focusable" tabindex="0">Кликни меня</div>
Ally.js позволяет управлять последовательностью фокуса через методы
типа nextTabbable и previousTabbable. Ошибка
возникает, если попытаться вызвать их на элементах вне текущей области
документа:
const next = ally.query.nextTabbable('.outside');
Проблемы:
null, если элемент не существует или
не tabbable.Рекомендации:
focus():const next = ally.query.nextTabbable('.current');
if (next) {
next.focus();
}
При реализации модальных диалогов частая ошибка — отсутствие правильного фокус-траппинга. Пользователь может выйти из модального окна при нажатии Tab, что нарушает доступность.
Правильная реализация:
const modal = document.querySelector('.modal');
ally.maintain.focus({
context: modal,
ignoreSelf: false,
includeContext: false
});
Особенности:
context — контейнер, в котором фокус должен быть
замкнут.ignoreSelf — определяет, включает ли сам контейнер в
список фокусируемых элементов.includeContext — позволяет учитывать элементы вне
контекста для поиска следующего фокуса.Ошибка возникает, если не учитывать эти параметры и пытаться сфокусировать скрытые или не tabbable элементы.
Ally.js поддерживает современные браузеры, но при работе с устаревшими версиями возможны следующие ошибки:
NodeList.forEach is not a function — старые версии IE
не поддерживают forEach для NodeList.SVG-элементах или кастомных компонентах
может работать некорректно.query.firstTabbable и
query.lastTabbable возвращают null при пустых
контейнерах.Решения:
NodeList.forEach.focus().tabindex и
атрибуты role.Ally.js предоставляет события для отслеживания изменений фокуса и доступности элементов. Ошибки появляются при неправильном добавлении слушателей:
document.addEventListener('ally.focus', (event) => {
console.log('Фокус изменён');
});
Ошибка: событие ally.focus не срабатывает, так как
ally.js использует свои внутренние механизмы. Вместо этого рекомендуется
использовать:
import * as ally from 'ally.js';
ally.on('focus', document.body, (event, element) => {
console.log('Фокус на элементе:', element);
});
Особенности:
ally.on обеспечивает кросс-браузерную обработку.focus, blur,
taborderchange и др.При добавлении новых элементов после инициализации методов ally.js возникает ситуация, когда новые элементы не фокусируются или не участвуют в tabbable-цепочке.
Решение:
const container = document.querySelector('.container');
const newFocusable = document.createElement('button');
newFocusable.textContent = 'Новый';
container.appendChild(newFocusable);
const tabbable = ally.query.tabbable(container);
tabbable[tabbable.length - 1].focus();
MutationObserver для автоматического
отслеживания изменений DOM и пересчёта фокусируемых элементов.Некорректная конфигурация методов, например, использование
ignore, filter или
includeContext, может привести к неожиданному
поведению.
Пример ошибки:
ally.query.firstTabbable(document.body, { ignore: '.visible' });
ignore исключает элементы из поиска, поэтому метод
может вернуть null.Рекомендации:
ignore, filter и
includeContext только при полной необходимости.Эти практики помогают избежать большинства ошибок при работе с ally.js, обеспечивая корректное управление фокусом, tabbable-элементами и доступностью веб-приложений.