Signatur
Beschreibung
document.forms gibt eine HTMLCollection mit allen <form>-Elementen des aktuellen Dokuments in Dokumentreihenfolge zurück. Jedes Element ist ein HTMLFormElement. Enthält das Dokument keine Formulare, ist die Sammlung leer (length === 0), aber niemals null.
Man kann auf einzelne Formulare über den Index (document.forms[0]), über item() oder über den Wert des id- bzw. name-Attributs zugreifen (document.forms.login, document.forms["login"], document.forms.namedItem("login")). Über die Eigenschaft elements eines Formulars gelangt man anschließend bequem an die einzelnen Formularfelder.
Die Sammlung ist live: Werden Formulare per DOM-Manipulation hinzugefügt oder entfernt, spiegelt sich das sofort in der Sammlung wider. Das ist praktisch, kann aber beim Iterieren und gleichzeitigen Verändern des DOM zu Überraschungen führen.
Die Eigenschaft eignet sich besonders für schnelle, selektorfreie Zugriffe auf benannte Formulare, etwa in Legacy-Code, Bookmarklets oder kleinen Skripten. In modernem Code ist document.querySelector("form#id") oft gleichwertig, document.forms ist aber kürzer und semantisch eindeutig.
Rückgabewert
HTMLCollection aller <form>-Elemente im Dokument, zugreifbar per Index, id oder name. Bei fehlenden Formularen eine leere Sammlung.Beispiele
Anzahl der Formulare und Zugriff per Index
// HTML: <form id="suche"></form> <form name="login"></form>
const forms = document.forms;
console.log(forms.length);
console.log(forms[0].id);
console.log(forms.item(1).name);
Benanntes Formular auslesen und absenden abfangen
// HTML:
// <form name="login">
// <input name="user" value="anna">
// <input name="pass" type="password" value="geheim">
// <button>Anmelden</button>
// </form>
const loginForm = document.forms.login; // oder document.forms["login"]
loginForm.addEventListener("submit", async (event) => {
event.preventDefault();
const { user } = loginForm.elements;
console.log(`Anmeldung für: ${user.value}`);
const data = new FormData(loginForm);
await fetch("/api/login", { method: "POST", body: data });
});
Alle Formulare iterieren und zurücksetzen
// HTMLCollection ist kein Array – mit for...of oder Array.from iterieren
for (const form of document.forms) {
form.reset();
}
const ids = Array.from(document.forms, (f) => f.id || "(ohne id)");
console.log(ids);
Live-Verhalten der Sammlung
const forms = document.forms;
console.log(forms.length); // z. B. 0
const neu = document.createElement("form");
neu.name = "kontakt";
document.body.append(neu);
// Die bereits referenzierte Sammlung ist automatisch aktualisiert
console.log(forms.length);
console.log(forms.kontakt === neu);
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
document.formswird ignoriert (im Strict Mode ggf.TypeError). Formulare fügt man per DOM-Methoden wieappend()hinzu. - Kein Array:
HTMLCollectionbesitzt keinmap(),filter()oderforEach(). Vorher mitArray.from()oder Spread-Syntax ([...document.forms]) umwandeln;for...offunktioniert direkt. - Live-Sammlung: Wer beim Iterieren Formulare entfernt, überspringt Einträge. In diesem Fall zuerst eine statische Kopie per
Array.from()anlegen. - Namenskonflikte: Heißt ein Formular z. B.
name="length"odername="item", wird es von den eingebauten Eigenschaften überdeckt. Sicherer ist dannnamedItem(). Mehrere Formulare mit gleichem Namen liefern beim Namenszugriff nur das erste. - Timing: Wird das Skript im
<head>ohnedeferausgeführt, sind die Formulare noch nicht geparst und die Sammlung ist leer. Skript mitdeferladen oder aufDOMContentLoadedwarten. - Formulare in
<iframe>s oder Shadow-DOM-Bäumen sind nicht enthalten; für iframesiframe.contentDocument.formsverwenden (nur bei gleicher Herkunft). - Die Eigenschaft wird von allen Browsern seit jeher unterstützt.