Start · Sprachen · JavaScript · Referenz · HTMLOutputElement.htmlFor

HTMLOutputElement.htmlFor

Eigenschaft

Liefert eine dynamische <code>DOMTokenList</code> mit den IDs der Elemente, deren Werte in das Ergebnis eines <code>&lt;output&gt;</code>-Elements einfließen. Sie spiegelt das <code>for</code>-Attribut wider.

seit JavaScript Baseline: alle modernen Browser (seit ca. 2012–201 Kategorie: webapi

Signatur

HTMLOutputElement.htmlFor

Beschreibung

Die Eigenschaft htmlFor eines HTMLOutputElement spiegelt das HTML-Attribut for des <output>-Elements wider. Das Attribut enthält eine durch Leerzeichen getrennte Liste von IDs. Sie verweisen auf die Elemente, deren Werte in die angezeigte Berechnung einfließen oder sie auf andere Weise beeinflussen, zum Beispiel zwei Zahlenfelder, deren Summe im <output> steht.

Der Name lautet htmlFor und nicht for, weil for in JavaScript ein reserviertes Wort ist. Das gleiche Muster gibt es bei HTMLLabelElement.htmlFor. Anders als beim Label ist der Wert hier aber kein String, sondern eine dynamische DOMTokenList. Mit add(), remove(), toggle(), contains() und replace() kannst du die Liste gezielt ändern. Jede Änderung wird sofort in das for-Attribut geschrieben und umgekehrt.

Die Eigenschaft selbst ist schreibgeschützt: Du kannst ihr kein neues DOMTokenList-Objekt zuweisen. Weil sie mit [PutForwards=value] definiert ist, wird die Zuweisung eines Strings (output.htmlFor = "a b") aber an htmlFor.value weitergeleitet und ersetzt damit den Attributinhalt.

Nützlich ist htmlFor vor allem, um den Zusammenhang zwischen Eingaben und Ergebnis für Barrierefreiheit und Wartbarkeit festzuhalten. Außerdem kannst du darüber die beteiligten Eingabefelder per Skript finden und etwa eine Neuberechnung allgemein umsetzen.

Rückgabewert

Typ
DOMTokenList
Beschreibung
Eine dynamische DOMTokenList mit den IDs aus dem for-Attribut. Fehlt das Attribut, ist die Liste leer (length === 0, value === "").

Beispiele

IDs der beteiligten Eingaben auslesen

// HTML:
// <form id="calc">
//   <input type="number" id="a" value="2"> +
//   <input type="number" id="b" value="3"> =
//   <output id="result" name="result" for="a b"></output>
// </form>

const output = document.getElementById('result');

console.log(output.htmlFor);          // DOMTokenList
console.log(output.htmlFor.length);   // Anzahl der IDs
console.log([...output.htmlFor]);     // als Array
console.log(output.htmlFor.value);    // Rohwert des Attributs
DOMTokenList(2) ['a', 'b', value: 'a b'] 2 ['a', 'b'] 'a b'

Neuberechnung allgemein über htmlFor umsetzen

// Jedes <output> summiert automatisch die Felder, die in seinem for-Attribut stehen
const recalc = (output) => {
  const sum = [...output.htmlFor]
    .map((id) => document.getElementById(id))
    .filter(Boolean)
    .reduce((acc, el) => acc + (Number(el.value) || 0), 0);
  output.value = String(sum);
};

document.querySelectorAll('output[for]').forEach((output) => {
  for (const id of output.htmlFor) {
    document.getElementById(id)?.addEventListener('input', () => recalc(output));
  }
  recalc(output); // Startwert anzeigen
});
(Das <output> zeigt z. B. "5" und rechnet bei jeder Eingabe neu.)

Token-Liste dynamisch ändern

const output = document.getElementById('result');

// Ein neues Feld c hinzufügen
output.htmlFor.add('c');
console.log(output.getAttribute('for'));

// Prüfen und entfernen
console.log(output.htmlFor.contains('a'));
output.htmlFor.remove('a');
console.log(output.htmlFor.value);

// String-Zuweisung wird an .value weitergeleitet (PutForwards)
output.htmlFor = 'x y';
console.log(output.getAttribute('for'));
a b c true b c x y

// Wichtig · Fallstricke

  • Nicht mit HTMLLabelElement.htmlFor verwechseln: Beim Label ist htmlFor ein einfacher String mit genau einer ID. Beim <output> ist es eine DOMTokenList. Code wie output.htmlFor === 'a' ist deshalb immer false. Verwende stattdessen output.htmlFor.contains('a') oder output.htmlFor.value.
  • Keine automatische Berechnung: Das for-Attribut beschreibt nur den Zusammenhang. Der Browser rechnet nichts aus und aktualisiert das <output> nicht selbst. Den Wert musst du per Skript setzen, etwa über output.value oder im input-Ereignis des Formulars.
  • Keine Prüfung der IDs: Die Liste kann IDs enthalten, zu denen es kein Element gibt. Prüfe beim Auflösen per getElementById() deshalb auf null.
  • Keine Leerzeichen in Tokens: Ruft man add() oder remove() mit einem Token auf, das Leerzeichen enthält, wird ein InvalidCharacterError ausgelöst, bei einem leeren String ein SyntaxError.
  • Kompatibilität: Wird von allen modernen Browsern unterstützt. Die Weiterleitung einer String-Zuweisung an value ([PutForwards=value]) funktioniert in sehr alten Browsern eventuell nicht. Setze das Attribut im Zweifel mit setAttribute('for', …).