Start · Sprachen · JavaScript · Referenz · ValidityState.customError

ValidityState.customError

Eigenschaft

Schreibgeschützter Boolean: <code>true</code>, wenn für das Element per <code>setCustomValidity()</code> eine nicht-leere, eigene Fehlermeldung gesetzt wurde.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

ValidityState.customError

Beschreibung

Die Eigenschaft customError des ValidityState-Objekts (erreichbar über element.validity) zeigt an, ob ein Formularelement durch eine benutzerdefinierte Validierungsmeldung als ungültig markiert wurde. Sie ist genau dann true, wenn zuletzt setCustomValidity() mit einem nicht-leeren String aufgerufen wurde.

Damit lassen sich Prüfregeln umsetzen, die über die eingebauten HTML-Attribute (required, pattern, min/max usw.) hinausgehen – etwa „Passwort-Wiederholung muss übereinstimmen“ oder Ergebnisse einer Serverprüfung. Solange customError true ist, ist auch validity.valid false, das Element passt auf die CSS-Pseudoklasse :invalid und das Formular wird beim Absenden blockiert.

Wichtig: Der Zustand bleibt bestehen, bis setCustomValidity("") aufgerufen wird. Man muss den Fehler also aktiv zurücksetzen, typischerweise im input-Event, bevor man die eigene Regel erneut prüft.

Beispiele

Grundlegende Abfrage nach setCustomValidity()

const input = document.createElement('input');

console.log(input.validity.customError); // Ausgangszustand

input.setCustomValidity('Dieser Benutzername ist bereits vergeben.');
console.log(input.validity.customError, input.validity.valid);

input.setCustomValidity(''); // Fehler zurücksetzen
console.log(input.validity.customError, input.validity.valid);
false true false false true

Passwort-Wiederholung prüfen

// <input id="pw" type="password" required>
// <input id="pw2" type="password" required>
const pw = document.querySelector('#pw');
const pw2 = document.querySelector('#pw2');

const checkMatch = () => {
  // Erst zurücksetzen, dann neu bewerten
  pw2.setCustomValidity('');
  if (pw2.value && pw.value !== pw2.value) {
    pw2.setCustomValidity('Die Passwörter stimmen nicht überein.');
  }
  console.log('customError:', pw2.validity.customError);
};

pw.addEventListener('input', checkMatch);
pw2.addEventListener('input', checkMatch);
customError: true (bei abweichenden Werten) customError: false (bei Übereinstimmung)

Asynchrone Serverprüfung und Fehlerursache unterscheiden

// <form id="reg"><input name="user" required><button>Senden</button></form>
const form = document.querySelector('#reg');
const user = form.elements.user;

user.addEventListener('input', () => user.setCustomValidity(''));

user.addEventListener('change', async () => {
  const res = await fetch(`/api/user-exists?name=${encodeURIComponent(user.value)}`);
  const { exists } = await res.json();
  user.setCustomValidity(exists ? 'Name bereits vergeben.' : '');
});

form.addEventListener('submit', (event) => {
  if (!user.checkValidity()) {
    event.preventDefault();
    const { validity } = user;
    if (validity.valueMissing) console.log('Feld ist leer');
    else if (validity.customError) console.log('Eigener Fehler:', user.validationMessage);
    user.reportValidity();
  }
});
Eigener Fehler: Name bereits vergeben.

// Wichtig · Fallstricke

  • Kein automatisches Zurücksetzen: Ein einmal gesetzter Fehler bleibt aktiv, auch wenn der Nutzer den Wert korrigiert. Ohne setCustomValidity('') lässt sich das Formular nie absenden – der häufigste Fehler in der Praxis.
  • Die Eigenschaft ist schreibgeschützt; eine Zuweisung wie validity.customError = false wird ignoriert (im Strict Mode kein Fehler, da nur Getter – Wert ändert sich trotzdem nicht). Steuerung ausschließlich über setCustomValidity().
  • Andere Validierungsfehler (valueMissing, patternMismatch …) können gleichzeitig true sein; customError sagt nur etwas über die eigene Meldung aus.
  • Elemente mit novalidate am Formular oder deaktivierte Elemente (disabled) nehmen nicht an der Validierung teil – customError kann dennoch true sein, blockiert dann aber nicht.
  • Bei Form-assoziierten Custom Elements setzt man den Zustand über ElementInternals.setValidity({ customError: true }, msg).
  • Kompatibilität: in allen modernen Browsern seit Jahren unterstützt.