aria-owns
Декларира връзка родител-дете в дървото за достъпност, когато DOM структурата не я изразява. Прехвърля референтните елементи като деца на текущия елемент за целите на помощните технологии. Мощен инструмент — лесен за злоупотреба.
Кога се използва
Само когато DOM не може да постави децата там, където дървото за достъпност се нуждае от тях. Най-честият случай е изскачащ listbox за combobox: списъкът живее в края на <body> поради причини, свързани с z-index, но семантично принадлежи на combobox-а. aria-owns на combobox-а, сочещ към идентификатора на listbox-а, казва на помощните технологии да третират listbox-а като негово дете.
Ако DOM може да се преструктурира така, че детето да е реален потомък, това е предпочитаният подход. aria-owns е вратичката за изход — работи, но заобикаля естествената проверка на разработчика, че маркирането отговаря на семантиката.
Как се държи
Стойността е разделен с интервали списък от идентификатори на елементи. Дървото за достъпност се преизгражда така, че всеки референтен елемент се появява като дете на притежаващия елемент, в реда, в който са изброени. Оригиналният DOM родител губи тези деца в изгледа на помощните технологии.
Правила за запазване на валидността на дървото:
- Всеки референтен идентификатор трябва да съществува и да е уникален.
- Един елемент може да бъде притежаван чрез
aria-ownsсамо от един родител едновременно. Притежаването на един и същ елемент от две места произвежда непредсказуемо поведение. - Не бива да се притежава предшественик на самия елемент. Това създава цикъл в дървото на помощните технологии.
- Елементът трябва да остава достъпен в DOM —
display: noneе допустим, но напълно откачен елемент — не.
Чести грешки
- Препращане към идентификатор, който не съществува или е премахнат при последното рендиране.
- Използване на
aria-owns, когато DOM може просто да вложи децата правилно. Добавя сложност без полза. - Два референции на
aria-ownsза едно и също дете от различни родители — помощната технология избира произволно. - Забравяне, че редът на фокуса е независим от
aria-owns. Клавиатурата продължава да обхожда с Tab визуалния ред в DOM; дървото на помощните технологии засяга само начина, по който екранните четци обхождат йерархията за достъпност. - Прибягване до
aria-ownsза решаване на проблем с фокуса или превъртането до видим елемент. Атрибутът не прави нито едното. - Притежаване на регион, съдържащ собствения му притежател — създава цикъл и руши дървото.
Пример
<!-- Combobox, чийто popup е портален до body заради контекста на наслагване -->
<div
role="combobox"
id="city-cb"
aria-haspopup="listbox"
aria-expanded="true"
aria-owns="city-listbox"
>
<input type="text" aria-controls="city-listbox" aria-activedescendant="city-opt-2">
</div>
<!-- Listbox живее в края на body, притежаван семантично от combobox-а -->
<ul role="listbox" id="city-listbox">
<li role="option" id="city-opt-1">London</li>
<li role="option" id="city-opt-2" aria-selected="true">Paris</li>
</ul>