Chciałbym zaimplementować widget listbox przy użyciu aktualnych specyfikacji składników sieci. Co więcej, wynikowy listbox powinien być zgodny ze standardem ARIA. Utworzenie widgetu listbox powinno być tak proste, jak:Elementy niestandardowe i dostępność
<x-listbox>
<x-option>Option 1</x-option>
<x-option>Option 2</x-option>
</x-listbox>
Dla celów czystości i enkapsulacji wszystko inne powinno być renderowane w cieniu domowym. Aby zaimplementować ten widget, zarejestrowano dwa niestandardowe elementy: <x-listbox>
i <x-option>
. Element najwyższego poziomu DOM cienia <x-listbox>
jest <div>
że niesie role=listbox
i aria-activedescendent
atrybuty dostępności (nie chcę tych atrybutów na elemencie <x-listbox>
ponieważ są szczegóły implementacji).
Aby aria-activedescendent
do pracy, potrzebny jest identyfikator na elementach opcjonalnych. Umieszczanie identyfikatorów bezpośrednio na elementach <x-option>
nie będzie działać z dwóch powodów: Po pierwsze, spowodowałoby to zanieczyszczenie przestrzeni nazw dokumentu, który korzysta z widgetu listbox. Po drugie, a co ważniejsze, identyfikatory nie działają na granicach cienia (co jest jednym z celów domeny cienia), więc identyfikatory tych opcji muszą znajdować się w tym samym cieniu, co atrybut <div>
z atrybutem aria-activedescendent
.
Rozwiązanie tego będzie otaczać każdy <x-option>
która jest uznana jako zawartość wnętrza dom cienia <x-listbox>
innego <div>
(należącego do tej strefy DOM), w którym ID mogą być wprowadzane.
Moje pytanie brzmi: czy to jest właściwa droga i jak zaimplementować to za pomocą niestandardowego elementu i shadow dom web apis?
Mimo że działałoby to pod względem dostępności, jest to sprzeczne z moimi celami enkapsulacji (ponieważ wybrany element, który nie jest częścią dostarczonego kodu HTML, pojawi się w lekkim DOM). Po drugie, jeśli spróbowałem tego samego z bardziej skomplikowanym widgetem (np. Listbox, którego opcje zawierają więcej niż jakiś tekst), musiałbym zastąpić element select niestandardowym widgetem zgodnym z arią, co po prostu oznacza, że miałbym podwoić moje X-listbox. – Marc