Einschränkungen bei Validierung
Die Erstellung von Webformularen war schon immer eine komplexe Aufgabe. Während das Markup des Formulars selbst einfach ist, ist die Überprüfung, ob jedes Feld einen gültigen und kohärenten Wert hat, schwieriger, und die Benutzer über das Problem zu informieren, kann zu Kopfschmerzen führen. HTML5 führte neue Mechanismen für Formulare ein: es fügte neue semantische Typen für das <input>
-Element und die Einschränkungsvalidierung hinzu, um die Überprüfung der Formularinhalte clientseitig zu erleichtern. Grundlegende, übliche Einschränkungen können ohne JavaScript überprüft werden, indem neue Attribute gesetzt werden; komplexere Einschränkungen können mit der Constraint Validation API getestet werden.
Für eine grundlegende Einführung in diese Konzepte mit Beispielen siehe das Formularvalidierungstutorial.
Hinweis: Die HTML-Einschränkungsvalidierung ersetzt nicht die Notwendigkeit einer Validierung serverseitig. Selbst wenn viel weniger ungültige Formulareingaben erwartet werden, können ungültige dennoch auf verschiedenen Wegen gesendet werden:
- Durch das Ändern von HTML über die Entwicklertools des Browsers.
- Durch manuelles Erstellen einer HTTP-Anfrage ohne das Formular zu verwenden.
- Durch programmatisches Schreiben von Inhalten in das Formular (bestimmte Einschränkungsvalidierungen werden nur bei Benutzereingaben durchgeführt und nicht, wenn Sie den Wert eines Formularfeldes mit JavaScript setzen).
Daher sollten Sie Formulardaten immer serverseitig validieren, übereinstimmend mit dem, was clientseitig gemacht wird.
Intrinsische und grundlegende Einschränkungen
In HTML werden grundlegende Einschränkungen auf zwei Arten deklariert:
- Durch die Wahl des semantisch passendsten Wertes für das
type
-Attribut des<input>
-Elements, z. B. erzeugt die Wahl des Typsemail
automatisch eine Einschränkung, die überprüft, ob der Wert eine gültige E-Mail-Adresse ist. - Durch das Setzen von Werten auf validierungsbezogenen Attributen, wodurch grundlegende Einschränkungen beschrieben werden können, ohne dass JavaScript benötigt wird.
Semantische Eingabetypen
Die intrinsischen Einschränkungen für das type
-Attribut sind:
Eingabetyp | Beschreibung der Einschränkung | Zugehöriger Verstoß |
---|---|---|
<input type="URL"> |
Der Wert muss eine absolute URL sein, wie in der URL Living Standard definiert. | TypeMismatch Einschränkungsverstoß |
<input type="email"> |
Der Wert muss eine syntaktisch gültige E-Mail-Adresse sein, die in der Regel das Format nutzername@hostname.tld hat, aber auch lokal wie nutzername@hostname sein kann. |
TypeMismatch Einschränkungsverstoß |
Für beide dieser Eingabetypen, wenn das multiple
-Attribut gesetzt ist, können mehrere Werte als kommagetrennte Liste gesetzt werden. Wenn einer dieser Werte die hier beschriebene Bedingung nicht erfüllt, wird der Type mismatch Einschränkungsverstoß ausgelöst.
Beachten Sie, dass die meisten Eingabetypen keine intrinsischen Einschränkungen haben, da einige von der Einschränkungsvalidierung ausgeschlossen sind oder einen Reinigungsalgorithmus haben, der falsche Werte in einen korrekten Standardwert umwandelt.
Validierungsbezogene Attribute
Zusätzlich zu dem oben beschriebenen type
-Attribut, werden die folgenden Attribute verwendet, um grundlegende Einschränkungen zu beschreiben:
Attribut | Eingabetypen, die das Attribut unterstützen | Mögliche Werte | Beschreibung der Einschränkung | Zugehöriger Verstoß |
---|---|---|---|---|
pattern |
text , search , url ,
tel , email , password
|
Ein
JavaScript-Regulärer Ausdruck
(kompiliert mit den global , ignoreCase , und
multiline -Flags deaktiviert)
|
Der Wert muss dem Muster entsprechen. |
patternMismatch
Einschränkungsverstoß
|
min |
range , number |
Eine gültige Zahl | Der Wert muss größer oder gleich dem Wert sein. |
rangeUnderflow
Einschränkungsverstoß
|
date , month , week |
Ein gültiges Datum | |||
datetime-local , time |
Ein gültiges Datum und Uhrzeit | |||
max |
range , number |
Eine gültige Zahl | Der Wert muss kleiner oder gleich dem Wert sein |
rangeOverflow
Einschränkungsverstoß
|
date , month , week |
Ein gültiges Datum | |||
datetime-local , time |
Ein gültiges Datum und Uhrzeit | |||
required |
text , search , url ,
tel , email , password ,
date , datetime-local ,
month , week , time ,
number , checkbox , radio ,
file ; auch für die <select> und
<textarea> Elemente
|
kein da es ein Boolean-Attribut ist: seine Anwesenheit bedeutet true, seine Abwesenheit bedeutet false | Es muss ein Wert vorhanden sein (wenn gesetzt). |
valueMissing
Einschränkungsverstoß
|
step |
date |
Eine ganze Zahl von Tagen |
Sofern der Schritt nicht auf den Wert any gesetzt ist, muss
der Wert min + ein ganzzahliges Vielfaches des Schritts
sein.
|
stepMismatch
Einschränkungsverstoß
|
month |
Eine ganze Zahl von Monaten | |||
week |
Eine ganze Zahl von Wochen | |||
datetime-local , time |
Eine ganze Zahl von Sekunden | |||
range , number |
Eine ganze Zahl | |||
minlength |
text , search , url ,
tel , email , password ; auch für das
<textarea> Element
|
Eine ganze Länge |
Die Anzahl der Zeichen (Codepunkte) darf nicht kleiner sein als der Wert
des Attributs, wenn nicht leer. Alle Zeilenumbrüche werden normalisiert
auf ein einziges Zeichen (im Gegensatz zu CRLF-Paaren) für
<textarea> .
|
tooShort
Einschränkungsverstoß
|
maxlength |
text , search , url ,
tel , email , password ; auch für das
<textarea> Element
|
Eine ganze Länge | Die Anzahl der Zeichen (Codepunkte) darf den Wert des Attributs nicht überschreiten. |
tooLong
Einschränkungsverstoß
|
Prozess der Einschränkungsvalidierung
Die Einschränkungsvalidierung erfolgt mittels der Constraint Validation API entweder auf einem einzelnen Formularelement oder auf der Formularebene selbst, auf dem <form>
-Element. Die Einschränkungsvalidierung erfolgt auf folgende Weise:
- Durch einen Aufruf der Methoden
checkValidity()
oderreportValidity()
einer formularassoziierten DOM-Schnittstelle, (HTMLInputElement
,HTMLSelectElement
,HTMLButtonElement
,HTMLOutputElement
oderHTMLTextAreaElement
), die die Einschränkungen nur für dieses Element bewertet, was einem Skript ermöglicht, diese Information zu erhalten. Die MethodecheckValidity()
gibt einen Boolean zurück, der angibt, ob der Wert des Elements seine Einschränkungen erfüllt. (Dies wird in der Regel gemacht, wenn der Benutzeragent bestimmt, welche der CSS-Pseudoklassen,:valid
oder:invalid
, zutrifft.) Im Gegensatz dazu berichtet die MethodereportValidity()
dem Benutzer über eventuelle Einschränkungsfehler. - Durch einen Aufruf der Methoden
checkValidity()
oderreportValidity()
auf derHTMLFormElement
Schnittstelle. - Durch das tatsächliche Absenden des Formulars.
Das Aufrufen von checkValidity()
wird statische Validierung der Einschränkungen genannt, während das Aufrufen von reportValidity()
oder das Absenden des Formulars interaktive Validierung der Einschränkungen genannt wird.
Hinweis:
- Wenn das
novalidate
-Attribut auf dem<form>
-Element gesetzt ist, erfolgt keine interaktive Validierung der Einschränkungen. - Das Aufrufen der Methode
submit()
auf derHTMLFormElement
Schnittstelle löst keine Einschränkungsvalidierung aus. Mit anderen Worten, diese Methode sendet die Formulardaten an den Server, auch wenn sie die Einschränkungen nicht erfüllen. Stattdessen sollte dieclick()
-Methode auf einer Absende-Schaltfläche aufgerufen werden. - Die
minlength
undmaxlength
Einschränkungen werden nur bei benutzergenerierter Eingabe überprüft. Sie werden nicht überprüft, wenn ein Wert programmgesteuert gesetzt wird, selbst bei einem expliziten Aufruf voncheckValidity()
oderreportValidity()
.
Komplexe Einschränkungen unter Verwendung der Constraint Validation API
Unter Verwendung von JavaScript und der Constraint API ist es möglich, komplexere Einschränkungen zu implementieren, wie beispielsweise Einschränkungen, die mehrere Felder kombinieren, oder Einschränkungen, die komplexe Berechnungen erfordern.
Im Wesentlichen ist die Idee, JavaScript bei einem bestimmten Ereignis eines Formularfelds (wie onchange) auszulösen, um zu berechnen, ob eine Einschränkung verletzt ist, und dann die Methode field.setCustomValidity()
zu verwenden, um das Ergebnis der Validierung festzulegen: ein leerer String bedeutet, dass die Einschränkung erfüllt ist, und jeder andere String bedeutet, dass es einen Fehler gibt und dieser String die Fehlermeldung ist, die dem Benutzer angezeigt wird.
Einschränkungen, die mehrere Felder kombinieren: Postleitzahlvalidierung
Das Format der Postleitzahl variiert von Land zu Land. Nicht nur erlauben die meisten Länder eine optionale Präfix mit dem Ländercode (wie D-
in Deutschland, F-
in Frankreich oder der Schweiz), sondern einige Länder haben Postleitzahlen mit lediglich einer festen Anzahl von Ziffern; andere, wie das Vereinigte Königreich, haben komplexere Strukturen, die an bestimmten Positionen Buchstaben erlauben.
Hinweis: Dies ist keine umfassende Bibliothek zur Postleitzahlvalidierung, sondern vielmehr eine Demonstration der Schlüsselkonzepte.
Als Beispiel werden wir ein Skript hinzufügen, das die Einschränkungsvalidierung für ein Formular überprüft:
<form>
<label for="postal-code">Postal Code: </label>
<input type="text" id="postal-code" />
<label for="country">Country: </label>
<select id="country">
<option value="ch">Switzerland</option>
<option value="fr">France</option>
<option value="de">Germany</option>
<option value="nl">The Netherlands</option>
</select>
<input type="submit" value="Validate" />
</form>
Dies zeigt das folgende Formular an:
Zuerst schreiben wir eine Funktion, die die Einschränkung selbst überprüft:
function checkPostalCode() {
// For each country, defines the pattern that the postal code has to follow
const constraints = {
ch: [
"^(CH-)?\\d{4}$",
"Swiss postal codes must have exactly 4 digits: e.g. CH-1950 or 1950",
],
fr: [
"^(F-)?\\d{5}$",
"French postal codes must have exactly 5 digits: e.g. F-75012 or 75012",
],
de: [
"^(D-)?\\d{5}$",
"German postal codes must have exactly 5 digits: e.g. D-12345 or 12345",
],
nl: [
"^(NL-)?\\d{4}\\s*([A-RT-Z][A-Z]|S[BCE-RT-Z])$",
"Dutch postal codes must have exactly 4 digits, followed by 2 letters except SA, SD and SS",
],
};
// Read the country id
const country = document.getElementById("country").value;
// Get the NPA field
const postalCodeField = document.getElementById("postal-code");
// Build the constraint checker
const constraint = new RegExp(constraints[country][0], "");
console.log(constraint);
// Check it!
if (constraint.test(postalCodeField.value)) {
// The postal code follows the constraint, we use the ConstraintAPI to tell it
postalCodeField.setCustomValidity("");
} else {
// The postal code doesn't follow the constraint, we use the ConstraintAPI to
// give a message about the format required for this country
postalCodeField.setCustomValidity(constraints[country][1]);
}
}
Dann verknüpfen wir es mit dem onchange-Ereignis für das <select>
und dem oninput-Ereignis für das <input>
:
window.onload = () => {
document.getElementById("country").onchange = checkPostalCode;
document.getElementById("postal-code").oninput = checkPostalCode;
};
Begrenzung der Dateigröße vor dem Hochladen
Eine weitere häufige Einschränkung besteht darin, die Größe einer hochzuladenden Datei zu begrenzen. Dies clientseitig zu überprüfen, bevor die Datei an den Server übertragen wird, erfordert die Kombination der Constraint Validation API, und besonders der Methode field.setCustomValidity()
, mit einer anderen JavaScript API, hier der Datei-API.
Hier ist der HTML-Teil:
<label for="fs">Select a file smaller than 75 kB: </label>
<input type="file" id="fs" />
Dies wird angezeigt:
Das JavaScript liest die ausgewählte Datei, nutzt die Methode File.size()
, um deren Größe zu erhalten, vergleicht diese mit dem (hart kodierten) Limit und ruft die Constraint API auf, um den Browser über einen Verstoß zu informieren:
function checkFileSize() {
const fs = document.getElementById("fs");
const files = fs.files;
// If there is (at least) one file selected
if (files.length > 0) {
if (files[0].size > 75 * 1000) {
// Check the constraint
fs.setCustomValidity("The selected file must not be larger than 75 kB");
fs.reportValidity();
return;
}
}
// No custom constraint violation
fs.setCustomValidity("");
}
Schließlich verknüpfen wir die Methode mit dem richtigen Ereignis:
window.onload = () => {
document.getElementById("fs").onchange = checkFileSize;
};
Visuelle Gestaltung der Einschränkungsvalidierung
Abgesehen vom Setzen von Einschränkungen möchten Webentwickler kontrollieren, welche Nachrichten den Benutzern angezeigt werden und wie diese gestaltet sind.
Kontrolle des Aussehens von Elementen
Das Erscheinungsbild von Elementen kann über CSS-Pseudoklassen gesteuert werden.
:required und :optional CSS-Pseudoklassen
Die :required
und :optional
Pseudoklassen ermöglichen das Schreiben von Selektoren, die Formularelemente auswählen, die das required
-Attribut besitzen, oder die es nicht besitzen.
:placeholder-shown CSS-Pseudoklasse
Siehe :placeholder-shown
.
:valid :invalid CSS-Pseudoklassen
Die :valid
und :invalid
Pseudoklassen repräsentieren <input>
-Elemente, deren Inhalt gemäß den Typeneinstellungen des Eingabefelds validiert oder nicht validiert wird. Diese Klassen ermöglichen es dem Benutzer, gültige oder ungültige Formularelemente zu gestalten, um es einfacher zu machen, Elemente zu identifizieren, die entweder korrekt oder falsch formatiert sind.
Kontrolle des Textes von Einschränkungsverstößen
Die folgenden Punkte können helfen, den Text eines Einschränkungsverstoßes zu steuern:
-
Die Methode
setCustomValidity(message)
auf den folgenden Elementen:<fieldset>
. Hinweis: Das Setzen einer benutzerdefinierten Gültigkeitsmeldung auf Fieldset-Elementen verhindert nicht die Formularübermittlung in den meisten Browsern.<input>
<output>
<select>
- Absende-Schaltflächen (erstellt mit entweder einem
<button>
-Element mit dem Typsubmit
oder eineminput
-Element mit dem submit-Typ. Andere Arten von Schaltflächen nehmen nicht an der Einschränkungsvalidierung teil.) <textarea>
-
Die
ValidityState
Schnittstelle beschreibt das Objekt, das von dervalidity
-Eigenschaft der oben aufgelisteten Elementtypen zurückgegeben wird. Es repräsentiert verschiedene Möglichkeiten, wie ein eingegebener Wert ungültig sein kann. Zusammen helfen sie zu erklären, warum der Wert eines Elements nicht gültig ist, wenn er nicht gültig ist.