Formulare

Die meisten Websites und Anwendungen enthalten ein Webformular. Witzewebsites wie DoWebsitesMussAussehenGenauDerSameInEveryBrowser.com hat möglicherweise kein Format, aber selbst MachineLearningWorkshop.com (MLW), die ursprünglich ein Witz am 1. April war, gibt es zwar ein, wenn auch ein Fake-Format. Der Haupt-Call-to-Action von MLW ist ein Anmeldeformular, in dem Computer sich zu einem Workshop anmelden können. Dieses Formular ist in einem <form>-Element enthalten.

Das HTML-<form>-Element kennzeichnet ein Landmark eines Dokuments, das interaktive Steuerelemente zum Senden von Informationen enthält. In einem <form> sind alle interaktiven (und nicht interaktiven) Formularsteuerelemente aufgeführt, aus denen sich dieses Formular zusammensetzt.

HTML ist leistungsstark. In diesem Abschnitt geht es um die Möglichkeiten von HTML und die Möglichkeiten von HTML ohne Hinzufügen von JavaScript. Die clientseitige Verwendung von Formulardaten zur Aktualisierung der Benutzeroberfläche erfordert im Allgemeinen CSS oder JavaScript, was an dieser Stelle nicht behandelt wird. Es gibt einen ganzen Kurs Lernformulare. Dieser Abschnitt wird hier nicht dupliziert, aber wir führen verschiedene Formularsteuerelemente und die HTML-Attribute ein, die diese unterstützen.

Mit Formularen können Sie Nutzern ermöglichen, mit Ihrer Website oder App zu interagieren, die eingegebenen Informationen zu validieren und die Daten an einen Server zu senden. Mithilfe von HTML-Attributen kann festgelegt werden, dass Nutzer Formularsteuerelemente auswählen oder einen Wert eingeben müssen. HTML-Attribute können bestimmte Kriterien definieren, denen der Wert entsprechen muss, um gültig zu sein. Wenn der Nutzer versucht, das Formular zu senden, durchlaufen alle Formularsteuerungswerte die clientseitige Einschränkungsvalidierung und können die Übermittlung verhindern, bis die Daten die erforderlichen Kriterien erfüllen – ganz ohne JavaScript. Sie können dieses Feature auch deaktivieren: Wenn Sie das Attribut novalidate für <form> oder häufiger formnovalidate für eine Schaltfläche festlegen und die Formulardaten zur späteren Vervollständigung speichern, wird die Validierung verhindert.

Formulare senden

Formulare werden gesendet, wenn der Nutzer eine im Formular verschachtelte Schaltfläche zum Senden aktiviert. Wenn Sie <input> für Schaltflächen verwenden, ist der „Wert“ das Label der Schaltfläche und wird in der Schaltfläche angezeigt. Bei Verwendung von <button> ist das Label der Text zwischen dem öffnenden und dem schließenden <button>-Tag. Es gibt zwei Möglichkeiten, eine Senden-Schaltfläche zu erstellen:

<input type="submit" value="Submit Form">
<button type="submit">Submit Form</button>

Für ein sehr einfaches Formular benötigen Sie ein <form>-Element mit einigen Formulareingaben und einer Schaltfläche zum Senden. Aber das Senden eines Formulars ist mehr als das.

Die Attribute des Elements <form> legen die HTTP-Methode, über die das Formular gesendet wird, und die URL fest, über die das Formular gesendet wird. Ja, Formulare können ohne JavaScript gesendet, verarbeitet und eine neue Seite geladen werden. Das <form>-Element ist so leistungsstark.

Die Attributwerte action und method des <form>-Elements definieren die URL, die die Formulardaten verarbeitet, bzw. die HTTP-Methode zum Senden der Daten. Standardmäßig werden die Formulardaten an die aktuelle Seite gesendet. Andernfalls legen Sie für das Attribut action die URL fest, an die die Daten gesendet werden sollen.

Die gesendeten Daten bestehen aus Name/Wert-Paaren der verschiedenen Formularsteuerelemente des Formulars. Standardmäßig umfasst dies alle im Formular verschachtelten Formularsteuerelemente, die ein name haben. Mit dem Attribut form ist es jedoch möglich, Formularsteuerelemente außerhalb des <form>s einzufügen und Formularsteuerelemente auszulassen, die im <form> verschachtelt sind. Das Attribut form wird von Formularsteuerelementen und <fieldset> unterstützt und verwendet als Wert den id der Form des Steuerelements, mit dem es verknüpft ist, nicht unbedingt in der Form, in der es verschachtelt ist. Das heißt, Formularsteuerelemente müssen nicht physisch in einem <form> verschachtelt sein.

Das Attribut method definiert das HTTP-Protokoll der Anfrage: in der Regel GET oder POST. Mit GET werden die Formulardaten als Parameterstring von name=value-Paaren gesendet, die an die URL der action angehängt werden.

Mit POST werden die Daten an den Text der HTTP-Anfrage angehängt. Verwenden Sie beim Senden von sicheren Daten wie Passwörtern und Kreditkartendaten immer POST.

Es gibt auch die Methode DIALOG. Wenn sich ein <form method="dialog"> innerhalb eines <dialog> befindet, wird durch Senden des Formulars das Dialogfeld geschlossen. Es wird ein Sendeereignis ausgelöst, obwohl die Daten weder gelöscht noch gesendet werden. Auch ohne JavaScript. Dies wird im Abschnitt des Dialogfelds erläutert. Da das Formular dadurch nicht gesendet wird, sollten Sie sowohl formmethod="dialog" als auch formnovalidate in die Schaltfläche zum Senden aufnehmen.

Formularschaltflächen können mehr als die am Anfang dieses Abschnitts beschriebenen Attribute haben. Wenn die Schaltfläche ein formaction-, formenctype-, formmethod-, formnovalidate- oder formtarget-Attribut enthält, haben die für die Schaltfläche zum Aktivieren der Formularübermittlung festgelegten Werte Vorrang vor den für <form> festgelegten Werten für action, enctype, method und target. Die Überprüfung der Einschränkung erfolgt vor dem Senden des Formulars, jedoch nur, wenn weder ein formnovalidate auf der aktivierten Schaltfläche zum Senden noch ein novalidate auf der <form> vorhanden ist.

Um zu ermitteln, welche Schaltfläche zum Senden eines Formulars verwendet wurde, weisen Sie der Schaltfläche ein name zu. Schaltflächen ohne Namen oder Wert werden beim Senden des Formulars nicht mit den Formulardaten gesendet.

Nach dem Absenden des Formulars

Wenn der Nutzer ein ausgefülltes Onlineformular absendet, werden die Namen und Werte der relevanten Formularsteuerelemente übermittelt. Der Name ist der Wert des Attributs name. Die Werte stammen aus dem Inhalt des Attributs value oder aus dem vom Nutzer eingegebenen oder ausgewählten Wert. Der Wert eines <textarea> ist sein innerer Text. Der Wert von <select> ist der value der ausgewählten <option>. Wenn <option> kein value-Attribut enthält, ist der Wert der innere Text der ausgewählten Option.

<form method="GET">
  <label for="student">Pick a student:</label>
  <select name="student" id="student">
    <option value="hoover">Hoover Sukhdeep</option>
    <option>Blendan Smooth</option>
    <option value="toasty">Toasty McToastface</option>
  </select>
  <input type="submit" value="Submit Form">
</form>

Wenn Sie „Hoover Sukhdeep“ auswählen (oder nichts tun, da der Browser standardmäßig den ersten Optionswert auswählt) und dann auf die Schaltfläche „Senden“ klicken, wird die Seite neu geladen. Die URL wird wie folgt festgelegt:

https://web.dev/learn/html/forms?student=hoover

Da die zweite Option kein value-Attribut hat, wird der innere Text als Wert gesendet. Wenn Sie „Blendan Smooth“ auswählen und auf die Schaltfläche „Senden“ klicken, wird die Seite neu geladen. Die URL wird so festgelegt:

https://web.dev/learn/html/forms?student=Blendan+Smooth

Wenn ein Formular gesendet wird, umfassen die gesendeten Informationen die Namen und Werte aller benannten Formularsteuerelemente, die ein name haben. Ausgenommen sind nicht angeklickte Kästchen, nicht ausgewählte Optionsfelder sowie die Namen und Werte aller anderen Schaltflächen als der, über die das Formular gesendet wurde. Bei allen anderen Formularsteuerelementen wird das name der Formularsteuerung mit einem leeren Wert gesendet, wenn die Formularsteuerung einen Namen hat, aber kein Wert eingegeben oder voreingestellt wurde.

Es gibt 22 Eingabetypen, daher können wir nicht alle abdecken. Beachten Sie jedoch, dass das Einfügen eines Werts optional ist und häufig auch ungünstig ist, wenn Nutzende Informationen eingeben sollen. Für <input>-Elemente, bei denen der Nutzer den Wert nicht bearbeiten kann, sollten Sie immer einen Wert angeben. Dies gilt auch für Eingabeelemente vom Typ hidden, radio, checkbox, submit, button und reset.

Die Verwendung eindeutiger names für Formularsteuerelemente vereinfacht die serverseitige Datenverarbeitung und wird empfohlen. Kästchen und Optionsfelder sind Ausnahmen von dieser Regel.

Optionsfelder

Falls Sie jemals bemerkt haben, dass bei der Auswahl eines Optionsfelds innerhalb einer Gruppe von Optionsfeldern jeweils nur eines ausgewählt werden kann, liegt dies am Attribut name. Dieser Effekt kann nur einmal ausgewählt werden, indem jedem Optionsfeld in einer Gruppe dieselbe name zugewiesen wird.

Eine name sollte für die Gruppe eindeutig sein: Wenn Sie versehentlich dieselbe name für zwei separate Gruppen verwenden und ein Optionsfeld in der zweiten Gruppe auswählen, wird die Auswahl aller in der ersten Gruppe mit derselben name getroffenen Auswahlen aufgehoben.

Die name und die value des ausgewählten Optionsfelds werden mit dem Formular gesendet. Jedes Optionsfeld muss einen relevanten (und normalerweise eindeutigen) value haben. Die Werte der nicht ausgewählten Optionsfelder werden nicht gesendet.

Sie können auf einer Seite beliebig viele Optionsfelder verwenden, wobei jede Gruppe unabhängig voneinander arbeitet, solange jede eine für die Gruppe eindeutige name hat.

Wenn Sie die Seite laden möchten, während eines der Optionsfelder in einer Gruppe mit demselben Namen ausgewählt ist, fügen Sie das Attribut checked ein. Dieses Optionsfeld entspricht der CSS-Pseudoklasse :default, auch wenn der Nutzer ein anderes Optionsfeld auswählt. Das aktuell ausgewählte Optionsfeld entspricht der Pseudoklasse :checked.

Wenn der Nutzer ein Optionsfeld aus einer Gruppe von Optionsfeldern auswählen muss, fügen Sie mindestens einem der Steuerelemente das Attribut required hinzu. Wenn Sie required in ein Optionsfeld in einer Gruppe einfügen, ist eine Auswahl für die Formularübermittlung erforderlich. Es muss jedoch nicht das Optionsfeld mit dem ausgewählten Attribut sein, um gültig zu sein. Gib außerdem in <legend> deutlich an, dass das Formularsteuerelement erforderlich ist. Die Beschriftung von Gruppen von Optionsfeldern zusammen mit jeder einzelnen Schaltfläche wird später beschrieben.

Kästchen

Es gilt, dass alle Kästchen innerhalb einer Gruppe dieselbe name haben. Nur für ausgewählte Kästchen werden name und value mit dem Formular gesendet. Wenn Sie mehrere Kästchen mit demselben Namen ausgewählt haben, wird derselbe Name mit (hoffentlich) unterschiedlichen Werten gesendet. Wenn Sie mehrere Formularsteuerelemente mit demselben Namen haben, werden sie alle durch kaufmännisches Und-Zeichen (&) gesendet, auch wenn es sich dabei nicht nur um Kontrollkästchen handelt.

Wenn Sie kein value in ein Kästchen einfügen, wird der Wert der ausgewählten Kästchen standardmäßig auf on gesetzt, was wahrscheinlich nicht hilfreich ist. Wenn drei Kästchen mit dem Namen „chk“ angeklickt sind und alle Kästchen angeklickt sind, ist das gesendete Formular nicht lesbar:

https://web.dev/learn/html/forms?chk=on&chk=on&chk=on

Damit ein Kästchen erforderlich ist, fügen Sie das Attribut required hinzu. Informieren Sie den Nutzer immer, wenn ein Kästchen angeklickt werden muss oder wenn Formularsteuerelemente erforderlich sind. Wenn Sie einem Kästchen required hinzufügen, ist nur dieses Kästchen erforderlich. Andere Kästchen mit demselben Namen sind davon nicht betroffen.

Labels und Feldsätze

Damit Nutzende wissen, wie sie ein Formular ausfüllen, muss das Formular barrierefrei sein. Jede Formularsteuerung muss ein Label haben. Sie möchten auch Gruppen von Formularsteuerelementen mit Labels versehen. Während einzelne Eingabe-, Auswahl- und Textfelder mit <label> beschriftet sind, werden Gruppen von Formularsteuerelementen durch den Inhalt des <legend> der <fieldset> gekennzeichnet, die sie gruppieren.

In den vorherigen Beispielen ist Ihnen vielleicht aufgefallen, dass mit Ausnahme der Schaltfläche „Senden“ jedes Formularsteuerelement ein <label> hatte. Labels stellen Steuerelemente für Formulare mit barrierefreien Namen bereit. Der leicht zugängliche Name von Schaltflächen ist aus dem Inhalt oder dem Wert abgeleitet. Für alle anderen Formularsteuerelemente ist ein verknüpftes <label> erforderlich. Wenn kein zugehöriges Label vorhanden ist, rendert der Browser zwar die Formularsteuerelemente, die Nutzer wissen jedoch nicht, welche Informationen erwartet werden.

Wenn Sie eine Formularsteuerung explizit mit einer <label> verknüpfen möchten, fügen Sie das Attribut for im <label> ein: den Wert für id der Formularsteuerung, mit der sie verknüpft ist.

<label for="full_name">Your name</label>
<input type="text" id="full_name" name="name">

Die Verknüpfung von Labels mit Steuerelementen für Formulare bietet mehrere Vorteile. Durch Labels werden Formularsteuerelemente für Nutzer von Screenreadern zugänglich, indem dem Steuerelement ein zugänglicher Name zugewiesen wird. Labels sind auch „Hit Areas“. Sie machen die Website für Nutzer mit Fingerfertigkeiten nutzbarer, indem sie den Bereich vergrößern. Wenn Sie eine Maus verwenden, klicken Sie irgendwo auf das Label „Mein Name“. Dadurch liegt der Eingabefokus.

Wenn du implizite Labels erstellen möchtest, füge das Formularsteuerelement zwischen dem öffnenden und dem schließenden <label>-Tag ein. Dies ist sowohl aus der Perspektive eines Screenreaders als auch aus der Perspektive eines Zeigergeräts möglich, bietet jedoch keinen Stil-Hook wie das explizite Label.

<label>Your name
  <input type="text" name="name">
</label>

Da Labels „Trefferbereiche“ sind, sollten Sie keine interaktiven Elemente in einem expliziten Label oder andere interaktive Komponenten außer der mit Labels versehenen Formularsteuerung in einem impliziten Label einschließen. Wenn Sie beispielsweise einen Link in ein Label einfügen, während der Browser den HTML-Code rendert, werden Ihre Nutzer verwirrt, wenn sie auf das Label klicken, um eine Formularsteuerung aufzurufen, aber auf eine neue Seite weitergeleitet werden.

Im Allgemeinen steht <label> vor dem Formularsteuerelement, außer bei Optionsfeldern und Kästchen. Dies ist jedoch nicht erforderlich. Es ist nur das übliche UX-Muster. Die Reihe "Formulare lernen" enthält Informationen zum Formulardesign.

Bei Gruppen von Optionsfeldern und Kästchen gibt das Label den zugänglichen Namen der Formularsteuerung an, mit der es verknüpft ist. Die Gruppe der Steuerelemente und ihre Labels benötigen jedoch auch ein Label. Gruppieren Sie alle Elemente in einem <fieldset>, um die Gruppe mit einem Label zu versehen. Dabei stellt <legend> das Label für die Gruppe bereit.

<fieldset>
  <legend>Who is your favorite student?</legend>
  <ul>
    <li>
      <label>
        <input type="radio" value="blendan" name="machine"> Blendan Smooth
      </label>
    </li>
    <li>
      <label>
        <input type="radio" value="hoover" name="machine"> Hoover Sukhdeep
      </label>
    </li>
    <li>
      <label>
        <input type="radio" value="toasty" name="machine"> Toasty McToastface
      </label>
    </li>
  </ul>
</fieldset>

In diesem Beispiel kennzeichnet jedes implizite <label> ein Optionsfeld und <legend> stellt das Label für die Gruppe von Optionsfeldern bereit. Ein <fieldset> in einem anderen <fieldset> zu verschachteln ist Standard. Wenn ein Formular beispielsweise eine Umfrage mit vielen Fragen ist, die in Gruppen ähnlicher Fragen unterteilt sind, kann das <fieldset>-Element „Lieblingsschüler“ in einem anderen <fieldset>-Element namens „Meine Favoriten“ verschachtelt sein:

<fieldset>
  <legend>Your favorites:</legend>
  <ul start="6">
    <li>
      <fieldset>
        <legend>Who is your favorite student?</legend>
        <ul>
          <li>
            <!-- the rest of the code here -->

Die Standarddarstellung dieser Elemente hat zu einer unzureichenden Verwendung geführt, allerdings können <legend> und <fieldset> mit CSS gestaltet werden. Neben allen globalen Attributen unterstützt <fieldset> auch die Attribute name, disabled und form. Wenn Sie einen Feldsatz deaktivieren, werden alle verschachtelten Formularsteuerelemente deaktiviert. Weder die Attribute name noch die Attribute form werden bei <fieldset> häufig verwendet. Über name kann mit JavaScript auf den Feldsatz zugegriffen werden. Der Feldsatz selbst ist jedoch nicht in den gesendeten Daten enthalten (die darin verschachtelten benannten Formularsteuerelemente sind enthalten).

Eingabetypen und dynamische Tastatur

Wie bereits erwähnt, gibt es 22 verschiedene Arten von Eingaben. Wenn ein Nutzer ein Gerät mit einer dynamischen Tastatur verwendet, die nur bei Bedarf angezeigt wird, z. B. ein Smartphone, bestimmt der verwendete Eingabetyp in einigen Fällen den Typ der angezeigten Tastatur. Die angezeigte Standardtastatur kann für den erforderlichen Eingabetyp optimiert werden. Bei Eingabe von tel wird beispielsweise eine Tastatur angezeigt, die für die Eingabe von Telefonnummern optimiert ist. email enthält @ und . und die dynamische Tastatur für url enthält einen Doppelpunkt und einen Schrägstrich. Leider verwendet das iPhone immer noch nicht : in der standardmäßigen dynamischen Tastatur für url-Eingabetypen.

Tastaturen für <input type="tel"> auf einem iPhone und zwei verschiedenen Android-Smartphones:

iPhone-Tastatur, auf der die Eingabe type=tel. Android-Tastatur mit Eingabetyp=Tel. Android-Tastatur mit Eingabetyp=Tel.

Tastaturen für <input type="email"> auf einem iPhone und zwei verschiedenen Android-Smartphones:

iPhone-Tastatur mit Eingabetyp=E-Mail. Android-Tastatur mit Eingabetyp=E-Mail. Android-Tastatur mit Eingabetyp=E-Mail.

Zugriff auf Mikrofon und Kamera

Der Dateieingabetyp <input type="file"> ermöglicht das Hochladen von Dateien über Formulare. Dateien können einen beliebigen Typ haben, der durch das Attribut accept definiert und begrenzt wird. Die Liste der zulässigen Dateitypen kann eine durch Kommas getrennte Liste von Dateierweiterungen, ein globaler Typ oder eine Kombination aus globalen Typen und Erweiterungen sein. accept="video/*, .gif" akzeptiert beispielsweise alle Videodateien oder animierten GIFs. Verwenden Sie „audio/*“ für Audiodateien, „video/*“ für Videodateien und „image/*“ für Bilddateien.

Das Aufzählungsattribut capture, das in der Spezifikation zur Medienaufnahme definiert ist, kann verwendet werden, wenn eine neue Mediendatei mit der Kamera oder dem Mikrofon des Nutzers erstellt werden soll. Du kannst den Wert für die Eingabegeräte für Nutzer auf user oder für die Rückkamera oder das Mikrofon des Smartphones auf environment setzen. Im Allgemeinen funktioniert die Verwendung von capture ohne Wert, da der Nutzer das gewünschte Eingabegerät auswählen kann.

<label for="avatar">A recent photo of yourself:</label>
<input type="file" capture="user" accept="image/*" name="avatar" id="avatar">

Integrierte Validierung

Ohne JavaScript kann HTML verhindern, dass Formulare mit ungültigen Werten gesendet werden.

Es gibt einige CSS-Selektoren, die Formularsteuerungen basierend auf dem Vorhandensein von HTML-Attributen zuordnen. Dazu gehören :required und :optional, wenn der boolesche Wert required festgelegt ist oder nicht; :default, wenn checked hartcodiert ist; und :enabled oder :disabled, je nachdem, ob das Element vorhanden ist und :disabled :disabled, je nachdem, ob das Element interaktiv ist und ob {1.2/Attribut {2.3.disabled Die Pseudoklasse :read-write gleicht Elemente mit contenteditable-Set- und Formularsteuerelementen ab, die standardmäßig bearbeitet werden können, z. B. die Eingabetypen number, password und text (aber keine Kästchen, Optionsfelder oder den Typ hidden). Wenn für ein Element, das normalerweise beschreibbar ist, das Attribut readonly festgelegt ist, entspricht es stattdessen :read-only.

Wenn der Nutzer Informationen in die Formularsteuerelemente eingibt, werden die CSS-UI-Selektoren, einschließlich :valid, :invalid, :in-range und :out-of-range, je nach Status ein- und ausgeschaltet. Wenn der Nutzer eine Formularsteuerung schließt, wird entweder die noch nicht vollständig unterstützte Pseudoklasse :user-invalid oder die Pseudoklasse :user-valid übereinstimmen.

Mithilfe von CSS können Sie Hinweise darauf bereitstellen, ob Steuerelemente für Formulare erforderlich und gültig sind, wenn der Nutzer mit dem Formular interagiert. Sie können sogar CSS verwenden, um zu verhindern, dass Nutzer auf die Schaltfläche „Senden“ klicken können, bis das Formular gültig ist:

form:invalid [type="submit"] {
  opacity: 50%;
  pointer-events: none;
}

Dieses CSS-Snippet ist ein Anti-Muster. Auch wenn Ihre Benutzeroberfläche intuitiv und klar erscheint, versuchen viele Nutzer, ein Formular einzureichen, um Fehlermeldungen zu erhalten. Wenn eine Schaltfläche zum Senden auf diese Weise deaktiviert erscheint, ist keine Überprüfung der Einschränkung möglich, ein Feature, auf das sich viele Nutzer verlassen.

Der angewendete CSS-Code wird fortlaufend anhand des aktuellen Status der Benutzeroberfläche aktualisiert. Wenn Sie beispielsweise Eingabetypen mit Einschränkungen wie email, number, url und Datumstypen einschließen und der Wert nicht null (nicht leer) ist und der aktuelle Wert keine gültige E-Mail-Adresse, Zahl, URL, Datum oder Uhrzeit ist, wird die :invalid-CSS-Pseudoklasse als Übereinstimmung eingestuft. Diese konstante Aktualisierung unterscheidet sich von der integrierten Validierung von HTML-Einschränkungen, die nur erfolgt, wenn der Nutzer versucht, das Formular zu senden.

Die integrierte Einschränkungsvalidierung ist nur für Einschränkungen relevant, die mit HTML-Attributen festgelegt wurden. Sie können ein Element basierend auf den Pseudoklassen :required und :valid/:invalid gestalten. Die vom Browser ausgegebenen Fehlermeldungen, die auf Fehler in den Attributen required, pattern, min, max und sogar type zurückzuführen sind, werden aber beim Senden des Formulars ausgegeben.

Eine Fehlermeldung, die darauf hinweist, dass ein Multi-Choice-Feld erforderlich ist.

Wenn wir versuchen, das Formular zu senden, ohne den gewünschten Schüler/Studenten auszuwählen, verhindert die Einschränkungsvalidierung das Senden des Formulars aufgrund eines validityState.valueMissing-Fehlers.

Wenn eines der validityState-Properties true zurückgibt, wird die Übertragung blockiert und der Browser zeigt im ersten falschen Formularsteuerelement eine Fehlermeldung an, um den Fokus zu rücken. Wenn der Nutzer eine Formularübermittlung aktiviert und ungültige Werte vorhanden sind, wird für das erste ungültige Formularsteuerelement eine Fehlermeldung angezeigt und der Fokus liegt auf dem Fokus. Wenn für ein erforderliches Steuerelement kein Wert festgelegt ist, ein numerischer Wert außerhalb des zulässigen Bereichs liegt oder ein Wert nicht dem für das Attribut type erforderlichen Typ entspricht, wird das Formular nicht validiert und das Formular wird nicht gesendet, und eine Fehlermeldung wird angezeigt.

Wenn ein number-, Datums- oder Uhrzeitwert unter dem minimalen min-Wert oder über dem maximalen max-Satz liegt, ist die Steuerung :out-of-range (und :invalid) und der Nutzer wird über den Fehler valididityState.rangeUnderflow validityState.rangeOverflow informiert, wenn er versucht, das Formular zu senden. Wenn der Wert nicht mit dem step-Wert übereinstimmt, unabhängig davon, ob er explizit festgelegt oder standardmäßig auf 1 gesetzt ist, ist das Steuerelement :out-of-range (und :invalid) und es wird der Fehler validityState.stepMismatch ausgegeben. Der Fehler wird als Infofeld angezeigt und enthält standardmäßig hilfreiche Informationen zur Behebung des Fehlers.

Es gibt ähnliche Attribute für die Länge von Werten: Die Attribute minlength und maxlength weisen den Nutzer bei der Übermittlung auf einen Fehler mit validityState.tooLong oder validityState.tooShort hin. Das maxlength verhindert außerdem, dass der Nutzer zu viele Zeichen eingibt.

Die Verwendung des Attributs maxlength kann zu einer schlechten Nutzererfahrung führen. Im Allgemeinen ist es besser, dem Nutzer die Möglichkeit zu geben, mehr als die zulässige Zeichenlänge einzugeben, indem ein Zähler bereitgestellt wird – optional in Form eines <output>-Elements, das nicht mit dem Formular gesendet wird. So kann der Text so lange bearbeitet werden, bis die Ausgabe anzeigt, dass die maximal zulässige Länge nicht überschritten wurde. Sie können das maxlength-Objekt in Ihren HTML-Code einfügen. Wie alles, was wir besprochen haben, funktioniert auch dieser ohne JavaScript. Anschließend kann beim Laden der Wert des Attributs maxlength verwendet werden, um diesen Zeichenzähler in JavaScript zu erstellen.

Einige Eingabetypen scheinen Standardeinschränkungen zu haben, aber nicht. Der Eingabetyp tel ermöglicht beispielsweise eine numerische Wähltastatur auf Geräten mit dynamischer Tastatur, schränkt jedoch keine gültigen Werte ein. Für diesen und andere Eingabetypen gibt es das Attribut pattern. Sie können einen regulären Ausdruck angeben, dem der Wert entsprechen muss, um als gültig zu gelten. Wenn ein Wert ein leerer String ist und der Wert nicht erforderlich ist, wird kein validityState.patternMismatch-Fehler verursacht. Falls erforderlich und leer, wird dem Nutzer die Standardfehlermeldung für validityState.valueMissing statt patternMismatch angezeigt.

Für E-Mails ist validityState.typeMismatch für Ihre Anforderungen wahrscheinlich zu nachsichtig. Sie sollten das Attribut pattern verwenden, damit Intranet-E-Mail-Adressen ohne TLD nicht als gültig anerkannt werden. Das Attribut „pattern“ ermöglicht die Bereitstellung eines regulären Ausdrucks, dem der Wert entsprechen muss. Wenn eine Musterübereinstimmung erforderlich ist, sollte für den Nutzer sehr klar sein, was erwartet wird.

All dies ist ohne eine einzige Zeile JavaScript möglich. Da es sich um eine HTML API handelt, können Sie mit JavaScript benutzerdefinierte Nachrichten während der Einschränkungsvalidierung einbinden. Sie können auch JavaScript verwenden, um die Anzahl der noch verfügbaren Zeichen zu aktualisieren, eine Fortschrittsleiste für die Passwortstärke anzuzeigen oder andere Möglichkeiten zur dynamischen Verbesserung der Vervollständigung zu verwenden.

Beispiel

Dieses Beispiel enthält ein Formular innerhalb einer <dialog> mit einem verschachtelten <form>-Element mit drei Formularsteuerelementen und zwei Sendeschaltflächen mit klaren Labels und Anleitungen.

Mit der ersten Schaltfläche zum Senden wird das Dialogfeld geschlossen. Verwenden Sie formmethod="dialog", um die Standardmethode des Formulars zu überschreiben und schließen Sie <dialog>, ohne die Daten zu senden oder zu löschen. Sie müssen auch formnovalidate angeben. Andernfalls prüft der Browser, ob alle Pflichtfelder einen Wert haben. Der Nutzer möchte möglicherweise das Dialogfeld und das Formular schließen, ohne Daten einzugeben. Eine Validierung würde dies verhindern. Geben Sie aria-label="close" an, da „X“ ein bekannter visueller Hinweis, aber kein beschreibendes Label ist.

Die Formularsteuerelemente haben alle implizite Labels, sodass Sie keine id- oder for-Attribute angeben müssen. Die Eingabeelemente haben beide das erforderliche Attribut, wodurch sie erforderlich sind. In der Zahleneingabe ist die step explizit festgelegt, um zu zeigen, wie step enthalten ist. Da step standardmäßig auf 1 festgelegt ist, kann dieses Attribut weggelassen werden.

<select> hat einen Standardwert, sodass das Attribut required nicht benötigt wird. Anstatt das Attribut value für jede Option anzugeben, wird standardmäßig der innere Text verwendet.

Mit der Schaltfläche „Senden“ am Ende wird die Formularmethode auf „POST“ gesetzt. Wenn Sie darauf klicken, wird die Gültigkeit jedes einzelnen Werts überprüft. Wenn alle Werte gültig sind, werden die Formulardaten gesendet, das Dialogfeld wird geschlossen und die Seite wird möglicherweise zur Aktions-URL thankyou.php weitergeleitet. Wenn Werte fehlen oder der numerische Wert einen nicht übereinstimmenden Schritt aufweist oder außerhalb des Bereichs liegt, wird eine entsprechende browserdefinierte Fehlermeldung angezeigt, das Formular wird nicht gesendet und das Dialogfeld wird nicht geschlossen. Die Standardfehlermeldungen können mit der Methode validityState.setCustomValidity('message here') angepasst werden. Wenn Sie eine benutzerdefinierte Nachricht festlegen, muss die Nachricht explizit auf einen leeren String gesetzt werden, wenn alles gültig ist. Andernfalls wird das Formular nicht gesendet.

Weitere Aspekte

Es gibt einen ganzen Abschnitt, der Nutzern dabei hilft, die richtigen Daten in Formulare einzugeben. Für eine gute Nutzerfreundlichkeit ist es wichtig, dass Nutzer keine Fehler machen, indem Sie bei Bedarf Anleitungen und Hinweise bereitstellen. In diesem Abschnitt wird beschrieben, wie HTML allein die Validierung clientseitig bereitstellen kann. Die Validierung muss jedoch sowohl clientseitig als auch serverseitig erfolgen. Die Validierung kann auf unaufdringliche Weise beim Ausfüllen des Formulars erfolgen, beispielsweise durch Hinzufügen eines Häkchens, wenn der Wert korrekt ist. Geben Sie jedoch keine Fehlermeldungen an, bevor die Formularsteuerung abgeschlossen ist. Wenn der Nutzer einen Fehler macht, teilen Sie ihm mit, wo der Fehler ist und was er falsch gemacht hat.

Beim Erstellen von Formularen ist es wichtig zu berücksichtigen, dass nicht jeder wie Sie ist. Ein Nutzer kann nur einen Buchstaben als Nachname (oder gar keinen Nachnamen) verwenden, hat keine Postleitzahl, eine dreizeilige Adresse oder keine Adresse. Möglicherweise sieht er sich eine übersetzte Version Ihres Formulars an.

Formularsteuerelemente, ihre Labels und Fehlermeldungen sollten auf dem Bildschirm sichtbar, korrekt und aussagekräftig, programmatisch bestimmbar und programmatisch mit dem entsprechenden Formularelement oder der entsprechenden Formulargruppe verknüpft sein. Das Attribut autocomplete kann und sollte verwendet werden, um das Ausfüllen von Formularen zu beschleunigen und die Zugänglichkeit zu verbessern.

HTML stellt alle Tools bereit, um grundlegende Formularsteuerelemente zugänglich zu machen. Je interaktiver ein Formularelement oder ein Prozess ist, desto mehr Aufmerksamkeit muss der Barrierefreiheit im Hinblick auf Fokusmanagement, Festlegung und Aktualisierung von ARIA-Namen, Rollen und Werten, falls erforderlich, sowie ARIA-Live-Ankündigungen nach Bedarf geschenkt werden. Aber wie wir hier gelernt haben, können Sie allein mit HTML Ihr Ziel der Zugänglichkeit und Gültigkeit erreichen, ohne auf ARIA oder JavaScript zurückzugreifen.

Überprüfen Sie Ihr Wissen

Testen Sie Ihr Wissen über Formulare.

Wie können Sie dafür sorgen, dass Optionsfelder zur selben Gruppe gehören?

Fügen Sie sie alle in einen Feldsatz ein.
Versuche es bitte noch einmal.
Allen denselben Wert für das name-Attribut zuweisen.
Richtig!
Allen denselben Wert für das id-Attribut zuweisen.
Versuche es bitte noch einmal.

Mit welchem HTML-Element wird dem Nutzer mitgeteilt, wofür dieses Formularfeld gedacht ist?

<h1>
Versuche es bitte noch einmal.
<title>
Versuche es bitte noch einmal.
<label>
Richtig!