Start · Sprachen · JavaScript · Referenz · ValidityState.badInput

ValidityState.badInput

Eigenschaft

Schreibgeschützter Boolean, der <code>true</code> ist, wenn der Browser die Benutzereingabe eines Formularfelds nicht in einen gültigen Wert umwandeln kann.

seit JavaScript Baseline: alle modernen Browser Kategorie: webapi

Signatur

ValidityState.badInput

Beschreibung

Die Eigenschaft badInput des ValidityState-Objekts (erreichbar über element.validity) gibt an, ob der Benutzer etwas eingegeben hat, das der Browser nicht in den Datentyp des Feldes umwandeln kann. Typisches Beispiel: In einem <input type="number"> steht der Text "12abc" oder nur "e".

Wichtig: In so einem Fall gibt input.value einen leeren String zurück. Ohne badInput kann man also nicht unterscheiden, ob das Feld wirklich leer ist oder ob Unsinn drinsteht. Genau hier hilft die Eigenschaft, z. B. um eine passende Fehlermeldung wie „Bitte eine gültige Zahl eingeben“ statt „Feld ist leer“ anzuzeigen.

Ist badInput true, ist auch validity.valid false, das Feld passt auf die CSS-Pseudoklasse :invalid, und ein normaler Formularversand wird blockiert. Die Eigenschaft ist schreibgeschützt. Setzen kann man sie nicht, auch nicht mit setCustomValidity() (das betrifft nur customError).

Relevant ist badInput vor allem bei Feldern, deren Eingabe der Browser erst parsen muss: number, date, time, datetime-local, month, week, email (bei manchen Browsern mit Punycode) und color. Bei text-Feldern ist der Wert immer false.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn der Browser die Eingabe nicht umwandeln kann, sonst false.

Beispiele

Leeres Feld von ungültiger Eingabe unterscheiden

// HTML: <input type="number" id="alter" required>
const alter = document.querySelector('#alter');

alter.addEventListener('input', () => {
  if (alter.validity.badInput) {
    console.log('Ungültige Zahl – value ist:', JSON.stringify(alter.value));
  } else if (alter.validity.valueMissing) {
    console.log('Feld ist leer');
  } else {
    console.log('OK:', alter.valueAsNumber);
  }
});
// Eingabe "12e": Ungültige Zahl – value ist: "" // Eingabe "42": OK: 42

Eigene Fehlermeldung vor dem Absenden

// HTML: <form id="f"><input type="number" name="menge" id="menge"><button>Senden</button></form>
const form = document.querySelector('#f');
const menge = document.querySelector('#menge');

const pruefen = () => {
  menge.setCustomValidity('');
  if (menge.validity.badInput) {
    menge.setCustomValidity('Bitte nur Ziffern eingeben.');
  }
};

menge.addEventListener('input', pruefen);
form.addEventListener('submit', (event) => {
  pruefen();
  if (!form.reportValidity()) event.preventDefault();
});

Alle Felder mit ungültiger Eingabe finden

const findeBadInput = (form) =>
  [...form.elements]
    .filter((el) => el.validity?.badInput)
    .map((el) => el.name || el.id);

console.log(findeBadInput(document.forms[0]));
["geburtsdatum", "menge"]

// Wichtig · Fallstricke

  • Leerer value: Bei badInput === true liefert input.value "" und valueAsNumber NaN. Die ursprüngliche Eingabe kommt man per Skript nicht heran.
  • Unterschiede zwischen Browsern: Wie gut ungültige Eingaben überhaupt möglich sind, hängt vom Browser ab. Manche Browser verhindern bei type="number" das Eintippen von Buchstaben ganz, andere erlauben es. Firefox erlaubt beliebigen Text und meldet dann badInput. Bei Datumsfeldern mit eigenem Auswahl-Widget tritt badInput meist nur bei unvollständiger Eingabe auf (z. B. fehlt das Jahr).
  • Nur lesbar: Eine Zuweisung wie validity.badInput = false hat keine Wirkung. Um den Zustand zu beheben, muss man value neu setzen (z. B. input.value = '').
  • novalidate: Auch bei <form novalidate> wird badInput weiter berechnet. Nur die automatische Blockierung und die Fehlermeldung des Browsers entfallen.
  • Kompatibilität: Wird von allen modernen Browsern unterstützt. Der Internet Explorer kennt die Eigenschaft nicht.