ARIA mit JavaScript
Das Skript schaltet um, ARIA schreibt mit
Schaltfläche, Panel, Ausblendung: drei Stellen, die ein Skript gemeinsam ändert.
Zustand als Schaltplan
Ein Wahrheitswert steuert alle sichtbaren und unsichtbaren Signale
JavaScript hält Darstellung, Bedienung und Accessibility Tree in demselben Zustand.
Auslöser
01Klick02Escape03Startoffen = true | false!offenString(offen)('ist-offen', offen)- Ereignisse entscheiden nur den nächsten Zustand. Sie schreiben keine Attribute oder Klassen selbst.
- Die Funktion rendert den vollständigen Zustand. Jeder Aufruf setzt alle drei Ausgaben erneut.
- Die Ausgaben bleiben ableitbar. Im DOM lässt sich sofort prüfen, ob sie zusammenpassen.
Derselbe Baustein in drei Zuständen
Die dritte Ansicht zeigt den Fehler, den eine zentrale Funktion verhindert.
offen = falsearia-expanded="false"hiddenist vorhanden- Panel-Link fehlt im Tabulatorlauf
offen = truearia-expanded="true"hiddenist entfernt- Panel-Link liegt im Tabulatorlauf
nur Klasse geändertaria-expanded="false"- Darstellung behauptet „offen“
- Widerspruch für Bedienende
Welcher Zustand gehört wohin?
Nicht jede Änderung an der Oberfläche ist ein Auf- und Zuklappen.
aria-expandedEin Element zeigt oder verbirgt einen Bereich.Beispiel: Menü, Akkordeon, Aufklapperaria-pressedEine Schaltfläche bleibt ein- oder ausgeschaltet.Beispiel: Fettdruck, Stummschaltungrole="status"Ein Ergebnis ändert sich, ohne den Fokus zu verschieben.Beispiel: gespeicherter Stand, TrefferzahlDas vollständige Muster
HTML liefert den richtigen Startzustand. JavaScript setzt jede Ausgabe gemeinsam.
<div class="aufklapper">
<h3>
<button
id="versand-schalter"
type="button"
aria-expanded="false"
aria-controls="versand-panel">
Versandkosten
</button>
</h3>
<div id="versand-panel" hidden>
<p>
Ab 50 Euro liefern wir versandkostenfrei.
</p>
<a href="/versand">Zu den Versandarten</a>
</div>
</div>const schalter = document.querySelector(
'#versand-schalter'
);
const panel = document.querySelector(
'#versand-panel'
);
const aufklapper = document.querySelector(
'.aufklapper'
);
let offen = false;
function zustandSetzen(neu) {
offen = neu;
panel.hidden = !offen;
schalter.setAttribute(
'aria-expanded',
String(offen)
);
schalter.classList.toggle(
'ist-offen',
offen
);
}
schalter.addEventListener('click', () => {
zustandSetzen(!offen);
});
aufklapper.addEventListener('keydown', (event) => {
if (event.key !== 'Escape' || !offen) return;
zustandSetzen(false);
schalter.focus();
});
zustandSetzen(false); Vermeiden Sie eine CSS-Regel wie [hidden] { display: block; }. Eine eigene display-Angabe kann den verborgenen Zustand überschreiben. Die Klasse ist-offen ist nur ein Gestaltungshaken; aria-expanded trägt die Bedeutung.
So prüfen Sie es
- Prüfen Sie den Startzustand im DOM:
aria-expanded="false"am Schalter,hiddenam Panel. - Aktivieren Sie den Schalter mit Enter und Leertaste. Beide Zustände wechseln bei jedem Aufruf gemeinsam.
- Tabben Sie weiter. Der Link im Panel ist nur im geöffneten Zustand erreichbar.
- Drücken Sie Escape im geöffneten Zustand. Das Panel schließt, und der Fokus bleibt am Schalter.
Aus dem Prüfbericht
Drei Stellen, drei Befunde
Kritisch Das Skript schreibt einen ungültigen Wert Regel aria-valid-attr-value
classList und textContent vertragen jeden String, aria-expanded nicht. Nur true und false kommen als Zustand an.
Kritisch Der Zustand landet am falschen Element Regel aria-allowed-attr
Das Skript setzt aria-expanded am Panel statt an der Schaltfläche. Dort erlaubt die Rolle das Attribut nicht.
Zum Mitnehmen
Das Skript, korrigiert
Ein Wert, ein Element, ein Attribut für Ausgabe und Tabfolge.
Korrektur in 3 Schritten ansehen
Den Zustand als String setzen
Der Attributwert wird aus derselben Variablen abgeleitet wie die Sichtbarkeit. So können beide nicht auseinanderlaufen.
KorrekturvergleichSchritt 1 · JavaScript Vorher
function umschalten(offen) { panel.hidden = !offen; knopf.setAttribute('aria-expanded', offen ? 'ja' : 'nein'); }Nachher
function umschalten(offen) { panel.hidden = !offen; knopf.setAttribute('aria-expanded', String(offen)); }Markierte Zeilen wurden geändert
So prüfen Sie es Klappen Sie den Bereich auf und sehen Sie in den Quelltext. Dort steht true oder false.
Das Attribut an die Schaltfläche
aria-expanded beschreibt den Auslöser, nicht den Inhalt. Am Panel ist es unzulässig und wird ignoriert.
KorrekturvergleichSchritt 2 · JavaScript Vorher
panel.setAttribute('aria-expanded', String(offen)); panel.hidden = !offen;Nachher
knopf.setAttribute('aria-expanded', String(offen)); panel.hidden = !offen;Markierte Zeilen wurden geändert
So prüfen Sie es Suchen Sie aria-expanded im gerenderten HTML. Es steht nur auf der Schaltfläche.
Beim Schließen auch den Fokus nehmen
hidden entfernt das Panel aus Ausgabe und Tabfolge. aria-hidden allein lässt die Links darin erreichbar.
KorrekturvergleichSchritt 3 · JavaScript Vorher
panel.setAttribute('aria-hidden', String(!offen));Nachher
panel.hidden = !offen;Markierte Zeilen wurden geändert
So prüfen Sie es Schließen Sie den Bereich und drücken Sie die Tabulatortaste. Der Fokus überspringt das Panel.
