Signatur
Beschreibung
Der Konstruktor new Option() ist eine kompakte Kurzform, mit der man ein <option>-Element erzeugen kann. Text, Wert und Auswahlzustand lassen sich dabei in einem einzigen Aufruf festlegen. Das Ergebnis ist dasselbe wie bei document.createElement("option") mit anschließendem Setzen von text, value, defaultSelected und selected.
Typische Einsatzfälle sind dynamisch befüllte Auswahllisten: abhängige Dropdowns (etwa Land → Stadt), Optionen aus einer API-Antwort oder das Leeren und Neuaufbauen eines <select>. Das erzeugte Element fügst du am einfachsten mit select.add(option), select.append(option) oder select.options[i] = option ein.
Wichtig ist der Unterschied zwischen den beiden booleschen Parametern: defaultSelected setzt das HTML-Attribut selected. Es legt also den Ausgangszustand fest, auf den ein form.reset() zurückspringt. selected bestimmt dagegen nur den aktuellen Auswahlzustand. Der Text wird als reiner Text gesetzt und nicht als HTML ausgewertet. Deshalb ist der Konstruktor auch bei Daten von Nutzern sicher.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $text | string | "" | Sichtbarer Beschriftungstext der Option (entspricht option.text). Wird als Textknoten eingefügt, nicht als HTML. |
| $value | string | Wert von <code>text</code> | Wert, der beim Absenden des Formulars übermittelt wird (Attribut value). Fehlt er, wird beim Absenden der Text verwendet. |
| $defaultSelected | boolean | false | Setzt das Attribut selected, also die Vorauswahl, die auch nach form.reset() gilt. |
| $selected | boolean | false | Aktueller Auswahlzustand. Wenn true, ist die Option sofort ausgewählt, ohne dass das HTML-Attribut gesetzt wird. |
Rückgabewert
HTMLOptionElement.Beispiele
Einfache Option erzeugen und hinzufügen
const select = document.querySelector("#farbe");
const opt = new Option("Blau", "blue");
select.add(opt);
console.log(opt.outerHTML);
console.log(select.options.length);
Select aus API-Daten befüllen
const citySelect = document.querySelector("#stadt");
const loadCities = async (countryCode) => {
const res = await fetch(`/api/cities?country=${encodeURIComponent(countryCode)}`);
const cities = await res.json(); // z. B. [{ id: 1, name: "Berlin" }, ...]
// Bestehende Optionen entfernen
citySelect.length = 0;
citySelect.add(new Option("– Bitte wählen –", "", true, true));
for (const { id, name } of cities) {
citySelect.add(new Option(name, String(id)));
}
};
document.querySelector("#land")
.addEventListener("change", (e) => loadCities(e.target.value));
defaultSelected vs. selected
const select = document.createElement("select");
const form = document.createElement("form");
form.append(select);
select.add(new Option("Klein", "s", true, false)); // Vorauswahl (Attribut)
select.add(new Option("Groß", "l", false, true)); // aktuell ausgewählt
console.log(select.value);
form.reset();
console.log(select.value);
Nutzertext sicher einfügen
const userInput = '<img src=x onerror=alert(1)>';
const opt = new Option(userInput, "custom");
// Der Text wird nicht als HTML interpretiert
console.log(opt.textContent);
console.log(opt.children.length);
// Wichtig · Fallstricke
- Groß-/Kleinschreibung: Der Konstruktor heißt
Option(großes O) und muss mitnewaufgerufen werden. Ohnenewwird einTypeErrorausgelöst. - Nicht verwechseln:
defaultSelected(3. Parameter) wirkt überform.reset()hinaus,selected(4. Parameter) nicht. Wer beide auftruesetzt, bekommt eine Option, die sowohl vorausgewählt als auch aktuell ausgewählt ist. - Einfachauswahl: Setzt man bei einem
<select>ohnemultiplemehrere Optionen aufselected, bleibt nur die zuletzt eingefügte ausgewählt. - Leerer Wert:
new Option(\"Text\")ohnevalueübermittelt beim Absenden den Text. Für Platzhalter-Optionen daher ausdrücklich\"\"angeben. - Leistung: Bei sehr vielen Optionen erst in ein
DocumentFragmenteinfügen oderselect.replaceChildren(...options)nutzen, damit das Layout nicht bei jeder Option neu berechnet wird. - Sicherheit: Der Text wird als reiner Text behandelt. Das ist sicherer, als Optionen per
innerHTMLzusammenzubauen, was XSS-Lücken öffnen kann. - Kompatibilität: Wird von allen Browsern unterstützt, auch von sehr alten. In Node.js gibt es den Konstruktor nur mit einer DOM-Umgebung wie jsdom.