Start · Sprachen · JavaScript · Referenz · Element.role

Element.role

Eigenschaft

Liest oder setzt die explizit vergebene WAI-ARIA-Rolle eines Elements, also den Wert des <code>role</code>-Attributs.

seit JavaScript Baseline 2023: Chrome 81+, Edge 81+, Safari 12.1+, Kategorie: webapi

Signatur

Element.role

Beschreibung

Die Eigenschaft Element.role spiegelt das HTML-Attribut role wider. Sie gehört zum Mixin ARIAMixin, über das alle ARIA-Attribute als DOM-Eigenschaften verfügbar sind (z. B. ariaLabel, ariaExpanded). Wenn Sie element.role lesen, erhalten Sie denselben Wert wie mit element.getAttribute("role"). Wenn Sie die Eigenschaft setzen, wird das Attribut im DOM geändert.

Die Eigenschaft liefert nur die explizit gesetzte Rolle. Die implizite Rolle eines Elements, etwa button bei einem <button> oder navigation bei <nav>, gibt sie nicht zurück. Ohne role-Attribut ist der Wert null. Die tatsächlich berechnete Rolle sehen Sie im Barrierefreiheits-Baum der Entwicklerwerkzeuge.

Typische Anwendungsfälle sind eigene Bedienelemente wie Tabs, Menüs, Schalter oder Dialoge aus <div>-Elementen und Tests zur Barrierefreiheit. Nutzen Sie trotzdem zuerst native HTML-Elemente. ARIA-Rollen ändern nur die Semantik für Hilfstechnologien, nicht das Verhalten: Tastaturbedienung und Fokus müssen Sie selbst umsetzen.

Parameter

Name Typ Default Beschreibung
$wert string | null Beim Setzen: eine oder mehrere durch Leerzeichen getrennte ARIA-Rollen (z. B. "switch checkbox"). Die erste unterstützte Rolle gilt, die anderen sind Rückfallwerte. null entfernt das Attribut.

Rückgabewert

Typ
string | null
Beschreibung
Der aktuelle Wert des role-Attributs als Zeichenkette oder null, wenn kein Attribut gesetzt ist. Der Wert wird nicht geprüft und nicht normalisiert.

Beispiele

Explizite und implizite Rolle auslesen

document.body.innerHTML = `
  <div id="hinweis" role="alert">Gespeichert!</div>
  <button id="senden">Senden</button>
`;

const hinweis = document.getElementById('hinweis');
const senden = document.getElementById('senden');

console.log(hinweis.role);  // explizit gesetzt
console.log(senden.role);   // nur implizite Rolle -> null
alert null

Eigenen Umschalter barrierefrei machen

const schalter = document.createElement('div');
schalter.textContent = 'Dunkelmodus';
schalter.role = 'switch';
schalter.ariaChecked = 'false';
schalter.tabIndex = 0;

const umschalten = () => {
  const an = schalter.ariaChecked === 'true';
  schalter.ariaChecked = String(!an);
  document.documentElement.classList.toggle('dark', !an);
};

schalter.addEventListener('click', umschalten);
schalter.addEventListener('keydown', (e) => {
  if (e.key === ' ' || e.key === 'Enter') {
    e.preventDefault();
    umschalten();
  }
});

document.body.append(schalter);
console.log(schalter.outerHTML);
<div role="switch" aria-checked="false" tabindex="0">Dunkelmodus</div>

Rolle entfernen und mit Rückfall für ältere Browser setzen

const el = document.querySelector('#tabliste') ?? document.createElement('div');

// Fallback, falls die Eigenschaft fehlt (z. B. Firefox < 119)
const setzeRolle = (element, rolle) => {
  if ('role' in element) {
    element.role = rolle;
  } else if (rolle === null) {
    element.removeAttribute('role');
  } else {
    element.setAttribute('role', rolle);
  }
};

setzeRolle(el, 'tablist');
console.log(el.getAttribute('role'));

setzeRolle(el, null);
console.log(el.hasAttribute('role'));
tablist false

// Wichtig · Fallstricke

  • Keine implizite Rolle: element.role liefert bei <button>, <nav> und ähnlichen Elementen ohne Attribut null. Für die berechnete Rolle gibt es noch keine standardisierte DOM-API. Prüfen Sie sie in den Entwicklerwerkzeugen oder mit Test-Werkzeugen, z. B. getByRole aus der Testing Library.
  • Keine Prüfung: Ungültige Werte wie "knopf" werden ohne Fehler gespeichert, aber von Hilfstechnologien ignoriert.
  • Nur Semantik: Eine Rolle wie button macht ein Element weder fokussierbar noch per Tastatur bedienbar. Dafür brauchen Sie tabIndex und eigene Tastatur-Handler. Falsche Rollen schaden der Barrierefreiheit mehr als fehlende Rollen („Kein ARIA ist besser als schlechtes ARIA“).
  • Browser-Unterstützung: Chromium und Safari unterstützen die Eigenschaft seit Längerem, Firefox erst ab Version 119. Für ältere Umgebungen oder jsdom (je nach Version) greifen Sie auf setAttribute("role", …) und getAttribute("role") zurück.
  • Bei Custom Elements können Sie die Standardrolle über ElementInternals.role festlegen, ohne das sichtbare Attribut zu verändern.