Signatur
Beschreibung
Die Eigenschaft valid des ValidityState-Objekts (erreichbar über element.validity) fasst alle Einzelprüfungen der Constraint-Validation-API zusammen. Sie ist genau dann true, wenn keine der anderen Eigenschaften wie valueMissing, typeMismatch, patternMismatch, tooLong, tooShort, rangeUnderflow, rangeOverflow, stepMismatch, badInput oder customError auf true steht.
Sie eignet sich besonders für eigene Validierungsoberflächen: Statt jede Regel einzeln abzufragen, prüft man zuerst validity.valid und wertet nur im Fehlerfall die Detail-Flags aus, um passende Fehlermeldungen anzuzeigen. Anders als checkValidity() löst das Lesen von valid kein invalid-Ereignis aus und zeigt keine Browser-Meldung an.
Verfügbar ist die Eigenschaft auf <input>, <select>, <textarea>, <button>, <output>, <fieldset> und <object> sowie über ElementInternals.validity bei formularfähigen Custom Elements. Der Wert entspricht dem Zustand, den auch die CSS-Pseudoklassen :valid und :invalid widerspiegeln.
Rückgabewert
true, wenn das Element alle Validierungsregeln erfüllt; false, sobald mindestens eine Regel verletzt ist (inklusive gesetzter setCustomValidity()-Meldung).Beispiele
Gültigkeit eines E-Mail-Felds prüfen
// <input id="email" type="email" required>
const email = document.querySelector('#email');
email.value = 'kein-at-zeichen';
console.log(email.validity.valid, email.validity.typeMismatch);
email.value = 'max@example.com';
console.log(email.validity.valid);
Live-Validierung mit eigenen Fehlermeldungen
// <input id="plz" required pattern="\\d{5}"> <span id="plz-fehler"></span>
const plz = document.querySelector('#plz');
const fehler = document.querySelector('#plz-fehler');
const meldung = (v) => {
if (v.valueMissing) return 'Bitte eine Postleitzahl eingeben.';
if (v.patternMismatch) return 'Die PLZ muss aus genau 5 Ziffern bestehen.';
return 'Ungültige Eingabe.';
};
plz.addEventListener('input', () => {
const { validity } = plz;
fehler.textContent = validity.valid ? '' : meldung(validity);
plz.setAttribute('aria-invalid', String(!validity.valid));
});
Formular ohne Browser-Popups vor dem Absenden prüfen
// <form id="anmeldung" novalidate> ... </form>
const form = document.querySelector('#anmeldung');
form.addEventListener('submit', (event) => {
const ungueltig = [...form.elements].filter(
(el) => el.willValidate && !el.validity.valid
);
if (ungueltig.length > 0) {
event.preventDefault();
ungueltig[0].focus();
console.log(`${ungueltig.length} Feld(er) ungültig:`, ungueltig.map((el) => el.name));
}
});
Eigene Regel mit setCustomValidity()
// <input id="pw" type="password"> <input id="pw2" type="password">
const pw = document.querySelector('#pw');
const pw2 = document.querySelector('#pw2');
const vergleiche = () => {
pw2.setCustomValidity(pw.value === pw2.value ? '' : 'Passwörter stimmen nicht überein.');
console.log('gültig:', pw2.validity.valid, '| customError:', pw2.validity.customError);
};
pw.addEventListener('input', vergleiche);
pw2.addEventListener('input', vergleiche);
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
el.validity.valid = truehat keine Wirkung (im Strict Mode einTypeError). Den Zustand ändert man über Attribute (required,pattern…) odersetCustomValidity(). - Eigene Meldung zurücksetzen: Nach
setCustomValidity('Text')bleibtvalidso langefalse, bissetCustomValidity('')aufgerufen wird – ein häufiger Grund für „dauerhaft ungültige“ Felder. - Vom Validieren ausgeschlossene Elemente (
disabled,readonly,type="hidden", Elemente innerhalb von<datalist>) meldenvalid === true, obwohl eventuell Regeln gesetzt sind. Mitel.willValidatelässt sich das prüfen. novalidateam Formular unterdrückt nur die automatische Prüfung beim Absenden –validity.validwird weiterhin korrekt berechnet.- Bei
<fieldset>istvalidimmertrue; nur die Pseudoklasse:invalidspiegelt ungültige Nachkommen wider. - Die Prüfung ist rein clientseitig und leicht zu umgehen – serverseitige Validierung bleibt immer nötig.
- Kompatibilität: In allen modernen Browsern unterstützt; sehr alte Browser (IE < 10) kennen die Constraint-Validation-API nicht.