Функция ally.get.insignificantBranches библиотеки
ally.js предназначена для анализа структуры DOM и выявления
ветвей дерева, которые считаются незначимыми с точки зрения
доступности. Такие ветви не участвуют в навигации клавиатурой,
не воспринимаются вспомогательными технологиями и фактически исключаются
из интерактивной модели интерфейса.
В рамках обеспечения доступности веб-интерфейсов важно понимать,
какие части документа являются значимыми для пользователей экранных
дикторов, клавиатурной навигации и других assistive-технологий.
ally.get.insignificantBranches позволяет определить участки
DOM, которые:
Это делает функцию полезной для аудита интерфейсов, тестирования доступности и динамического анализа состояния DOM.
В контексте ally.js ветвь (branch)
представляет собой цепочку элементов DOM — от конкретного узла до его
предков — которая может быть исключена из accessibility tree из-за
определённых условий.
Ветвь считается незначимой, если:
display: none,
visibility: hidden);hidden;aria-hidden="true";Функция выполняет обход дерева вверх по DOM и фиксирует первую причину, по которой ветвь становится недоступной.
ally.get.insignificantBranches({
context: Element
});
Параметры передаются через объект конфигурации.
context
DOM-элемент, относительно которого производится анализ. Выполняется проверка самого элемента и всех его предков.
const element = document.querySelector('.button');
const result = ally.get.insignificantBranches({
context: element
});
Функция возвращает массив объектов, каждый из которых описывает одну незначимую ветвь.
Пример структуры:
[
{
element: HTMLElement,
reason: String
}
]
Поля объекта:
element
DOM-узел, из-за которого ветвь становится незначимой.
reason
Строковый идентификатор причины, по которой элемент исключён из доступности.
ally.js классифицирует несколько типов причин.
hiddenЭлемент имеет атрибут hidden.
<div hidden>
<button>Кнопка</button>
</div>
В этом случае вся вложенная структура становится незначимой.
aria-hiddenИспользуется атрибут:
<div aria-hidden="true">
<button>Кнопка</button>
</div>
Контейнер и его потомки исключаются из accessibility tree.
display-noneЭлемент скрыт через CSS:
.container {
display: none;
}
Все дочерние элементы также становятся недоступными для assistive-технологий.
visibility-hiddenЭлемент скрыт:
visibility: hidden;
В отличие от display: none, элемент сохраняет геометрию
в документе, но остаётся недоступным для взаимодействия.
HTML-разметка:
<div class="panel" aria-hidden="true">
<button id="action">Action</button>
</div>
Jav * aScript:
const button = document.getElementById('action');
const branches = ally.get.insignificantBranches({
context: button
});
console.log(branches);
Результат:
[
{
element: <div class="panel">,
reason: "aria-hidden"
}
]
Функция указывает, что кнопка находится внутри контейнера, скрытого для вспомогательных технологий.
В интерфейсах часто встречаются многоуровневые контейнеры, в которых один из предков делает всю ветвь незначимой.
HTML:
<section class="modal">
<div class="wrapper">
<div hidden>
<button id="confirm">Confirm</button>
</div>
</div>
</section>
Анализ:
const button = document.getElementById('confirm');
const branches = ally.get.insignificantBranches({
context: button
});
Результат:
[
{
element: <div hidden>,
reason: "hidden"
}
]
Функция определяет ближайший элемент, из-за которого ветвь исключается из доступности.
Интерфейсы современных приложений часто изменяются динамически.
ally.get.insignificantBranches позволяет отслеживать
состояние DOM после модификаций.
Пример:
function checkAccessibility(element) {
const branches = ally.get.insignificantBranches({
context: element
});
if (branches.length) {
console.warn('Элемент находится в незначимой ветви', branches);
}
}
Такой механизм может использоваться в инструментах разработки или автоматических тестах доступности.
Модальные интерфейсы часто скрывают основной контент страницы с
помощью aria-hidden.
Пример структуры:
<main aria-hidden="true">
<button id="open">Open modal</button>
</main>
<div class="modal">
<button id="close">Close</button>
</div>
Проверка:
const openButton = document.getElementById('open');
const result = ally.get.insignificantBranches({
context: openButton
});
Результат:
[
{
element: <main>,
reason: "aria-hidden"
}
]
Таким образом подтверждается, что элементы основного контента исключены из доступности при открытой модали.
Браузеры формируют accessibility tree, который используется экранными дикторами и другими assistive-технологиями. Некоторые DOM-элементы не попадают в это дерево.
ally.get.insignificantBranches фактически моделирует
поведение браузера при построении accessibility tree и позволяет
определить:
В автоматизированных тестах доступности важно обнаруживать ситуации, когда интерактивные элементы оказываются внутри скрытых контейнеров.
Пример проверки:
function assertAccessible(element) {
const branches = ally.get.insignificantBranches({
context: element
});
if (branches.length > 0) {
throw new Error('Элемент недоступен для assistive технологий');
}
}
Проверка может применяться для:
ally.get.insignificantBranches часто используется вместе
с другими функциями библиотеки.
Связанные методы:
ally.is.focusable Проверяет, может ли элемент получать
фокус.
ally.is.tabbable Определяет доступность элемента в
таб-навигации.
ally.get.focusableElements Возвращает список всех
фокусируемых элементов.
Комбинированный анализ:
if (
ally.is.focusable(element) &&
!ally.get.insignificantBranches({ context: element }).length
) {
console.log('Элемент доступен');
}
Причины незначимости могут быть связаны как с CSS, так и с ARIA-атрибутами.
Наиболее распространённые факторы:
CSS
display: nonevisibility: hiddenHTML
hiddenARIA
aria-hidden="true"Каждый из этих механизмов исключает элементы из взаимодействия с assistive-технологиями.
Алгоритм работы функции включает несколько этапов:
Обход выполняется от элемента вверх к корню документа, что позволяет выявить наиболее близкую причину недоступности.
Типичная ошибка разработки — интерактивный элемент внутри скрытого контейнера.
Пример проблемной разметки:
<div aria-hidden="true">
<a href="/profile">Profile</a>
</div>
Экранный диктор не сможет обнаружить ссылку.
Проверка:
ally.get.insignificantBranches({
context: document.querySelector('a')
});
Результат укажет на контейнер с aria-hidden.
Функция работает только с цепочкой предков элемента, поэтому:
Даже в крупных интерфейсах вызов функции практически не влияет на производительность.
ally.get.insignificantBranches используется в следующих
сценариях:
аудит доступности
выявление элементов, недоступных для assistive-технологий.
инструменты разработки
внутренние инспекторы доступности.
динамические интерфейсы
проверка состояния элементов после изменения DOM.
фреймворки UI
валидация интерактивных компонентов.
Функция анализирует только структуру DOM и атрибуты, но не может полностью воспроизвести внутренние механизмы accessibility tree браузера.
Некоторые браузерные особенности могут влиять на интерпретацию доступности, включая:
Тем не менее алгоритм ally.js обеспечивает достаточно
точную модель для большинства практических задач анализа
доступности.