Browser können viele Formulareingaben bereits vor dem Absenden überprüfen.
Dafür stellt HTML verschiedene Eingabetypen und Validierungsattribute zur
Verfügung. Diese Prüfung wird als Constraint Validation bezeichnet.
Formulareingaben automatisch prüfen
Die integrierte HTML-Validierung wird normalerweise ausgelöst, wenn ein
Formular über eine Schaltfläche mit type="submit" abgesendet
wird.
Bleibt das Feld leer oder besitzt die Eingabe kein gültiges
E-Mail-Format, verhindert der Browser das Absenden und zeigt einen
entsprechenden Hinweis an.
Eine Eingabe verpflichtend machen
Das boolesche Attribut required kennzeichnet ein Formularfeld
als Pflichtfeld. Das Formular kann erst abgesendet werden, wenn eine
gültige Eingabe oder Auswahl vorhanden ist.
Die Kennzeichnung als Pflichtfeld sollte nicht nur durch eine Farbe
erfolgen. Ein sichtbarer Hinweis wie „Pflichtfeld“ oder ein erklärtes
Sternchen erleichtert die Bedienung.
Passende Eingabetypen verwenden
Bestimmte Werte werden bereits durch den verwendeten
input-Typ geprüft. Der Browser kontrolliert dabei, ob die
Eingabe grundsätzlich zum erwarteten Format passt.
type="email" erwartet eine syntaktisch passende
E-Mail-Adresse.
type="url" erwartet eine syntaktisch passende URL.
Ein spezieller Eingabetyp verbessert häufig auch die Bedienung auf
Smartphones, weil eine zum Feld passende Bildschirmtastatur oder
Eingabeoberfläche angezeigt werden kann.
Die Textlänge festlegen
Mit minlength wird die erforderliche Mindestlänge und mit
maxlength die erlaubte Höchstlänge einer Texteingabe
festgelegt.
Im HTML-Quellcode werden Dezimalzahlen unabhängig von der Sprache mit
einem Punkt geschrieben, beispielsweise step="0.5".
Die Darstellung für Benutzer kann vom Browser und von den
Spracheinstellungen abhängen.
Ein Eingabemuster festlegen
Mit dem Attribut pattern kann für bestimmte Textfelder ein
regulärer Ausdruck als zusätzliches Eingabemuster festgelegt werden.
<label for="postleitzahl">
Österreichische Postleitzahl:
</label>
<input
type="text"
id="postleitzahl"
name="postleitzahl"
inputmode="numeric"
pattern="[0-9]{4}"
title="Geben Sie eine vierstellige Postleitzahl ein."
required>
Das Eingabemuster sollte zusätzlich in verständlicher Sprache erklärt
werden. Benutzer sollten nicht erst durch eine Fehlermeldung erfahren,
welches Format erwartet wird.
Einen zusätzlichen Hinweis angeben
Das title-Attribut kann eine kurze Erklärung zum erwarteten
Eingabeformat enthalten. Es sollte jedoch nicht die einzige sichtbare
Anleitung für das Feld sein.
Eine passende sichtbare Beschreibung könnte folgendermaßen ergänzt
werden:
<p id="kursnummer-hinweis">
Format: zwei Großbuchstaben, Bindestrich und drei Ziffern,
zum Beispiel HT-101.
</p>
<input
type="text"
name="kursnummer"
pattern="[A-Z]{2}-[0-9]{3}"
aria-describedby="kursnummer-hinweis"
required>
Die Browservalidierung deaktivieren
Mit dem booleschen Attribut novalidate am
form-Element wird die integrierte Validierung beim Absenden
des Formulars deaktiviert.
novalidate ist beispielsweise sinnvoll, wenn die vollständige
Validierung mit JavaScript umgesetzt wird. Eine Prüfung auf dem Server
bleibt trotzdem notwendig.
Eingaben zusätzlich auf dem Server prüfen
Die HTML-Validierung findet im Browser des Benutzers statt. Sie verbessert
die Bedienung und kann viele fehlerhafte Eingaben frühzeitig erkennen.
Sie ist jedoch keine Sicherheitsmaßnahme.
HTML-Attribute können verändert oder entfernt werden.
Anfragen können ohne das sichtbare Formular gesendet werden.
Die Browservalidierung kann bewusst umgangen werden.
Manipulierte oder schädliche Werte müssen abgefangen werden.
Alle empfangenen Daten müssen deshalb auf dem Server erneut geprüft
werden. Vor einer Ausgabe oder Speicherung müssen sie außerdem passend
zum jeweiligen Verwendungszweck sicher verarbeitet werden.
Praxisbeispiel: Veranstaltungsanmeldung
Das Lernbeispiel kombiniert Pflichtfelder, passende Eingabetypen,
Längenbegrenzungen, ein Eingabemuster und einen Zahlenbereich. Durch
onsubmit="return false;" wird die tatsächliche Übertragung
verhindert.
Gültigkeitszustände mit CSS gestalten
:valid, :invalid, :required und :optional
Formularfelder besitzen abhängig von ihren Attributen und ihrem aktuellen
Wert unterschiedliche Zustände. Mit CSS-Pseudoklassen können diese Zustände
ausgewählt und sichtbar gestaltet werden.
Gültige und ungültige Eingaben unterscheiden
Die Pseudoklasse :valid wählt Formularfelder aus, deren
aktueller Wert die festgelegten Anforderungen erfüllt.
:invalid gilt für Felder mit einem ungültigen Wert.
Ein leeres Pflichtfeld ist bereits ungültig. Deshalb kann eine rote
Markierung erscheinen, bevor der Benutzer überhaupt mit der Eingabe
begonnen hat. Dieses Verhalten sollte bei der Gestaltung berücksichtigt
werden.
Gültige Felder mit :valid auswählen
Ein Feld entspricht :valid, wenn sein Wert alle für dieses
Feld geltenden Anforderungen erfüllt.
Die Kennzeichnung sollte zusätzlich im Text erklärt werden. Eine farbige
Linie allein ist für Benutzer mit eingeschränktem Farbsehen möglicherweise
nicht ausreichend.
Ein noch leeres Feld erkennen
Die Pseudoklasse :placeholder-shown gilt, solange in einem
Feld der Platzhalter angezeigt wird. Damit kann ein noch nicht
ausgefülltes Feld von einem Feld mit Eingabe unterschieden werden.
Ein placeholder ersetzt kein label. Der
Platzhalter verschwindet bei der Eingabe und sollte daher nur eine
zusätzliche Hilfestellung enthalten.
Ungültige leere Felder nicht sofort rot markieren
Durch die Kombination von :invalid und
:not(:placeholder-shown) kann die Fehlermarkierung bei
Textfeldern auf Felder beschränkt werden, in die bereits etwas eingegeben
wurde.
Diese Technik eignet sich vor allem für Textfelder mit Platzhalter. Sie
erkennt jedoch nicht zuverlässig, ob ein Feld bereits besucht und danach
wieder geleert wurde. Für eine vollständige Steuerung wird häufig
JavaScript verwendet.
Fokus und Gültigkeitszustand kombinieren
Während der Eingabe kann eine starke Fehlermarkierung störend wirken. Mit
:not(:focus) wird sie erst angezeigt, wenn das Feld den Fokus
nicht mehr besitzt.
Der sichtbare Fokus darf dabei nicht entfernt werden. Benutzer, die mit
der Tastatur navigieren, müssen jederzeit erkennen können, welches Element
gerade aktiv ist.
Werte innerhalb und außerhalb eines Bereichs gestalten
Für Eingabefelder mit einem festgelegten Mindest- oder Höchstwert stehen
die Pseudoklassen :in-range und
:out-of-range zur Verfügung.
:out-of-range bedeutet, dass der Wert außerhalb des mit
min und max festgelegten Bereichs liegt.
Andere Validierungsfehler werden weiterhin mit :invalid
erfasst.
Bearbeitbare und schreibgeschützte Felder unterscheiden
Mit :read-only können nicht bearbeitbare Felder und mit
:read-write bearbeitbare Felder ausgewählt werden.
Ein Feld mit readonly kann nicht verändert werden, wird aber
beim Absenden des Formulars normalerweise übertragen. Ein Feld mit
disabled wird normalerweise nicht übertragen.
Aktivierte und deaktivierte Felder gestalten
Die Pseudoklassen :enabled und :disabled
unterscheiden bedienbare und deaktivierte Formularelemente.
Eine Submit-Schaltfläche sollte nicht allein mit CSS deaktiviert oder
unbedienbar gemacht werden. Benutzer müssen das Formular absenden können,
damit der Browser die ungültigen Felder anzeigen und erklären kann.
Praxisbeispiel: Zustände verständlich hervorheben
Das Beispiel verbindet sichtbare Hinweise mit einer zusätzlichen farblichen
Gestaltung. Die eigentliche Prüfung übernimmt weiterhin die integrierte
HTML-Validierung.
Validierung mit JavaScript steuern
Constraint Validation API
Mit JavaScript kann die integrierte HTML-Validierung abgefragt, ausgelöst und
durch eigene Meldungen ergänzt werden. Dafür stellt der Browser die
Constraint Validation API zur Verfügung.
Die Constraint Validation API
Die Constraint Validation API arbeitet mit den Validierungsregeln, die durch
HTML-Attribute wie required, min,
max, minlength oder pattern
festgelegt wurden.
Zu den wichtigsten Bestandteilen gehören:
checkValidity() – prüft die Gültigkeit eines Feldes oder
Formulars.
reportValidity() – prüft die Gültigkeit und zeigt
Browsermeldungen an.
setCustomValidity() – legt eine eigene Fehlermeldung fest.
validity – enthält einzelne Informationen über den
Gültigkeitszustand.
validationMessage – enthält die aktuelle
Validierungsmeldung.
willValidate – gibt an, ob ein Element überhaupt geprüft
wird.
JavaScript ergänzt die HTML-Validierung. Die grundlegenden Regeln sollten
möglichst weiterhin direkt mit den passenden HTML-Attributen beschrieben
werden.
Die Gültigkeit mit checkValidity() prüfen
Die Methode checkValidity() prüft, ob ein Formularfeld oder ein
vollständiges Formular gültig ist. Sie liefert true oder
false zurück.
const email = document.querySelector("#email");
if (email.checkValidity()) {
console.log("Die Eingabe ist gültig.");
} else {
console.log("Die Eingabe ist ungültig.");
}
Die Methode kann auch auf ein vollständiges Formular angewendet werden:
const formular = document.querySelector("#kontaktformular");
if (formular.checkValidity()) {
console.log("Das Formular ist gültig.");
} else {
console.log("Das Formular enthält Fehler.");
}
checkValidity() zeigt normalerweise keine sichtbare
Browsermeldung an. Die Methode liefert in erster Linie den aktuellen
Gültigkeitszustand.
Fehlermeldungen mit reportValidity() anzeigen
Die Methode reportValidity() prüft ebenfalls die Gültigkeit.
Bei einem Fehler zeigt der Browser zusätzlich seine integrierte
Validierungsmeldung an.
Im Unterschied zu checkValidity() fordert
reportValidity() den Browser ausdrücklich dazu auf, vorhandene
Validierungsfehler sichtbar anzuzeigen.
Einzelne Fehler über validity erkennen
Die Eigenschaft validity enthält ein
ValidityState-Objekt. Dieses Objekt beschreibt, welche
Validierungsregel nicht erfüllt ist.
valueMissing – ein Pflichtfeld ist leer.
typeMismatch – der Wert passt nicht zum Eingabetyp.
patternMismatch – der Wert entspricht nicht dem Muster.
tooShort – die erforderliche Mindestlänge wurde nicht
erreicht.
tooLong – die erlaubte Höchstlänge wurde überschritten.
rangeUnderflow – der Wert liegt unterhalb von
min.
rangeOverflow – der Wert liegt oberhalb von
max.
stepMismatch – der Wert entspricht nicht den erlaubten
Schritten.
badInput – der Browser konnte die Eingabe nicht in den
erwarteten Wert umwandeln.
customError – eine eigene Fehlermeldung wurde festgelegt.
valid – alle Anforderungen sind erfüllt.
const alter = document.querySelector("#alter");
if (alter.validity.valueMissing) {
console.log("Bitte geben Sie Ihr Alter ein.");
} else if (alter.validity.rangeUnderflow) {
console.log("Das Mindestalter beträgt 18 Jahre.");
} else if (alter.validity.rangeOverflow) {
console.log("Der eingegebene Wert ist zu hoch.");
}
Die aktuelle Meldung mit validationMessage auslesen
Die Eigenschaft validationMessage enthält die Meldung, die der
Browser für den aktuellen Validierungsfehler vorgesehen hat.
const feld = document.querySelector("#benutzername");
if (!feld.checkValidity()) {
console.log(feld.validationMessage);
}
Die genaue Formulierung hängt vom Browser und von dessen Spracheinstellungen
ab. Deshalb sollte der Programmcode nicht auf einen bestimmten Wortlaut der
Browsermeldung angewiesen sein.
Prüfen, ob ein Feld validiert wird
Die Eigenschaft willValidate liefert
true, wenn ein Formularfeld an der integrierten Validierung
teilnimmt.
Ein Feld mit readonly nimmt ebenfalls nicht an der
Constraint Validation teil. Sein Wert wird beim Absenden jedoch im
Unterschied zu einem deaktivierten Feld normalerweise übertragen.
Eine eigene Fehlermeldung festlegen
Mit setCustomValidity() kann einem Formularfeld eine eigene
Fehlermeldung zugewiesen werden.
const benutzername = document.querySelector("#benutzername");
benutzername.setCustomValidity(
"Dieser Benutzername ist bereits vergeben."
);
Solange eine nicht leere Meldung gesetzt ist, gilt das Feld als ungültig.
Sobald der Fehler nicht mehr besteht, muss die Meldung wieder gelöscht
werden:
benutzername.setCustomValidity("");
Das Zurücksetzen mit einer leeren Zeichenfolge ist besonders wichtig.
Andernfalls bleibt das Feld ungültig, obwohl der Benutzer seine Eingabe
bereits korrigiert hat.
Zusammengehörige Eingaben vergleichen
Manche Regeln lassen sich nicht mit einem einzelnen HTML-Attribut
beschreiben. Ein typisches Beispiel ist der Vergleich zweier
Passwortfelder.
Die Prüfung wird bei jeder Änderung eines der beiden Felder erneut
durchgeführt. Dadurch verschwindet die Fehlermeldung sofort, sobald beide
Eingaben übereinstimmen.
Auf das invalid-Ereignis reagieren
Das Ereignis invalid wird ausgelöst, wenn ein ungültiges Feld
während einer Gültigkeitsprüfung erkannt wird.
const email = document.querySelector("#kontakt-email");
email.addEventListener("invalid", function () {
console.log("Das E-Mail-Feld ist ungültig.");
});
Das Ereignis kann beispielsweise verwendet werden, um eine zusätzliche
CSS-Klasse zu setzen:
email.addEventListener("invalid", function () {
email.classList.add("has-error");
});
Das invalid-Ereignis steigt nicht wie viele andere Ereignisse
zu übergeordneten Elementen auf. Soll es zentral am Formular erfasst werden,
kann die Capture-Phase verwendet werden.
formular.addEventListener(
"invalid",
function (event) {
event.target.classList.add("has-error");
},
true
);
Das Absenden eines gültigen Formulars behandeln
Das submit-Ereignis wird bei aktivierter Browservalidierung nur
ausgelöst, wenn die HTML-Anforderungen erfüllt sind.
const formular = document.querySelector("#kontaktformular");
formular.addEventListener("submit", function (event) {
event.preventDefault();
console.log("Das Formular ist gültig.");
});
event.preventDefault() verhindert in einem Lernbeispiel die
tatsächliche Übertragung. In einem produktiven Formular darf das Absenden
nur verhindert werden, wenn die Daten stattdessen gezielt mit JavaScript
verarbeitet oder übertragen werden.
Ein Formular mit requestSubmit() absenden
Mit requestSubmit() kann das Absenden eines Formulars durch
JavaScript so ausgelöst werden, als hätte der Benutzer eine
Submit-Schaltfläche betätigt.
Dabei werden die integrierte Validierung und das
submit-Ereignis berücksichtigt.
Die ältere Methode submit() verhält sich anders:
requestSubmit() führt die Formularvalidierung aus.
requestSubmit() löst das submit-Ereignis aus.
submit() umgeht diese Schritte.
Für ein normales, programmgesteuertes Absenden ist
requestSubmit() daher in der Regel die passende Methode.
Praxisbeispiel: Kursanmeldung prüfen
Das Attribut novalidate verhindert hier nur die eingeblendeten
Standardmeldungen des Browsers. Die Gültigkeitsregeln bleiben bestehen und
können weiterhin mit checkValidity() abgefragt werden.
Die Bootstrap-Klasse was-validated macht die Zustände sichtbar.
JavaScript ersetzt keine serverseitige Prüfung
Auch eine umfangreiche JavaScript-Validierung wird im Browser ausgeführt und
kann verändert oder vollständig umgangen werden.
JavaScript kann deaktiviert oder manipuliert werden.
HTML-Attribute können im Browser verändert werden.
Anfragen können direkt an den Server gesendet werden.
Übertragene Werte können unerwartete Inhalte enthalten.
Der Server muss daher alle empfangenen Werte unabhängig von der Prüfung im
Browser erneut validieren. Die clientseitige Validierung verbessert die
Bedienung, während die serverseitige Validierung für die zuverlässige
Verarbeitung der Daten verantwortlich ist.