Start · Sprachen · JavaScript · Referenz · Element.ariaLabelledByElements

Element.ariaLabelledByElements

Eigenschaft

Liest oder setzt ein Array von Elementen, deren Textinhalt den zugänglichen Namen des Elements bildet – das DOM-Gegenstück zum Attribut <code>aria-labelledby</code>.

seit JavaScript Baseline 2025: Chrome/Edge 135+, Firefox 136+, Saf Kategorie: webapi

Signatur

Element.ariaLabelledByElements

Beschreibung

Die Eigenschaft ariaLabelledByElements gehört zur ARIA-Reflexion mit Elementreferenzen (ARIAMixin). Sie enthält ein Array von Element-Objekten, aus deren Text Hilfstechnologien wie Screenreader den zugänglichen Namen (accessible name) des Elements berechnen. Das Ergebnis ist dasselbe wie beim Attribut aria-labelledby. Dort stehen aber durch Leerzeichen getrennte IDs, hier echte Objektreferenzen.

Der größte Vorteil: Die Elemente brauchen keine ID. Das ist besonders in Web Components mit Shadow DOM nützlich. Eine ID-Referenz über aria-labelledby kann die Grenze eines Shadow Roots nicht überschreiten. Eine Elementreferenz über diese Eigenschaft kann dagegen auf Elemente in einem übergeordneten Scope zeigen, also im Light DOM oder in einem umgebenden Shadow Root.

Beim Lesen erhältst du ein eingefrorenes Array der gültigen Referenzen oder null. Mit einem Array setzt du die Referenzen. Mit null entfernt eine Zuweisung sie. Wenn du die Eigenschaft setzt, leert der Browser den Wert des Attributs aria-labelledby (das Attribut bleibt als leere Zeichenkette stehen). Setzt du dagegen das Attribut, gelten wieder die ID-Referenzen. Die Reihenfolge im Array bestimmt, in welcher Reihenfolge die Texte zum Namen zusammengesetzt werden.

Parameter

Name Typ Default Beschreibung
$value Array<Element> | null null Wird beim Setzen zugewiesen: ein Array von Elementen, deren Textinhalt nacheinander den zugänglichen Namen bildet. Mit null werden die Referenzen entfernt.

Rückgabewert

Typ
ReadonlyArray<Element> | null
Beschreibung
Ein eingefrorenes Array der referenzierten Elemente in der zugewiesenen Reihenfolge. Wenn nichts gesetzt ist, kommt null zurück. Hat nur das Attribut aria-labelledby gültige IDs, liefert die Eigenschaft die über diese IDs aufgelösten Elemente.

Beispiele

Beschriftung ohne ID zuweisen

// Ein Dialog soll seinen Namen aus der Überschrift beziehen
const dialog = document.createElement('div');
dialog.setAttribute('role', 'dialog');

const heading = document.createElement('h2');
heading.textContent = 'Einstellungen';
dialog.append(heading);
document.body.append(dialog);

// Direkte Elementreferenz statt ID
dialog.ariaLabelledByElements = [heading];

console.log(dialog.ariaLabelledByElements[0].textContent);
console.log(dialog.getAttribute('aria-labelledby'));
Einstellungen (leere Zeichenkette)

Namen aus mehreren Elementen zusammensetzen

// HTML: <span id="produkt">Laptop X1</span>
//       <span id="preis">999 €</span>
//       <button id="kaufen">Kaufen</button>
const button = document.querySelector('#kaufen');
const produkt = document.querySelector('#produkt');
const preis = document.querySelector('#preis');

// Reihenfolge bestimmt den zugänglichen Namen: "Kaufen Laptop X1 999 €"
button.ariaLabelledByElements = [button, produkt, preis];

console.log(button.ariaLabelledByElements.map((el) => el.textContent).join(' '));
Kaufen Laptop X1 999 €

Web Component: Label aus dem Light DOM referenzieren

class FancyInput extends HTMLElement {
  #input;
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'open' });
    this.#input = document.createElement('input');
    shadow.append(this.#input);
  }
  // Label-Element von außen übergeben
  set labelElement(el) {
    // Funktioniert über die Shadow-Grenze hinweg (von innen nach außen)
    this.#input.ariaLabelledByElements = el ? [el] : null;
  }
}
customElements.define('fancy-input', FancyInput);

const label = document.createElement('span');
label.textContent = 'E-Mail-Adresse';
const field = document.createElement('fancy-input');
document.body.append(label, field);
field.labelElement = label;

Feature-Erkennung und Zurücksetzen

const el = document.querySelector('[role="region"]');

if ('ariaLabelledByElements' in Element.prototype) {
  el.ariaLabelledByElements = [document.querySelector('h2')];
  // Später entfernen
  el.ariaLabelledByElements = null;
  console.log(el.ariaLabelledByElements);
} else {
  // Fallback über ID-Referenz
  const h2 = document.querySelector('h2');
  h2.id ||= 'region-titel';
  el.setAttribute('aria-labelledby', h2.id);
}
null

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Die Eigenschaft ist erst seit Kurzem in allen großen Browsern verfügbar: Safari 16.4, Chrome/Edge 135, Firefox 136. Für ältere Browser brauchst du eine Feature-Erkennung und als Fallback das Attribut aria-labelledby mit IDs.
  • Shadow-DOM-Regel: Du kannst nur auf Elemente im selben Baum oder in einem übergeordneten Scope verweisen. Eine Referenz von außen in einen Shadow Root hinein ist ungültig und wird beim Lesen herausgefiltert.
  • Eingefrorenes Array: Das zurückgegebene Array kannst du nicht verändern. push() wirft im Strict Mode einen Fehler. Weise für Änderungen immer ein neues Array zu.
  • Attribut vs. Eigenschaft: Wenn du die Eigenschaft setzt, leert der Browser den Wert von aria-labelledby. Ein späteres setAttribute('aria-labelledby', …) überschreibt dafür die Elementreferenzen. Mische beide Wege nicht.
  • Die Elemente werden über schwache Referenzen gehalten. Wird ein referenziertes Element aus dem Dokument entfernt, taucht es beim Lesen nicht mehr auf.
  • aria-labelledby hat bei der Namensberechnung Vorrang vor aria-label und vor nativen <label>-Elementen. Verwende es nur, wenn keine native Beschriftung passt.