Signatur
Beschreibung
Die Eigenschaft form eines <button>-Elements gibt das Formular zurück, zu dem der Button gehört. Das ist das Formular, das der Button abschickt oder zurücksetzt, wenn er vom Typ submit oder reset ist. Ist der Button keinem Formular zugeordnet, liefert die Eigenschaft null.
Wie die Zuordnung zustande kommt, hängt davon ab, ob ein form-Attribut gesetzt ist:
- Ohne
form-Attribut: Zugeordnet wird das nächstgelegene übergeordnete<form>-Element. - Mit
form-Attribut: Zugeordnet wird das Formular, desseniddem Attributwert entspricht. Dieses Formular kann irgendwo im selben Dokument stehen, auch außerhalb des Buttons. Gibt es keine passendeid, ist der Wertnull, selbst wenn der Button in einem anderen Formular steckt.
In der Praxis braucht man die Eigenschaft vor allem in gemeinsamen Event-Handlern. Damit findet man vom geklickten Button aus das passende Formular, um es zu prüfen, seine Daten mit FormData auszulesen oder es gezielt per requestSubmit() abzuschicken. Das ist sicherer als closest('form'), denn auch Buttons, die über das form-Attribut außerhalb des Formulars stehen, werden richtig erkannt.
Rückgabewert
HTMLFormElement oder null, wenn der Button zu keinem Formular gehört.Beispiele
Zugeordnetes Formular auslesen
// HTML:
// <form id="login"><button id="btn" type="submit">Anmelden</button></form>
// <button id="lose">Ohne Formular</button>
const btn = document.getElementById('btn');
const lose = document.getElementById('lose');
console.log(btn.form.id); // Formular über das umschließende Element
console.log(lose.form); // kein Formular vorhanden
Button außerhalb des Formulars über das form-Attribut
// HTML:
// <form id="bestellung"><input name="menge" value="3"></form>
// <footer><button id="senden" form="bestellung">Bestellen</button></footer>
const senden = document.getElementById('senden');
console.log(senden.form === document.getElementById('bestellung'));
console.log(senden.closest('form')); // closest() findet es hier nicht!
Gemeinsamer Klick-Handler für mehrere Formulare
document.addEventListener('click', async (event) => {
const button = event.target.closest('button[data-action="speichern"]');
if (!button) return;
const form = button.form;
if (!form) {
console.warn('Button ist keinem Formular zugeordnet');
return;
}
if (!form.reportValidity()) return; // Validierung anzeigen
const daten = Object.fromEntries(new FormData(form));
const res = await fetch(form.action, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(daten)
});
console.log('Status:', res.status);
});
// Wichtig · Fallstricke
- Nur lesbar: Wenn man
button.form = otherFormzuweist, passiert nichts (im Strict Mode gibt es einenTypeError). Um die Zuordnung zu ändern, setzt man das Attribut:button.setAttribute('form', 'andere-id'). - Das Attribut hat Vorrang: Verweist das
form-Attribut auf eineid, die es nicht gibt, ist der Wertnull, auch wenn der Button in einem<form>steht. - Nicht mit
closest('form')verwechseln:closest()sucht nur im DOM-Baum nach oben und berücksichtigt dasform-Attribut nicht. - Shadow DOM: Das
form-Attribut wird nur im selben Baum aufgelöst. Ein Button im Shadow Root kann kein Formular im Light DOM über desseniderreichen. - Auch Buttons mit
type="button"haben ein zugeordnetes Formular. Sie schicken es nur nicht automatisch ab. - Diese Eigenschaft wird von allen Browsern seit Langem unterstützt. Das
form-Attribut für Elemente außerhalb des Formulars funktioniert in allen modernen Browsern, aber nicht im Internet Explorer.