Stellen Sie sich ein Formular mit 10 Pflichtfeldern vor. Das ist etwas größer als ein durchschnittliches Formular im Internet und bedeutet für einen Nutzer eine Menge Arbeit. Möglicherweise verlieren Sie auf dem Weg einige Nutzer, was nie gut ist. Um die Fertigstellung des Formulars zu fördern, könnten Sie den Nutzern mitteilen, wie nah sie der Vollendung sind, und ihnen motivierende Nachrichten anzeigen.

1. HTML für Pflichtfelder
Die Eingabefelder müssten für diese Demo nicht unbedingt required sein, aber es macht die Demo übersichtlicher. Das Ausfüllen eines optionalen Feldes bringt Sie den Mindestanforderungen für das Absenden eines Formulars nicht näher. Für diese Demo haben wir also 5 Pflichtfelder in einem typischen Formular, das Zahlungsinformationen sammelt.
<form id="payment-form" action="#">
<label for="name">Full Name</label>
<input required id="name" name="name">
<!-- etc -->
</form>
2. HTML für Fortschritt
Es gibt ein HTML-Element speziell zur visuellen Darstellung des Fortschritts. Wörtlich: <progress>. Lassen Sie uns eines davon verfügbar machen (mit einer ID, damit es mit JavaScript leicht ansprechbar ist). Platzieren Sie es, wo immer Sie möchten.
<progress max="100" value="0" id="progress"></progress>
Die Einstellung des max-Attributs auf 100 vereinfacht die Mathematik. Der Fortschrittsbalken ist so voll wie der Wert in Prozent. Z. B. entspricht value="20" einem zu 20 % gefüllten Balken.

3. Auf Änderungen achten
Wir verwenden hier jQuery, um die Ereignisbindung und Elementauswahl zu vereinfachen. Alle unsere Eingabefelder sind hier textbasiert, was Tastaturereignisse relevant macht. Also...
$("#payment-form input").keyup(function() {
// calculate progress
});
4. Anzahl der gültigen Eingaben zählen
Ob ein bestimmtes Eingabefeld in seinem aktuellen Zustand gültig ist oder nicht, ist nun Teil des DOM. Sobald wir einen Verweis darauf haben, prüfen wir einfach this.validity.valid auf true oder false.
var numValid = 0;
$("#payment-form input[required]").each(function() {
if (this.validity.valid) {
numValid++;
}
});
5. Fortschrittsbalken anpassen / Nachrichten anzeigen
Jetzt, da wir eine Ganzzahl haben, wie viele Eingaben gültig sind, richten wir einfach eine grundlegende Logik ein, um den aktuellen Wert des Fortschrittsbalkens anzupassen.
Hier könnten wir auch unsere motivierenden Nachrichten anzeigen. Vielleicht gibt es irgendwo auf der Seite ein <p>-Element, auf das wir einen Verweis haben (progressMessage), und wir passen einfach den Text darin an, um den Fortschritt widerzuspiegeln.
// "Cached" somewhere once
var progress = $("#progress"),
progressMessage = $("#progressMessage");
// Logic that runs after counting every time
if (numValid == 0) {
progress.attr("value", "0");
progressMessage.text("The form, it wants you.");
}
if (numValid == 1) {
progress.attr("value", "20");
progressMessage.text("There you go, great start!");
}
Browser-Unterstützung
Wenn die Browserunterstützung ein Anliegen ist, möchten Sie wahrscheinlich zuerst einen kleinen Modernizr-Test durchführen. Wenn er bestanden wird, laden Sie Skripte, fügen Sie Elemente ein, wie auch immer Sie es handhaben möchten.
if (Modernizr.input.required) {
// Modernizr.load, inject elements, whatever.
}
Wenn Sie weitere Hilfe dazu benötigen, lesen Sie diesen Artikel.
Demo auf CodePen
Machen Sie damit, was immer Sie möchten damit.
Das ist eine großartige Idee! Ich liebe dieses Konzept, besonders den dynamischen Fortschrittsbalken! Wir werden ihn verwenden. Danke!!
Ich war mir
this.validity.validnicht bewusst, sehr praktisch. Ein guter Artikel ebenfalls!Das Drücken einer Taste ist nicht die einzige Möglichkeit, ein Eingabefeld zu ändern. Sie können es auch z. B. per Drag & Drop oder durch Einfügen mit der mittleren Maustaste in einigen Linux-Distributionen tun.
Sehr guter Punkt, Hallo.
Ich würde das Auslöserereignis auf focus/blur oder etwas Ähnliches ändern.
Ansonsten liebe ich die Idee!
Autoverfüllung verwirrt es auch. Aber ein tolles Konzept, sobald die Kinderkrankheiten behoben sind.
Dies ist ein großartiges Beispiel für progressive Verbesserung. Es wirft die Frage auf, die gestellt werden wird: Wie gut ist dieser Fortschrittsbalken gestaltbar.
Brillante Nutzung des Fortschrittsbalkens…. Ich habe überlegt, wie man den HTML-Fortschrittsbalken auf eine Weise demonstrieren kann, die leicht zu erklären und zu zeigen ist……Dies erfüllt den Zweck perfekt… Vielen Dank fürs Teilen…
Sie sollten wahrscheinlich das „input“-Ereignis über
.on("input")verwenden. Beachten Sie, dass dies in IE unter 9 (glaube ich) nicht unterstützt wird, sodass Sie beide verwenden könnten (.on("input keyup")). Außerdem ist unter Windows (zumindest 7) der Fortschrittsbalken ständig animiert, daher wäre ein benutzerdefinierter Fortschrittsbalken oder das<meter>-Element, das meiner Meinung nach eine „benutzerdefinierte“ Formatierung in den Browsern hat, besser…Ich denke, das versteht sich von selbst, aber IE9 hasst das.
Gut. Es wäre cool, den Fortschrittsbalken auch zu animieren. So etwas wie das hier
http://jsfiddle.net/526hM/
Nicht mein Code, aber; stammt aus diesem SO-Thread, von jemandem namens „Thomas“.
Ich wusste nicht, dass es ein
<progress>-Element in HTML gibt. Ich bin überrascht, dass man dieses Element nicht häufig für „ladende“ Seiten sieht.Wenn mir bitte jemand erklären könnte, wo die Validierung dieses Formulars in der Demo gehandhabt wird, wäre ich dankbar. Danke.
Es ist im HTML, mit dem Attribut „pattern“. Ich glaube, das JavaScript prüft auch auf leere/gefüllte Eingaben, um den Fortschrittsbalken und die Nachrichten voranzutreiben.
Das „pattern“-Attribut ist neu in HTML5 und ermöglicht die Validierung auf Client-Seite ohne zusätzliches JavaScript.
Verstanden. Danke. Ich muss mich mit all den neuen HTML5-Formularelementen beschäftigen.
Seien Sie vorsichtig mit Safari 5 (und Mobile Safari 5). Es löscht aggressiv Fortschrittselemente, anstatt sie einfach zu ignorieren. Möglicherweise müssen Sie zuerst prüfen, ob das Fortschrittselement überhaupt vorhanden ist.
Schön, danke!
Die manuelle Einstellung der Prozentsätze ist ein Chaos.
Wie wäre es, Klassen wie „valid“ hinzuzufügen, wenn gültig, und die Breite des Fortschrittsbalkens auf (Anzahl der Eingaben)/(gültige Eingaben) zu ändern?
Da viele Formulare mit clientseitigen JS-Validierungen begleitet werden, würde ich erwägen, den Fortschritt erst nach der erforderlichen Wertprüfung (und dessen Gültigkeit) zu aktualisieren. Auch die Verwendung einer Animatorfunktion, wie von Louis erwähnt, wäre eine schöne Ergänzung.
Die Autoverfüllung könnte durch einen weiteren Ereignishandler nach dem Laden der Seite umgangen werden, der die Felder durchläuft und validiert (und da wir unseren Fortschritt an die Validierungen gekoppelt hätten, würde sich der Fortschritt sofort auf den entsprechenden Wert aktualisieren).