combobox
Kennzeichnet ein Texteingabefeld kombiniert mit einer Popup-Liste – für Autovervollständigung, Typeahead-Suche und benutzerdefinierte Auswahlfelder. Das native <select> genügt für einfache Einzelauswahl; role="combobox" kommt nur zum Einsatz, wenn Filterung oder Remote-Vorschläge benötigt werden.
Verwendung
<select> wird verwendet, wenn die Auswahl aus einer kurzen, festen Liste erfolgt und kein Filtern erforderlich ist. Das native Element bietet mobilfreundliche Auswahlmenüs, vollständige Tastaturunterstützung und kein JavaScript.
role="combobox" ist für Fälle vorgesehen, die mit nativen Elementen nicht erreichbar sind:
- Autovervollständigung mit Filterung (Stadtsuche, Nutzererwähnung).
- Vorschläge, die von einer Remote-API abgerufen werden.
- Elemente mit reichhaltigem Inhalt (Avatare, Sekundärtext).
- Tag-Eingaben, bei denen mehrere Werte ausgewählt werden können.
ARIA 1.2 hat das Combobox-Muster wesentlich geändert. Die Rolle wird dem <input> zugewiesen, NICHT dem Wrapper. Das Popup ist eine separate role="listbox" (oder tree/grid/dialog), die die Combobox über aria-controls besitzt.
Tastatur- und Fokus-Vertrag
Gemäß dem APG-Combobox-Muster:
- Der Fokus verbleibt jederzeit auf dem Eingabefeld. Die Listbox wird über
aria-expanded="true"geöffnet, und die aktive Option wird überaria-activedescendantverfolgt – der Fokus wird NICHT verschoben. - Der Pfeil nach unten öffnet das Popup und setzt die aktive Option auf das erste Element.
- Pfeil nach oben/unten verschiebt die aktive Option innerhalb des Popups.
- Enter wählt die aktive Option aus und schließt das Popup.
- Escape schließt das Popup; beim zweiten Escape wird das Eingabefeld geleert.
- Tippen filtert die Liste (wenn
aria-autocomplete="list"oder"both"gesetzt ist).
aria-autocomplete ist auf "none", "inline", "list" oder "both" zu setzen, um das Vorschlagsverhalten zu beschreiben.
Häufige Fehler
role="combobox"auf dem Wrapper statt auf dem<input>platzieren (das Muster vor ARIA 1.2). Moderne Screenreader erwarten die Rolle auf dem bearbeitbaren Element.- Den DOM-Fokus bei Pfeil-nach-unten in die Listbox verschieben. Die APG schreibt
aria-activedescendantvor; eine Fokusverschiebung verhindert das Tippen. aria-expandedbei sichtbarem Popup auf"false"belassen.- Die Listbox im DOM rendern, ohne sie über
aria-controlszu verknüpfen. - Die Liste filtern, aber
aria-activedescendantauf ein Element zeigen lassen, das nicht mehr existiert.
Beispiel
<label for="city">Stadt</label>
<input
id="city"
type="text"
role="combobox"
aria-controls="cityList"
aria-expanded="false"
aria-autocomplete="list"
aria-activedescendant=""
>
<ul id="cityList" role="listbox" hidden>
<li id="city-1" role="option">London</li>
<li id="city-2" role="option">Lissabon</li>
<li id="city-3" role="option">Ljubljana</li>
</ul>