Start · Sprachen · JavaScript · Referenz · FormData.has()

FormData.has()

Methode

Prüft, ob ein <code>FormData</code>-Objekt mindestens einen Eintrag mit dem angegebenen Schlüssel enthält, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript Baseline: alle modernen Browser (seit 2016), Node. Kategorie: webapi

Signatur

FormData.prototype.has(name)

Beschreibung

Die Methode has() des FormData-Interfaces stellt fest, ob zu einem bestimmten Feldnamen mindestens ein Eintrag vorhanden ist. Der Wert selbst wird dabei nicht betrachtet. Auch ein leerer String "" oder eine leere Datei gilt als vorhandener Eintrag.

Typische Einsatzfälle sind die Prüfung vor dem Absenden eines Formulars, ob ein optionales Feld überhaupt übertragen wird, z. B. ein angehakter Checkbox-Wert. Nicht angehakte Checkboxen und deaktivierte Felder landen gar nicht erst im FormData-Objekt. Außerdem lässt sich damit verhindern, dass append() einen Schlüssel doppelt anlegt.

Der Vergleich der Schlüssel unterscheidet zwischen Groß- und Kleinschreibung. has() liefert nur einen Wahrheitswert. Wer den Inhalt braucht, nimmt get() (erster Wert) oder getAll() (alle Werte). Weil get() bei fehlendem Schlüssel null zurückgibt, ist has() die klarere Wahl, wenn es nur um das Vorhandensein geht.

Parameter

Name Typ Default Beschreibung
$name Pflicht string Name des gesuchten Schlüssels bzw. Formularfelds. Andere Werte werden in einen String umgewandelt. Groß- und Kleinschreibung wird unterschieden.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn mindestens ein Eintrag mit dem Schlüssel name existiert, sonst false.

Beispiele

Einfache Prüfung auf vorhandene Schlüssel

const formData = new FormData();
formData.append('benutzername', 'anna');
formData.append('kommentar', '');

console.log(formData.has('benutzername'));
console.log(formData.has('kommentar')); // leerer Wert zählt als vorhanden
console.log(formData.has('Benutzername')); // Groß-/Kleinschreibung zählt
console.log(formData.has('passwort'));
true true false false

Angehakte Checkbox beim Absenden erkennen

// HTML: <form id="anmeldung"><input type="email" name="email">
//       <input type="checkbox" name="newsletter" value="ja"></form>
const form = document.querySelector('#anmeldung');

form.addEventListener('submit', async (event) => {
  event.preventDefault();
  const data = new FormData(form);

  // Nicht angehakte Checkboxen fehlen komplett im FormData
  const willNewsletter = data.has('newsletter');
  console.log(`Newsletter gewünscht: ${willNewsletter}`);

  await fetch('/api/anmeldung', { method: 'POST', body: data });
});
Newsletter gewünscht: false

Doppelte Einträge vermeiden

const addOnce = (formData, name, value) => {
  if (!formData.has(name)) {
    formData.append(name, value);
  }
};

const fd = new FormData();
addOnce(fd, 'sprache', 'de');
addOnce(fd, 'sprache', 'en'); // wird ignoriert

console.log(fd.getAll('sprache'));
["de"]

Pflichtfelder vor dem Versand prüfen

const pflichtfelder = ['name', 'email', 'datei'];
const fd = new FormData();
fd.append('name', 'Max');
fd.append('email', 'max@example.com');

const fehlend = pflichtfelder.filter((feld) => !fd.has(feld));
console.log(fehlend.length ? `Fehlend: ${fehlend.join(', ')}` : 'Alles vollständig');
Fehlend: datei

// Wichtig · Fallstricke

  • Leere Werte zählen als vorhanden: Ein leeres Textfeld wird als "" übertragen, ein leeres Datei-Feld als leere File. In beiden Fällen gibt has() true zurück. Ob ein Feld tatsächlich ausgefüllt wurde, zeigt erst der Wert aus get().
  • Fehlende Felder: Nicht angehakte Checkboxen und Radio-Buttons, deaktivierte Felder (disabled) und Felder ohne name-Attribut stehen nicht im FormData. Für sie liefert has() false.
  • Groß-/Kleinschreibung: has('Email') und has('email') sind verschiedene Abfragen.
  • Kompatibilität: has() ist in allen modernen Browsern verfügbar (Chrome 50+, Firefox 39+, Safari 11+, Edge 18+) und in Web Workern nutzbar. Im Internet Explorer fehlt die Methode. In Node.js gibt es FormData global ab Version 18.
  • Nur eine Prüfung auf dem Client: Pflichtfelder müssen trotzdem auch auf dem Server geprüft werden, denn clientseitige Prüfungen lassen sich umgehen.