Start · Sprachen · JavaScript · Referenz · HTMLLabelElement.control

HTMLLabelElement.control

Eigenschaft

Liefert das mit einem <code>&lt;label&gt;</code> verknüpfte beschriftbare Formular-Steuerelement oder <code>null</code>. Die Eigenschaft ist schreibgeschützt.

seit JavaScript Baseline: alle modernen Browser Kategorie: webapi

Signatur

get HTMLLabelElement.control

Beschreibung

Die schreibgeschützte Eigenschaft control eines HTMLLabelElement gibt das Formular-Steuerelement zurück, das zu diesem <label> gehört. Das Ergebnis ist ein HTMLElement bzw. ein davon abgeleiteter Typ wie HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement, HTMLButtonElement, HTMLMeterElement, HTMLOutputElement oder HTMLProgressElement. Auch formularfähige Custom Elements (static formAssociated = true) kommen infrage.

Wie die Verknüpfung festgestellt wird:

  • Explizit: Hat das Label ein for-Attribut (im DOM htmlFor), sucht der Browser im selben Baum (Dokument bzw. Shadow Root) das erste Element mit dieser id. Ist dieses Element beschriftbar, wird es zurückgegeben, sonst null.
  • Implizit: Ohne for-Attribut wird das erste beschriftbare Nachfahren-Element des Labels in Baumreihenfolge zurückgegeben.

Nützlich ist control für generische Formular-Logik, also etwa Validierungsmeldungen, Barrierefreiheits-Prüfungen oder Tests, bei denen man ausgehend vom Label das zugehörige Feld braucht und nicht wissen will, ob es per for oder durch Verschachtelung verknüpft ist. Das Gegenstück dazu ist HTMLInputElement.labels (und die gleiche Eigenschaft der anderen Steuerelemente). Sie liefert alle Labels eines Feldes als NodeList.

Rückgabewert

Typ
HTMLElement | null
Beschreibung
Das verknüpfte beschriftbare Element oder null. null kommt zurück, wenn es kein passendes Element gibt, die referenzierte id fehlt oder das gefundene Element nicht beschriftbar ist (z. B. ein <div> oder <input type="hidden">).

Beispiele

Explizite und implizite Verknüpfung auslesen

document.body.innerHTML = `
  <label id="l1" for="email">E-Mail</label>
  <input id="email" type="email">
  <label id="l2">Newsletter <input type="checkbox" name="news"></label>
  <label id="l3" for="gibtEsNicht">Verwaist</label>
`;

const l1 = document.getElementById('l1');
const l2 = document.getElementById('l2');
const l3 = document.getElementById('l3');

console.log(l1.control.id);   // über for-Attribut
console.log(l2.control.name); // über Verschachtelung
console.log(l3.control);      // keine Verknüpfung
email news null

Pflichtfelder am Label markieren

// Alle Labels, deren Steuerelement 'required' ist, mit einem Sternchen versehen
const markRequiredLabels = (root = document) => {
  for (const label of root.querySelectorAll('label')) {
    const field = label.control;
    if (field?.required && !label.dataset.marked) {
      label.append(' *');
      label.dataset.marked = 'true';
    }
  }
};

markRequiredLabels();

Barrierefreiheits-Check: verwaiste Labels finden

// Findet Labels, die auf kein (beschriftbares) Element verweisen
const findOrphanLabels = () =>
  [...document.querySelectorAll('label')]
    .filter((label) => label.control === null)
    .map((label) => ({
      text: label.textContent.trim(),
      for: label.htmlFor || '(kein for)'
    }));

console.table(findOrphanLabels());
Tabelle mit Text und for-Wert aller Labels ohne gültiges Steuerelement

Fehlermeldung vom Label aus setzen

const label = document.querySelector('label[for="plz"]');
const input = label.control;

input.addEventListener('input', () => {
  const ok = /^\d{5}$/.test(input.value);
  input.setCustomValidity(ok ? '' : 'Bitte fünfstellige PLZ eingeben');
  label.classList.toggle('fehler', !ok);
});

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an label.control wird ignoriert bzw. wirft im Strict Mode einen TypeError. Wer die Verknüpfung ändern will, setzt label.htmlFor = 'neueId'.
  • Nur beschriftbare Elemente: Verweist for auf ein nicht beschriftbares Element (z. B. <div>, <input type="hidden">), ist das Ergebnis null. Das gilt auch dann, wenn innerhalb des Labels ein passendes Feld steckt, denn das for-Attribut hat Vorrang.
  • Doppelte IDs: Es zählt nur das erste Element mit der passenden id. Doppelte IDs führen deshalb schnell zu unerwarteten Ergebnissen.
  • Shadow DOM: for wird nur im eigenen Baum aufgelöst. Ein Label im Light DOM findet also kein <input> innerhalb einer Shadow Root und umgekehrt.
  • Der Wert wird bei jedem Zugriff neu berechnet und spiegelt daher immer den aktuellen DOM-Zustand wider.
  • Kompatibilität: Die Eigenschaft wird seit vielen Jahren von allen modernen Browsern unterstützt (Chrome, Firefox, Safari, Edge). Der alte Internet Explorer kennt sie nicht; dort muss man document.getElementById(label.htmlFor) als Ersatz verwenden.