Advertisement
  1. Web Design
  2. HTML/CSS
  3. HTML

Erstellen Sie ein ordentliches HTML5-Kontaktformular

Scroll to top
Read Time: 49 min

() translation by (you can also view the original English article)

In diesem Tutorial erfahren Sie, wie Sie ein elegantes HTML5 AJAX-Kontaktformular erstellen. Das Formular verwendet einige der neuen HTML5-Eingabeelemente und -attribute und wird mithilfe der integrierten Formularvalidierung des Browsers überprüft.

Wir werden jQuery und Modernizr verwenden, um mit den älteren Browsern zu helfen, und PHP auf der Serverseite, um die Eingabe zu validieren.


Schritt 1: Erste Schritte

Um zu beginnen, müssen wir unser Verzeichnis und Dateien einrichten. Um zu beginnen, empfehle ich das HTML5-Muster. Dies ist ein wirklich guter Ausgangspunkt für jedes HTML5-Projekt und spart Ihnen viel Zeit. Für dieses Tutorial habe ich 'BOILERPLATE CUSTOM' gewählt.

HTML5 BoilerplateHTML5 BoilerplateHTML5 Boilerplate

Weitere Informationen zu HTML5 finden Sie in diesem Leitfaden auf Nettuts+.

Einmal heruntergeladen und entpackt, löschen Sie alles aber index.html und die Css und Js Ordner. Ich habe auch einen Ordner namens Img und eine PHP-Datei namens process.php. Wir verwenden den Img-Ordner zum Speichern von Bildressourcen für unsere Form und process.php, um alle Server-seitige Logik für das Kontaktformular zu behandeln. Hier ist, was jetzt meine Verzeichnisstruktur aussieht:

Directory StructureDirectory StructureDirectory Structure

Das ist alles was, die wir brauchen um loszulegen! HTML5 Boilerplate beinhaltet eine tolle CSS mit sinnvollen Standardeinstellungen zurückgesetzt und alle JS Bibliotheken (jQuery & Modernizr) werden wir heute verwenden. Alle unsere JS-Dateien und CSS-Dateien haben in der Indexdatei eingehakt. Nun ist es Zeit, mit dem Markup fortzufahren. 


Schritt 2: Das Formular

Öffnen Sie index.html und entfernen Sie alles innerhalb des Elements #container. Wir setzen unser Kontaktformular innerhalb dieses Div:

1
<div id="contact-form" class="clearfix">
2
    <h1>Get In Touch!</h1>
3
    <h2>Fill out our super swanky HTML5 contact form below to get in touch with us! Please provide as much information as possible for us to help you with your enquiry :)</h2>
4
    <ul id="errors" class="">
5
        <li id="info">There were some problems with your form submission:</li>
6
    </ul>
7
    <p id="success">Thanks for your message! We will get back to you ASAP!</p>
8
    <form method="post" action="process.php">
9
        <label for="name">Name: <span class="required">*</span></label>
10
        <input type="text" id="name" name="name" value="" placeholder="John Doe" required="required" autofocus="autofocus" />
11
        
12
        <label for="email">Email Address: <span class="required">*</span></label>
13
        <input type="email" id="email" name="email" value="" placeholder="johndoe@example.com" required="required" />
14
        
15
        <label for="telephone">Telephone: </label>
16
        <input type="tel" id="telephone" name="telephone" value="" />
17
        
18
        <label for="enquiry">Enquiry: </label>
19
        <select id="enquiry" name="enquiry">
20
            <option value="general">General</option>
21
            <option value="sales">Sales</option>
22
            <option value="support">Support</option>
23
        </select>
24
        
25
        <label for="message">Message: <span class="required">*</span></label>
26
        <textarea id="message" name="message" placeholder="Your message must be greater than 20 charcters" required="required" data-minlength="20"></textarea>
27
        
28
        <span id="loading"></span>
29
        <input type="submit" value="Holla!" id="submit-button" />
30
        <p id="req-field-desc"><span class="required">*</span> indicates a required field</p>
31
    </form>
32
</div>

Dies ist alles HTML, das wir für unser Formular benötigen.  Schauen wir uns jeden einzelnen Abschnitt:

UL #errors und p #success Willen werden Halterungen für unsere Fehler und Erfolg-Nachrichten. Wir werden diese standardmäßig mit CSS verstecken und zeigt sie mit JavaScript oder PHP, sobald das Formular abgesendet wurde. Für die Namenseingabe ist unsere einzige Voraussetzung, dass es ausgefüllt wurde.

Das tun wir in HTML5 indem man das "required"-Attribut. Dies zwingt den Browser zu prüfen, ob dieses Feld etwas drin, hat bevor das Formular eingereicht werden kann. Das e-Mail-Feld ist ähnlich, aber auch als erforderlich ist, wollen wir eigentlich sicherstellen, dass die eingegebene e-Mail-Adresse ist. Um dies zu tun, geben wir diesen Eingang als e-Mail, die neu in HTML5 ist. Telefon ist, zwar kein erforderliches Feld nutzen wir die tel HTML5 Eingabetyp dafür.

Anfrage ist ein standard select Element und Botschaft ist eine typische Textarea--nichts neues hier. Im Textbereich setzen wir das erforderliche Attribut, um sicherzustellen, dass der Benutzer Text eingibt.

In HTML5 gibt es ein neues Attribut für Textbereiche, das als Maxlength bezeichnet wird. Ja, Sie haben es erraten, damit können wir eine maximale Anzahl von Zeichen festlegen, die wir in den Textbereich schreiben können.  Irgendwie bescheuert dachte die Mächte, die sein, die aus der HTML5-Spezifikation nicht bräuchten wir ein Minlength-Attribut (wie wir es jetzt tun) und es gibt kein Attribut dafür. Also als provisorische Minlength Attribut, wollen wir eine weitere neue HTML5 Attribut mit dem Namen einer benutzerdefinierten Data-Attribut verwenden. Dies ist im Grunde alle Attributnamen mit dem Wort "Daten-" vorangestellt. In unserem Fall haben wir Daten-Minlength passend gewählt. Dadurch können wir im Wesentlichen unsere eigene Attribute erstellen.

Beachtenswert ist, dass wir ein Attribut namens Platzhalter auf alle input-Elemente (außer Telefon) und die Textarea setzen. Dies ist ein neues HTML5 input-Attribut. Wenn das Formular zuerst angezeigt wird, wird der Platzhaltertext in der Eingabe, normalerweise in einer anderen Schriftfarbe angezeigt. Dann, wenn Sie die Eingabe konzentrieren, der Platzhaltertext verschwindet. Wenn Sie ohne füllen das Feld in verwischen, wird der Platzhaltertext zurück gesetzt. Dies ist ein ziemlich cooler Effekt, und bieten den Benutzer mit ein bisschen mehr Informationen auf was sie tun müssen. Dies hätte früher mit JavaScript zu tun.

Die letzte Sache zu beachten ist, dass die Namenseingabe HTML5 Attribut namens Autofokus. Beim ersten Laden der Seite erhält dieses Eingabeelement sofort den Fokus, ohne dass der Benutzer etwas tun muss.  Das ist auch gut für Benutzeraufforderung, etwas zu tun.

Das ist alle HTML5-Ness, die wir in unserem Markup integrieren wollen. Für nähere Informationen zu diesen neuen Attributen und Eingänge Kasse einige von diesen links:


Schritt 3: Styling Form

Hier ist unser Formular, tragen Sie ein wenig schlechter suchen...

Unstyled FormUnstyled FormUnstyled Form

Es sieht nicht so gut im Moment, und ist es nicht wirklich tut unserer glänzenden neuen HTML5-Güte irgendeine Gerechtigkeit, also lassen Sie uns einige CSS hinzufügen. Öffnen Sie die Datei style.css. Die Datei enthält bereits einige Resets und Standardwerte, die uns helfen unsere Form X-Browser kompatibel machen. Scrollen Sie nach unten und suchen Sie nach Kommentar sagt:

1
/*

2
    // ========================================== \\

3
   ||                                              ||

4
   ||               Your styles !                  ||

5
   ||                                              ||

6
    \\ ========================================== //

7
*/

Fügen Sie direkt dahinter ein, im folgenden CSS:

1
#contact-form {
2
    background-color:#F2F7F9;
3
    width:465px;
4
    padding:20px;
5
    margin: 50px auto;    
6
    border: 6px solid #8FB5C1;
7
    -moz-border-radius:15px;
8
    -webkit-border-radius:15px;
9
    border-radius:15px;
10
    position:relative;
11
}
12
13
#contact-form h1 {
14
    font-size:42px;
15
}
16
17
#contact-form h2 {
18
    margin-bottom:15px;
19
    font-style:italic;
20
    font-weight:normal;
21
}
22
23
#contact-form input, 
24
#contact-form select, 
25
#contact-form textarea, 
26
#contact-form label {
27
    font-size:15px;
28
    margin-bottom:2px;
29
}
30
31
#contact-form input, 
32
#contact-form select, 
33
#contact-form textarea {
34
    width:450px;
35
    border: 1px solid #CEE1E8;
36
    margin-bottom:20px;
37
    padding:4px;
38
}
39
40
#contact-form input:focus, 
41
#contact-form select:focus, 
42
#contact-form textarea:focus {
43
    border: 1px solid #AFCDD8;
44
    background-color: #EBF2F4;
45
}
46
47
#contact-form textarea {
48
    height:150px;
49
    resize: none;
50
}
51
52
#contact-form label {
53
    display:block;
54
}
55
56
#contact-form .required {
57
    font-weight:bold;
58
    color:#F00;    
59
}
60
61
#contact-form #submit-button {
62
    width: 100px;
63
    background-color:#333;
64
    color:#FFF;
65
    border:none;
66
    display:block;
67
    float:right;
68
    margin-bottom:0px;
69
    margin-right:6px;
70
    background-color:#8FB5C1;
71
    -moz-border-radius:8px;
72
}
73
74
#contact-form #submit-button:hover {
75
    background-color: #A6CFDD;
76
}
77
78
#contact-form #submit-button:active {
79
    position:relative;
80
    top:1px;
81
}
82
83
#contact-form #loading {
84
    width:32px;
85
    height:32px;
86
    background-image:url(../img/loading.gif);
87
    display:block;
88
    position:absolute;
89
    right:130px;
90
    bottom:16px;
91
    display:none;
92
}
93
94
#errors {
95
    border:solid 1px #E58E8E;
96
    padding:10px;
97
    margin:25px 0px;
98
    display:block;
99
    width:437px;
100
    -webkit-border-radius:8px;
101
    -moz-border-radius:8px;
102
    border-radius:8px;
103
    background:#FFE6E6 url(../img/cancel_48.png) no-repeat 405px center;
104
    display:none;
105
}
106
107
#errors li {
108
    padding:2px;
109
    list-style:none;    
110
}
111
112
#errors li:before {
113
    content: ' - ';    
114
}
115
116
#errors #info {
117
    font-weight:bold;
118
}
119
120
#errors #info:before {
121
    content: '';    
122
}
123
124
#success {
125
    border:solid 1px #83D186;
126
    padding:25px 10px;
127
    margin:25px 0px;
128
    display:block;
129
    width:437px;
130
    -webkit-border-radius:8px;
131
    -moz-border-radius:8px;
132
    border-radius:8px;
133
    background:#D3EDD3 url(../img/accepted_48.png) no-repeat 405px center;
134
    font-weight:bold;
135
    display:none;
136
}
137
138
#errors.visible, #success.visible {
139
    display:block;    
140
}
141
142
#req-field-desc {
143
    font-style:italic;
144
}
145
146
/* Remove box shadow firefox, chrome and opera put around required fields. It looks rubbish. */
147
input:required, textarea:required {
148
    -moz-box-shadow:none;
149
    -webkit-box-shadow:none;
150
    -o-box-shadow:none;
151
    box-shadow:none;
152
}
153
154
/* Normalize placeholder styles */
155
156
/* chrome, safari */
157
::-webkit-input-placeholder {
158
    color:#CCC;
159
    font-style:italic;
160
}
161
162
/* mozilla */
163
input:-moz-placeholder, textarea:-moz-placeholder {
164
    color:#CCC;
165
    font-style:italic;
166
}
167
168
/* ie (faux placeholder) */
169
input.placeholder-text, textarea.placeholder-text  { 
170
    color:#CCC;
171
    font-style:italic;
172
}

Wenn Sie speichern und laden, sollte Ihre Seite jetzt so aussehen:

Styled FormStyled FormStyled Form

Das sieht jetzt besser aus! Die CSS ist ziemlich standard, aber ich werde gehen über ein paar Dinge, die nicht so offensichtlich sind:

1
#errors li:before {
2
    content: ' - ';    
3
}

Dies wird einen Bindestrich neben unseren Validierung Fehlermeldungen setzen. Es ist im Grunde den Punkt in der Liste ersetzen, ich denke, das sieht besser aus.

1
#contact-form #submit-button:active {
2
    position:relative;
3
    top:1px;
4
}

Diese geben uns einen schönen "Push-Down"-Effekt, wenn die Schaltfläche "senden" aktiviert ist.

1
input:required, textarea:required {
2
    -moz-box-shadow:none;
3
    -webkit-box-shadow:none;
4
    -o-box-shadow:none;
5
    box-shadow:none;
6
}

Alle Browser (außer IE) standardmäßig setzen einen rotes Feld Schatten erforderlichen Elemente. Dies sieht ein bisschen übertrieben meiner Meinung nach, so dass ich es bin entfernen. Ich habe bereits darauf hingewiesen, dass das Feld erforderlich ist, indem man ein rotes Sternchen auf dem Etikett.

Stupid looking required inputsStupid looking required inputsStupid looking required inputs
1
/* chrome, safari */
2
::-webkit-input-placeholder {
3
    color:#CCC;
4
    font-style:italic;
5
}
6
7
/* mozilla */
8
input:-moz-placeholder, textarea:-moz-placeholder {
9
    color:#CCC;
10
    font-style:italic;
11
}
12
13
/* ie (faux placeholder) */
14
input.placeholder-text, textarea.placeholder-text  { 
15
    color:#CCC;
16
    font-style:italic;
17
}

Dies normalisiert sich das Erscheinungsbild der Platzhaltertext auf Eingaben und verarbeitet. Hier machen wir es ein helles grau und Italic es. Diese geben uns Konsistenz in allen Browsern außer Opera, der das Styling der Platzhalter nicht unterstützt. IE nur unterstützt nicht das Platzhalter-Attribut. Fullstop. Wir werden JavaScript, Polyfill dies verwenden. Erfahren Sie mehr über styling HTML5-Formulare mit CSS (2.1 + 3) hier.

Sie werden in der CSS feststellen, dass es ein paar Verweise auf Bilder. Wenn Sie diese nicht haben, einfach herunterladen Sie die Quelldateien für dieses Tutorial und kopieren Sie sie über.

Wir sind fertig mit dem Markup, und es sieht ziemlich süß. Wir wollen eine PHP fallback zu schaffen, für den Fall, dass der Browser des Benutzers neue Form Eingabeattribute (IE) nicht unterstützt, oder wenn der Benutzer JavaScript deaktiviert hat. Wir wollen einige JavaScript Funktionen später in Polyfill schreiben dem Browser fehlt. Aber sofern der Benutzer verfügt nicht über einen schön glänzenden neuen Browser oder JavaScript aktiviert, müssen wir noch die Übermittlung des Formulars zu überprüfen. Wir werden diese Architekturbetrachtung mit PHP tun. Auch werden wir es verwenden, um uns die Ergebnisse der gültige Form per e-Mail.


Schritt 4: Vorbereitung für die Server-Seite-Validierung

Fangen wir gleich an. Process.php öffnen Sie und fügen Sie in die folgenden:

1
<?php
2
if( isset($_POST) ){
3
    
4
    //form validation vars

5
    $formok = true;
6
    $errors = array();
7
    
8
    //sumbission data

9
    $ipaddress = $_SERVER['REMOTE_ADDR'];
10
    $date = date('d/m/Y');
11
    $time = date('H:i:s');
12
    
13
    //form data

14
    $name = $_POST['name'];    
15
    $email = $_POST['email'];
16
    $telephone = $_POST['telephone'];
17
    $enquiry = $_POST['enquiry'];
18
    $message = $_POST['message'];
19
    
20
    //form validation to go here....

21
    
22
}

Was wir hier sagen, ist: dieser folgenden Code nur ausgeführt, wenn die Anforderungsmethode POST ist. Wenn ein Formular an ein PHP-Skript geschrieben ist, sind standardmäßig das Formular eingegebenen Werte in ein super globales Array namens $_POST gespeichert. Wenn nichts gebucht wird, $_POST werden kein Array der Anweisung wird auf False gleichzusetzen und unseren Code wird nicht ausgeführt.

Nachdem wir festgestellt haben, dass dies eine POST-Anforderung ist, können wir unser Formular Verarbeitungslogik beginnen. Das erste, was, das wir tun müssen, ist zwei Variablen gesetzt:

  • $ formok: Ein boolescher Wert, den wir prüfen können, ob das Formular am Ende des Skripts gültig ist oder nicht.
  • $ errors: Ein Array, das wir zum Speichern aller Probleme mit dem Formular verwenden werden, während wir es überprüfen. 

Danach haben wir einige allgemeine Form Vorlage Daten:

  • $ipaddress: die IP-Adresse, die für eine schwarze Liste Spam, Querverweise Analytics-Daten etc. nützlich sein kann.
  • $date: das Datum, das Formular abgesendet wurde. Wir verwenden die Datumsfunktion, um das Datum im UK-Format zu generieren.
  • $time: die Zeit, die das Formular abgesendet wurde. Wir verwenden die Datumsfunktion, um die Zeit zu generieren.

Wir konnten das Datum und die Uhrzeit verbinden, wenn wir wollten:

1
$datetime = date('d/m/Y H:i:s');

Ich möchte sie getrennt halten damit ich sie für andere Dinge verwenden können, falls erforderlich. Der letzte Satz von Variablen, die wir stellen sind die Werte der eingereichten Formularfelder. Wir sind das $_POST Array vorbei in das Feld Formularname als Schlüssel zum Abrufen der Daten für die einzelnen Variablen zugreifen.


Schritt 5: Validierung der $_POST Daten

Wir wollen jede Variable einzeln jetzt zu überprüfen, um sicherzustellen, dass ihr Wert gültig ist. Wenn es nicht ist, wir die $formok-Variable auf False gesetzt, und eine Fehlermeldung in der $errors Array speichern. Wir beginnen zunächst mit dem Feld "Name".

1
//validate name is not empty

2
if(empty($name)){
3
    $formok = false;
4
    $errors[] = "You have not entered a name";
5
}

Hier sind wir nur sicherstellen, dass diese $name verfuegt ueber einen Wert. Wenn dies nicht der Fall, bedeutet dies, dass der Benutzer keinen Namen eingegeben haben. Wir verwenden die empty() Funktion, um dies zu überprüfen. Nach $errors [] enthalten ist eine Verknüpfung mit Array_push (die verwendet wird, um ein Element an das Ende eines Arrays hinzufügen). Als nächstes werden wir die e-Mail-Adresse bestätigen:

1
//validate email address is not empty

2
if(empty($email)){
3
    $formok = false;
4
    $errors[] = "You have not entered an email address";
5
//validate email address is valid

6
}elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)){
7
    $formok = false;
8
    $errors[] = "You have not entered a valid email address";
9
}

Wir wollen prüfen, um festzustellen, ob tatsächlich eine gültige e-Mail-Adresse eingegeben wurde. Für diese Aufgabe wollen wir die filter_var()-Funktion verwenden. Zu guter Letzt müssen wir die Meldung zu bestätigen.

1
//validate message is not empty

2
if(empty($message)){
3
    $formok = false;
4
    $errors[] = "You have not entered a message";
5
}
6
//validate message is greater than 20 charcters

7
elseif(strlen($message) < 20){
8
    $formok = false;
9
    $errors[] = "Your message must be greater than 20 characters";
10
}

Wir werden noch einmal überprüfen, ob eine Nachricht eingegeben wurde. Wenn etwas eingegeben wurde, möchten wir sicherstellen, dass es länger als 20 Zeichen ist. Dafür wollen wir die Funktion strlen() verwenden.

Das Telefon und das Anfrage-Feld sind keine Pflichtfelder, so dass keine Notwendigkeit, diese zu validieren. Du könntest, wenn du wolltest, aber für die Zwecke dieses Tutorial ich nicht bin.


Schritt 6: Was Sie als nächstes tun...

Sobald wir unsere Formularergebnisse überprüft haben, müssen wir entscheiden, ob der Benutzer eine e-Mail mit den Formularergebnissen oder nicht senden. Wir behalten den Überblick über die Gültigkeit des Formulars über die $formok-Variable. Wenn es immer noch gleich ist wahr, wir wollen die Formularergebnisse vorzulegen, andernfalls nicht.

Das ist die Logik, die werden wir nutzen, um die Nachricht zu senden (fügen Sie in diesem, nachdem wir unsere Validierung getan haben):

1
//send email if all is ok

2
if($formok){
3
    $headers = "From: info@example.com" . "\r\n";
4
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
5
    
6
    $emailbody = "<p>You have recieved a new message from the enquiries form on your website.</p>

7
                  <p><strong>Name: </strong> {$name} </p>

8
                  <p><strong>Email Address: </strong> {$email} </p>

9
                  <p><strong>Telephone: </strong> {$telephone} </p>

10
                  <p><strong>Enquiry: </strong> {$enquiry} </p>

11
                  <p><strong>Message: </strong> {$message} </p>

12
                  <p>This message was sent from the IP Address: {$ipaddress} on {$date} at {$time}</p>";
13
    
14
    mail("enquiries@example.com","New Enquiry",$emailbody,$headers);
15
    
16
}

Um die Nachricht zu senden, werden wir die mail() Funktion verwendet werden. Wir müssen diese Funktion vier Parameter übergeben: Betreff, Nachricht und Header.

  • zu: Dies wird die e-Mail-Adresse, die Sie möchten, senden Sie das Formular Details zu sein.
  • Thema: das werden der Betreffzeile.
  • Nachricht: Dies wird sein, den Inhalt der e-Mails. Wir werden dies in der Variablen $emailbody gespeichert. Dies ist eine HTML-Zeichenfolge enthält die Ergebnisse der unser Formular. Wo sehen Sie die geschweiften Klammern mit unserer Variablennamen in ihnen, werden diese in den Variablen Wert geändert werden, wenn das Skript ausgeführt wird. Dies nennt man Variablensubstitution. Diese Art der Substitution funktioniert nur, wenn die Zeichenfolge in Anführungszeichen gekapselt ist, nicht einzelne.
  • Header: wird verwendet, um zusätzliche Informationen an die e-Mail-Client übergeben, damit es weiß, wie man die e-Mail interpet. Wir sind unseren Header in die $headers Variable speichern und liefert zusätzliche Informationen über wem die e-Mail stammt und welche Art von Inhalten, die es enthält.

Hinweis: Vergessen Sie nicht, die von e-Mail-Adresse in den Headern und die e-Mail-Adresse in der e-Mail-Funktion.

Dies soll eine nette e-Mail wie folgt:

Email ScreenshotEmail ScreenshotEmail Screenshot

Wenn Sie auf einem WindowsServer sind, müssen Sie diese Codezeile in setzen (bevor Sie die $headers Variable deklarieren) an um die Mail-Funktion zu erhalten:

1
ini_set("sendmail_from","info@example.com");

Ob Formularübertragung des Benutzers gültig oder nicht war, wollen wir sie zurück zum Formular zurückzukehren. Wenn das Formular gültig war und die Nachricht wurde gesendet, müssen wir dem Benutzer die Erfolgsmeldung geben. Wenn es nicht gültig ist, wollen wir die Fehlermeldungen gespeichert im $errors Array anzeigen sowie füllen Sie die Formularfelder mit den Daten, die ursprünglich gesendet wurde. Wir werden einige Variablen speichern, die wir haben in diesem Skript in einem Array mit und senden sie zusammen mit der Umleitung zurück zum Formular.

1
//what we need to return back to our form

2
$returndata = array(
3
    'posted_form_data' => array(
4
        'name' => $name,
5
        'email' => $email,
6
        'telephone' => $telephone,
7
        'enquiry' => $enquiry,
8
        'message' => $message
9
    ),
10
    'form_ok' => $formok,
11
    'errors' => $errors
12
);

Wir werden unsere Daten in ein assoziatives Array zu speichern. Dieses Array hat drei Mitglieder: 

  • posted_form_data: Dies ist ein Array mit den Formulardaten, die an das Skript gesendet wurden.
  • form_ok: Wir speichern die $ formokVariable in dieser Datei und diese Variable wird auf der Formularseite erneut geprüft, um den Benutzer mit der entsprechenden Nachricht zu aktualisieren.
  • Fehler: Wir speichern die $errors Variable in diesem. Diese Variable wird verwendet, wenn die $formokVariable gleich false ist.

Die letzte Sache für uns zu tun ist, den Benutzer wieder auf die Formularseite, zusammen mit unserer $returndata Reihe umzuleiten. Sobald wir wieder auf der Formularseite weitergeleitet werden, verlieren wir unsere $returndata Variable; damit, um diese Daten persistent zu machen, wir vorübergehend in der Session gespeichert wird.

Ein weiterer Aspekt, den wir berücksichtigen müssen, ist letztlich, wenn der Browser des Benutzers JavaScript aktiviert hat, möchten wir das Formular über AJAX absenden  Das bedeutet, dass wollen wir unsere AJAX-Request an der gleichen Stelle wie die Übermittlung des Formulars gebucht werden, wenn JavaScript deaktiviert ist. Da die Form bereits auf der Clientseite überprüft wurden würde, es kommen durch die serverseitige Validierung und Details werden per e-Mail an uns. Wenn das Formular nicht gültig ist, wird es nie eingereicht werden (als Browser Validierung / JavaScript wird es verhindern). Dies bedeutet, dass mit der AJAX-Request, gibt es keinen Grund für uns, umleiten oder legen Sie Session-Variablen. Im letzten Teil dieses Skripts überprüfen wir, ob die aktuelle Anforderung an process.php eine AJAX-Anfrage war oder nicht, und wenn es unsere Session-Variablen gesetzt wurde, und umleiten.

1
//if this is not an ajax request

2
if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest'){
3
    
4
    //set session variables

5
    session_start();
6
    $_SESSION['cf_returndata'] = $returndata;
7
    
8
    //redirect back to form

9
    header('location: ' . $_SERVER['HTTP_REFERER']);
10
11
}

Um zu überprüfen, ob dies eine AJAX-Anfrage, suchen wir für die Variable $_SERVER ['HTTP_X_REQUESTED_WITH']. Wie die super global $_POST Array, gibt es auch eine sogenannte $_SERVER. Dieses Array enthält Server und Ausführung Umgebungsinformationen. Weitere Informationen finden Sie hier.

Wir rufen Sie dann Aufruf von session_start() um uns Zugriff auf die Sitzung und der Satz der Variable $_SESSION ['Cf_returndata'], $returndata zu spiegeln. Auf der Formularseite werden wir nun auf diese Variable zugreifen.

Um zurück zum Formular umzuleiten, verwenden wir die header() Funktion. Wir sagen es uns auf der letzten Seite umleiten wir kamen von der Verwendung der Variablen: $_SERVER ['HTTP_REFERER'].

Insgesamt landete Sie dabei haben sollten:

1
<?php
2
if( isset($_POST) ){
3
    
4
    //form validation vars

5
    $formok = true;
6
    $errors = array();
7
    
8
    //submission data

9
    $ipaddress = $_SERVER['REMOTE_ADDR'];
10
    $date = date('d/m/Y');
11
    $time = date('H:i:s');
12
    
13
    //form data

14
    $name = $_POST['name'];    
15
    $email = $_POST['email'];
16
    $telephone = $_POST['telephone'];
17
    $enquiry = $_POST['enquiry'];
18
    $message = $_POST['message'];
19
    
20
    //validate form data

21
    
22
    //validate name is not empty

23
    if(empty($name)){
24
        $formok = false;
25
        $errors[] = "You have not entered a name";
26
    }
27
    
28
    //validate email address is not empty

29
    if(empty($email)){
30
        $formok = false;
31
        $errors[] = "You have not entered an email address";
32
    //validate email address is valid

33
    }elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)){
34
        $formok = false;
35
        $errors[] = "You have not entered a valid email address";
36
    }
37
    
38
    //validate message is not empty

39
    if(empty($message)){
40
        $formok = false;
41
        $errors[] = "You have not entered a message";
42
    }
43
    //validate message is greater than 20 characters

44
    elseif(strlen($message) < 20){
45
        $formok = false;
46
        $errors[] = "Your message must be greater than 20 characters";
47
    }
48
    
49
    //send email if all is ok

50
    if($formok){
51
        $headers = "From: info@example.com" . "\r\n";
52
        $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
53
        
54
        $emailbody = "<p>You have received a new message from the enquiries form on your website.</p>

55
                      <p><strong>Name: </strong> {$name} </p>

56
                      <p><strong>Email Address: </strong> {$email} </p>

57
                      <p><strong>Telephone: </strong> {$telephone} </p>

58
                      <p><strong>Enquiry: </strong> {$enquiry} </p>

59
                      <p><strong>Message: </strong> {$message} </p>

60
                      <p>This message was sent from the IP Address: {$ipaddress} on {$date} at {$time}</p>";
61
        
62
        mail("enquiries@example.com","New Enquiry",$emailbody,$headers);
63
        
64
    }
65
    
66
    //what we need to return back to our form

67
    $returndata = array(
68
        'posted_form_data' => array(
69
            'name' => $name,
70
            'email' => $email,
71
            'telephone' => $telephone,
72
            'enquiry' => $enquiry,
73
            'message' => $message
74
        ),
75
        'form_ok' => $formok,
76
        'errors' => $errors
77
    );
78
        
79
    
80
    //if this is not an ajax request

81
    if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest'){
82
        //set session variables

83
        session_start();
84
        $_SESSION['cf_returndata'] = $returndata;
85
        
86
        //redirect back to form

87
        header('location: ' . $_SERVER['HTTP_REFERER']);
88
    }
89
}

Das ist alles für die Verarbeitung unserer Formularübertragung--getan und in 90 Zeilen PHP abgestaubt! Alles, was wir tun müssen, jetzt ist den Benutzer aktualisieren und geben Sie entweder eine Erfolgsmeldung oder eine Fehlermeldung angezeigt. Sie sparen jetzt process.php.


Schritt 7: Aktualisieren der UI

Nun, wir die Formulardaten verarbeitet haben und zur Seite zurückgegeben wurden, müssen wir aktualisieren den Benutzer was passiert ist. Das bedeutet Zugriff auf die Session-Variable setzen wir auf process.php und arbeiten heraus, welche Antwort zu geben. Da diese Seite nun PHP verwenden muss, werden wir brauchen, um die Datei-Endung von index.html in .php ändern (index.html = index.php). Keine Sorge, dies sollte nicht kaputt machen, was wir bereits getan haben.

Das erste, was, das wir tun müssen, ist unsere Variablen aus der Sitzung erhalten. Um dies zu tun, brauchen wir Zugriff auf die Sitzung. Ganz oben auf der Seite vor jeder Markup (oberhalb Doctype) fügen Sie den folgenden Code in:

1
<?php session_start() ?>

Beginn der Tagung vor jeder Inhalt an den Browser gesendet wird sollte verhindern, dass "kann nicht Session Cookie - Headers already sent durch... senden" Fehler, die Sie erhalten können. Unterhalb der H2 des Formulars fügen Sie in dieser PHP-Schnipsel hinzu:

1
<?php
2
//init variables

3
$cf = array();
4
$sr = false;
5
6
if(isset($_SESSION['cf_returndata'])){
7
    $cf = $_SESSION['cf_returndata'];
8
    $sr = true;
9
}
10
?>

Wir sind zwei Variablen auf Standardwerte festlegen. Mehr über diese später... Wir überprüfen dann, ob $_SESSION ['Cf_returndata'] festgelegt ist. Wir setzen dann $cf (Abkürzung für Kontaktformular) zu unserer Session-Variable gleich. Dies ist nur damit wir nicht $_SESSION eingeben zu müssen... Jedes Mal, wenn wir auf diese Daten zugreifen möchten. Die letzte Variable $sr (kurz Antwort des Servers), festgelegt auf True. Dies ist eine Variable, die wir überprüft werden, ob wir unser Formular vorher gebucht haben werden. Das nächste, was, das wir tun wollen, wird eine Fehlermeldung oder Erfolg am oberen Rand des Formulars angezeigt. Ersetzen Sie dies:

1
<ul id="errors" class="">
2
    <li id="info">There were some problems with your form submission:</li>
3
</ul>
4
<p id="success">Thanks for your message! We will get back to you ASAP!</p>

Mit diesem:

1
<ul id="errors" class="<?php echo ($sr && !$cf['form_ok']) ? 'visible' : ''; ?>">
2
    <li id="info">There were some problems with your form submission:</li>
3
    <?php 
4
    if(isset($cf['errors']) && count($cf['errors']) > 0) :
5
        foreach($cf['errors'] as $error) :
6
    ?>
7
    <li><?php echo $error ?></li>
8
    <?php
9
        endforeach;
10
    endif;
11
    ?>
12
</ul>
13
<p id="success" class="<?php echo ($sr && $cf['form_ok']) ? 'visible' : ''; ?>">Thanks for your message! We will get back to you ASAP!</p>

In der Standardeinstellung die Nachrichten erscheinen nicht überhaupt weil im CSS, wir eingerichtet haben "anzeigen: keine". PHP nutzen wir im Inneren das Class-Attribut der Nachrichten fügen Sie eine Klasse "sichtbare" zu ihnen, wenn sie angezeigt werden sollen. Diese Klasse setzt 'display' auf 'Block'.

1
<?php echo ($sr && !$cf['form_ok']) ? 'visible' : ''; ?>

Wir verwenden hier die ternären Operator zu überprüfen, ob...

  • (a) die Antwort des Servers ist gleich wahr und
  • (b), dass das Formular nicht in Ordnung war
  • .

Im Wesentlichen, wenn wir das Formular abgeschickt haben, wird $sr wahr gleich, und wenn das Formular ungültig war $cf ['Form_ok'] wird gleich falsch. So wird die Klasse sichtbar ausgegeben werden, aber die PHP und die Nachricht werden angezeigt, und umgekehrt für die Erfolgsmeldung. Innerhalb der Klammer prüfen wir die Werte der beiden Variablen. Wir prüfen, ob $ sr gleich true ist und (&&) $ cf ['fomr_ok'] gleich false ist. Wir sind Kurzschrift verwenden, um diese Werte zu überprüfen. Sie können es auch so schreiben, wenn man wollte:

1
<?php echo ($sr === true && $cf['form_ok'] === false) ? 'visible' : ''; ?>

Nachdem wir entschieden haben, welche Nachricht angezeigt werden soll, müssen wir den Container mit den relevanten Daten füllen.  Die Erfolgsmeldung ändert sich nicht, so dass wir das so belassen können.  Die Fehlermeldung benötigen die Überprüfungsfehler auffüllen. Diese aus, schreiben wir unsere Fehler-Array in der Session gespeichert und bevölkern ein li Element innerhalb der Ul einfach durchlaufen werden:

1
<ul id="errors" class="<?php echo ($sr && !$cf['form_ok']) ? 'visible' : ''; ?>">
2
    <li id="info">There were some problems with your form submission:</li>
3
    <?php 
4
    if(isset($cf['errors']) && count($cf['errors']) > 0) :
5
        foreach($cf['errors'] as $error) :
6
    ?>
7
    <li><?php echo $error ?></li>
8
    <?php
9
        endforeach;
10
    endif;
11
    ?>
12
</ul>

Wir prüfen zunächst, dass wir unsere Fehler-Array in $cf und, dass es mindestens einen Fehler enthält. If und Foreach Anweisung möglicherweise ein wenig anders, wie Sie sie vorher gesehen zu haben. Dies nennt man Alternative Syntax. Wir haben hier alternative Syntax verwendet, nur um es mit es vermischt mit den HTML-Code etwas lesbarer zu machen. Sie können die normalen Syntax verwenden, aber wenn Sie möchten, es ist bis auf Präferenz.

Das ist alles was, die wir brauchen, für zeigt dem Benutzer die Antwort für die Übermittlung des Formulars. Um dies zu testen, deaktivieren Sie JavaScript zu, und senden Sie das Formular. Denken Sie daran, dass der Browser das Formular zu bestätigen, wie wir die neuen HTML5-Elemente verwenden. Also um super sicher sein mein PHP funktioniert, bin ich in IE8 testen. Ja, das ist richtig, IE kommt handliches manchmal...

Wenn Sie das ungültige Formular abschicken, erhalten Sie dies:

Error MessageError MessageError Message

Und wenn Sie das Formular korrekt ausfüllen, erhalten Sie:

Success MessageSuccess MessageSuccess Message

Sie sollten auch eine e-Mail aus dem Code erhalten haben schrieben wir früher (wenn Sie das Formular korrekt ausgefüllt). Nun, da das Formular funktioniert, ist das letzte, was, das wir tun müssen, die Formularfelder wieder mit Daten des Benutzers zu füllen, wenn die Vorlage ungültig war. Tauschen Sie den HTML-Code innerhalb des Form-Tags dafür:

1
<label for="name">Name: <span class="required">*</span></label>
2
<input type="text" id="name" name="name" value="<?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['name'] : '' ?>" placeholder="John Doe" required="required" autofocus="autofocus" />
3
4
<label for="email">Email Address: <span class="required">*</span></label>
5
<input type="email" id="email" name="email" value="<?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['email'] : '' ?>" placeholder="johndoe@example.com" required="required" />
6
7
<label for="telephone">Telephone: </label>
8
<input type="tel" id="telephone" name="telephone" value="<?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['telephone'] : '' ?>" />
9
10
<label for="enquiry">Enquiry: </label>
11
<select id="enquiry" name="enquiry">
12
    <option value="General" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'General') ? "selected='selected'" : '' ?>>General</option>
13
    <option value="Sales" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Sales') ? "selected='selected'" : '' ?>>Sales</option>
14
    <option value="Support" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Support') ? "selected='selected'" : '' ?>>Support</option>
15
</select>
16
17
<label for="message">Message: <span class="required">*</span></label>
18
<textarea id="message" name="message" placeholder="Your message must be greater than 20 charcters" required="required" data-minlength="20"><?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['message'] : '' ?></textarea>
19
20
<span id="loading"></span>
21
<input type="submit" value="Holla!" id="submit-button" />
22
<p id="req-field-desc"><span class="required">*</span> indicates a required field</p>

Der einzige Unterschied ist, dass wir PHP verwenden, um das Value-Attribut der Eingänge zu füllen.

1
<?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['name'] : '' ?>

Wie wir mit Erfolg und Fehler Nachrichten, prüfen wir, ob $sr gleich true ist und $cf ['Form_ok'] gleich auf False ist, und wenn sie sind, wir den gespeicherten Wert in der Sitzung für dieses Formularfeld schreiben. Dies geschieht mit dem ternären Operator.

Wählen Sie auf der wir tun das gleiche, außer, anstelle von den gespeicherten Wert, müssen wir überprüfen jeden Optionswert zu sehen, ob es der in der Sitzung gespeicherte übereinstimmt. Wenn es passt, schreiben wir das ausgewählte Attribut für diese Option.

Schließlich eine letzte Sache, die wir tun wollen ist unset dieser Session-Variable, nachdem wir unsere Daten von ihm bekommen haben. Du musst dazu aber; Es kommt auf die Vorlieben. Durch entfernen es jetzt, wenn die Seite, über die Schaltfläche "aktualisieren" (nicht Formularbereitstellung), ein Fehler aktualisiert wird / Erfolgsmeldung wird nicht angezeigt. Wenn Sie nicht festgelegt haben, ein Benutzer könnte füllen das Kontaktformular aus, gehen werkeln im Internet, kommen zurück zu der Form und der Fehler / Erfolgsmeldung wird immer noch angezeigt werden. Ich mag dies nicht, so werde ich es verhindern, indem Sie diese Zeile PHP setzen, kurz nach der Schließung Form Stichwörter:

1
<?php unset($_SESSION['cf_returndata']); ?>

Wenn Sie eine ungültige Formular abschicken, sollten Sie bemerken jetzt, dass Ihr Formular eingegebenen Werte erhalten bleiben, und wenn Sie die Seite Referesh, die Nachricht und Daten gelöscht werden soll. Das war es für die PHP-Seite der Dinge! Sie sollten mit Ihrer Form suchen Like also gelandet:

1
<div id="contact-form" class="clearfix">
2
    <h1>Get In Touch!</h1>
3
    <h2>Fill out our super swanky HTML5 contact form below to get in touch with us! Please provide as much information as possible for us to help you with your enquiry :)</h2>
4
    <?php
5
    //init variables

6
    $cf = array();
7
    $sr = false;
8
    
9
    if(isset($_SESSION['cf_returndata'])){
10
        $cf = $_SESSION['cf_returndata'];
11
        $sr = true;
12
    }
13
    <ul id="errors" class="<?php echo ($sr && !$cf['form_ok']) ? 'visible' : ''; ?>">
14
        <li id="info">There were some problems with your form submission:</li>
15
        <?php 
16
        if(isset($cf['errors']) && count($cf['errors']) > 0) :
17
            foreach($cf['errors'] as $error) :
18
        ?>
19
        <li><?php echo $error ?></li>
20
        <?php
21
            endforeach;
22
        endif;
23
        ?>
24
    </ul>
25
    <form method="post" action="process.php">
26
        <label for="name">Name: <span class="required">*</span></label>
27
        <input type="text" id="name" name="name" value="<?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['name'] : '' ?>" placeholder="John Doe" required autofocus />
28
        
29
        <label for="email">Email Address: <span class="required">*</span></label>
30
        <input type="email" id="email" name="email" value="<?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['email'] : '' ?>" placeholder="johndoe@example.com" required />
31
        
32
        <label for="telephone">Telephone: </label>
33
        <input type="tel" id="telephone" name="telephone" value="<?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['telephone'] : '' ?>" />
34
        
35
        <label for="enquiry">Enquiry: </label>
36
        <select id="enquiry" name="enquiry">
37
            <option value="General" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'General') ? "selected='selected'" : '' ?>>General</option>
38
            <option value="Sales" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Sales') ? "selected='selected'" : '' ?>>Sales</option>
39
            <option value="Support" <?php echo ($sr && !$cf['form_ok'] && $cf['posted_form_data']['enquiry'] == 'Support') ? "selected='selected'" : '' ?>>Support</option>
40
        </select>
41
        
42
        <label for="message">Message: <span class="required">*</span></label>
43
        <textarea id="message" name="message" placeholder="Your message must be greater than 20 charcters" required data-minlength="20"><?php echo ($sr && !$cf['form_ok']) ? $cf['posted_form_data']['message'] : '' ?></textarea>
44
        
45
        <span id="loading"></span>
46
        <input type="submit" value="Holla!" id="submit-button" />
47
        <p id="req-field-desc"><span class="required">*</span> indicates a required field</p>
48
    </form>
49
    <?php unset($_SESSION['cf_returndata']); ?>
50
</div>

Vergessen Sie nicht den Aufruf von session_start() ganz oben auf der Seite! Wir haben jetzt ein voll funktionsfähiges Kontaktformular. 

Die Daten überprüft, und wenn dies gelingt, werden wir die Formularergebnissen per e-Mail zugesendet. Darüber hinaus aktualisieren wir die Benutzeroberfläche mit den Ergebnissen für jede Einreichung. Die neueren Browsern werden sogar Form validieren, bevor es gesendet wird, mithilfe der neuen HTML5 input-Typen und Attribute, die wir verwendet haben.

Das ist alles schön und gut können, aber wir noch einen Schritt weiter. JavaScript können, Polyfill Funktionen wir, die der Browser keinen (Baujahr Validierung, Unterstützung für HTML5 Attribute etc..). Wir können sogar JavaScript verwenden, um unsere Fehler- / Erfolgsmeldungen anzuzeigen und das Formular mit AJAX zu senden. 

Aber warum tun, wenn das Formular bereits funktioniert? Nun, ist es einfach. Wir wollen so viel Übereinstimmung in allen Browsern wie möglich zur Verfügung zu stellen, auch wenn es einem wirklich naff Browser. Auch, wenn man den Browser des Clients aller Validierungsarbeiten spart Ressourcen des Servers wie wir nicht zu veröffentlichen, wenn das Formular nicht gültig ist. Diese Dinge sind super bräunlich Punkte und sind nicht wirklich schwer zu tun.


Schritt 8: Was ist ein Polyfill?

"Ein Polyfill oder Polyfiller, ist ein Stück Code, die die Technologie bietet, die Sie als Entwickler, den Browser nativ zu erwarten."

In unserem Fall erwarten wir den Browser zur Unterstützung der neuen HTML5 input-Typen und Attribute, die wir verwendet haben. Firefox, Chrome, Opera und Safari haben ziemlich guten nativen Unterstützung für diese. IE6 - 9 bietet keine Unterstützung für sie überhaupt. Typische. Um ehrlich zu sein, es ist ziemlich schockierend IE9 keinen Support für diese Dinge, es erschien erst Anfang dieses Jahres. Jedenfalls sind die setzen IE bashing beiseite (ich könnte ewig so weitergehen), die ersten beiden Dinge, die wir, um Polyfill gehen der Autofokus und die PlatzhalterAttribut.

JQuery werde verwenden wir, um uns mit unserem JavaScript aushelfen. Wir verwenden es in erster Linie um unsere AJAX-Request, Animation und DOM-Traversal & Manipulation zu behandeln. Sie könnten damit durchkommen nicht in Gebrauch ist, aber Sie hätte eine erhebliche Menge an Code zu schreiben. Seine Präsenz ist nicht zu groß, also lebe ich mit der Dateigröße. Ich, würde wahrscheinlich wie du, lieber weniger Code schreiben.

Wir werden auch eine JavaScript-Bibliothek namens Modernizr verwenden, um uns mit Feature-Erkennung zu helfen. Dies ist bereits in unserer HTML5-Heizplatte enthalten, sodass wir hier nichts unternehmen müssen, um Modernizr zum Laufen zu bringen! 

Navigieren Sie zum Verzeichnis js und öffnen Sie die Datei script.js. Wir haben nicht kümmern, verknüpfen diese Datei, jQuery oder Modernizr, mit index.php wie dies bereits uns HTML5 Boilerplate vorgesehen war, die wir verwendet. Löschen Sie alles in dieser Datei und fügen Sie in die folgenden:

1
$(function(){
2
3
    //set global variables and cache DOM elements for reuse later
4
    var form = $('#contact-form').find('form'),
5
        formElements = form.find('input[type!="submit"],textarea'),
6
        formSubmitButton = form.find('[type="submit"]'),
7
        errorNotice = $('#errors'),
8
        successNotice = $('#success'),
9
        loading = $('#loading'),
10
        errorMessages = {
11
            required: ' is a required field',
12
            email: 'You have not entered a valid email address for the field: ',
13
            minlength: ' must be greater than '
14
        }
15
16
    //feature detection + polyfills
17
    formElements.each(function(){
18
    
19
        //do feature detection + polyfills here
20
        
21
    });
22
});

Unser Code wird innerhalb des Blocks $(function() {}) Leben. Dies bedeutet, dass unser Code ausgeführt wird, sobald die Seite geladen ist.  Auch werden alle Variablen oder Funktionen, die wir innerhalb dieses Blocks deklarieren mit anderen Code außerhalb nicht stören. Wir speichern dann einige DOM-Elemente, da wir auf diese ziemlich viel zugreifen werden.   Es ist effizienter, sie auf diese Weise zu cachen, als sie jedes Mal anzufordern, wenn Sie sie verwenden möchten.  Hier ist eine Auflistung dessen, was jede Variable:

  • Form: das Kontakt-Formular-Element.
  • FormElements: alle input Elemente und verarbeitet in Form mit Ausnahme der Schaltfläche "senden". Dies wird nur ein Array mit Elementen sein.
  • FormSubmitButton: das Formular absenden Knopf.
  • ErrorNotice: die Fehlermeldung--ungeordnete Listenelement.
  • SuccessNotice: die Erfolgsmeldung--Paragraph-Element.
  • Laden: Laden-Span-Element. Dies zeigt eine GIF-Datei laden, wenn das Formular einmal validiert übermittelt wird.
  • Fehlermeldungen: Dies ist ein Objekt mit etwas Text für unsere Fehlermeldungen. Diese sind mehr als einmal verwendet, so dass wir ihnen hier instanziiert werden. Sie werden feststellen, dass einige Nachrichten nicht richtig lesen. Wir werden um diese später dynamisch hinzufügen wann wir zum Validieren der Form gehen.

Danach nutzen wir eine jQuery Funktion, namens each() FormElements Array durchlaufen. Während wir die Formularelemente durchlaufen sind, wollen wir unsere Feature-Erkennung für das Platzhalter-Attribut zu tun, und wenn ein Element dieses Attribut hat aber wird nicht durch den Browser unterstützt gelten unsere Polyfill. Hier ist die Polyfill für das Platzhalterattribut: 

1
//if HTML5 input placeholder attribute is not supported
2
if(!Modernizr.input.placeholder){
3
    var placeholderText = this.getAttribute('placeholder');
4
    if(placeholderText){
5
        $(this)
6
            .addClass('placeholder-text')
7
            .val(placeholderText)
8
            .bind('focus',function(){
9
                if(this.value == placeholderText){
10
                    $(this)
11
                        .val('')
12
                        .removeClass('placeholder-text');
13
                }
14
            })
15
            .bind('blur',function(){
16
                if(this.value == ''){
17
                    $(this)
18
                        .val(placeholderText)
19
                        .addClass('placeholder-text');
20
                }
21
            });
22
    }
23
}

Hier nutzen wir Modernizr, um festzustellen, ob wir Unterstützung für das Platzhalter-Attribut auf einen Eingang haben. Modernisierer ist ein Objekt, Eingabe ist eine Eigenschaft des Objekts und Platzhalter ist eine Eigenschaft der Eingabe (also alle Punkte). Dieser Wert ist entweder wahr oder falsch.  Wir werden überprüfen, ob es ist falsch (der Browser unterstützt nicht das Platzhalter-Attribut); Wenn dies der Fall ist, setzen wir unsere Polyfill. Als Erstes deklarieren wir eine Variable, die den Platzhaltertext enthält, der dem Element zugewiesen ist.  Obwohl der Browser das Platzhalterattribut nicht unterstützt, können wir trotzdem auf dieses Attribut zugreifen.  Wir verwenden dazu eine Funktion namens getAttribute (). Das Schlüsselwort "this" bezieht sich auf die aktuellen DOM-Element sind wir durchlaufen auf dem Laufenden.

Sobald wir den Platzhaltertext verfügen, können wir eine Überprüfung, um sicherzustellen, dass es nicht leer ist. Dies ist, so dass wir nur unsere Polyfill Eingänge zuweisen, die das Platzhalter-Attribut haben. Wir sind dann einige wirklich nützliche jQuery Funktionen zusammen, um unsere Polyfill Verkettung. Hier ist eine Auflistung dessen, was wir tun:

  1. Wir wickeln das 'dieses' Schlüsselwort in der jQuery-Funktion ($()), so wir Zugang zu einigen der praktischen jQuery DOM-Funktionen haben
  2. Wir sind das Element die Klasse 'Platzhalter-Text' hinzufügen. Dies machen die Elemente Platzhaltertext, die wir, um Polyfill aussehen wie der Rest der Browser gehen. Wir haben in der Regel für diese Up bereits im CSS festgelegt.
  3. Wir setzen den Eingang Standardwert auf den Wert des Attributs Platzhalter. Diese zeigen den Platzhaltertext in das Eingabefeld ein, wenn die Seite geladen wurde.
  4. Wir sind ein Fokus-Event verbindlich, die prüft, ob der Platzhaltertext Attribut der Eingänge Wert identisch ist. Wenn es ist, die Eingabe Wert auf nichts, was die Eingabe löscht festgelegt ist, und wir entfernen Sie die "Platzhalter Text"-Klasse, so dass der Text die Standard-Eingabe Stil Text ist.
  5. Wir sind eine Unschärfe-Veranstaltung verbindlich, die prüft, ob die Eingabe Wert gleich Null ist. Wenn es ist, wir füllen den Eingang mit den Platzhaltertext, und erneut bewerben den "Platzhal tertext"

Damit wird jedem Browser, der nicht dem Platzhalter Attribut Act unterstützt, als ob es überzeugend tut. Siehe das Bild unten von IE8:

Place Holder StatesPlace Holder StatesPlace Holder States

Wir werden nächsten Polyfill das Autofokus Attribut. Dieses ist extrem einfach:

1
//if HTML5 input autofocus attribute is not supported
2
if(!Modernizr.input.autofocus){
3
    if(this.getAttribute('autofocus')) this.focus();
4
}

Wir verwenden Modernisierer, um festzustellen, ob das Attribut Autofokus unterstützt wird. Wenn nicht, dann wir überprüfen, ob dieses Element der Autofokus Attribut gesetzt, und wenn ja, wir konzentrieren uns. Einfach. In jedem Browser, der dieses Attribut nicht unterstützt, wird dies eine Berichtigung bereitzustellen.

Die nur andere Dinge, die wir brauchen, Polyfill sind das erforderliche Attribut der e-Mail Eingabetyp und die eingebaute Formularvalidierung. Wir wollen auch in der Validierung für die Länge der Nachricht hinzufügen und die Fehlermeldung mit Details zu Problemen mit dem Formular anzeigen.


Schritt 9: Formularüberprüfung, Polyfill-Stil 

1
//to ensure compatibility with HTML5 forms, we have to validate the form on submit button click event rather than form submit event. 
2
//An invalid html5 form element will not trigger a form submit.
3
formSubmitButton.bind('click',function(){
4
    var formok = true,
5
        errors = [];
6
        
7
    formElements.each(function(){
8
           
9
        //validate form elements here
10
           
11
    });
12
    
13
    //if form is not valid
14
    if(!formok){
15
        
16
        //show error message here
17
        
18
    }
19
    //if form is valid
20
    else {
21
        
22
        //ajax request + show success message here
23
        
24
    }
25
    
26
    return false; //this stops submission off the form and also stops browsers showing default error message
27
});

Wir sind ein Click-Ereignis für den Formular-Submit-Button (in der FormSubmitButton Variablen gespeichert) bindend. Wenn dieses Ereignis ausgelöst wird, werden wir das Formular überprüfen. Normalerweise ist das Submit-Ereignis des Formulars in JavaScript, wir täten dies tatsächlich auf das Submit-Ereignis des Formulars, aber wie die neueren Browser eigene Validierung erbaute, nie ausgelöst. Der Browser zeigt eine eigene Fehlermeldungen, aber dies ist höchst inkonsistent in allen Browsern, und gibt es derzeit keine Möglichkeit diese Styling. Unsere eigene Fehlermeldung Kohärenz sorgen und zeigen auch für Browser, die keine neuen Validierungsmethoden unterstützen. Um die Browser zeigen ihre Standard Fehlermeldungen zu stoppen zurück wir am Ende dieser Funktion false. Hier ist eine Auflistung dessen, was für die Variablen an die Spitze gesetzt sind:

  • Formok: Dies wird den Überblick behalten der Gültigkeit des Formulars.
  • Fehler: Dies ist ein Array und die Fehlermeldungen zu halten.

Es ist ähnlich wie die PHP-Validierung, das, die wir früher schrieben!

Wir beginnen innerhalb der Schleife, wohin wir gehen, um die Formularelemente überprüft werden. Innerhalb dieser Schleife wollen wir beginnen, indem er erklärt einige nützlichen Variablen, die wir in unsere Validierung verwenden.

1
var name = this.name,
2
    nameUC = name.ucfirst(),
3
    value = this.value,
4
    placeholderText = this.getAttribute('placeholder'),
5
    type = this.getAttribute('type'), //get type old school way
6
    isRequired = this.getAttribute('required'),
7
    minLength = this.getAttribute('data-minlength');
  • Name: der Name des aktuellen Elements.
  • NameUC: der Name des aktuellen Elements mit dem ersten Buchstaben Klassen-. ucfirst() ist eine benutzerdefinierte Methode des String-Objekts, die wir später schreiben wird.
  • Wert: der Wert des aktuellen Elements.
  • PlaceholderText: der Platzhaltertext des aktuellen Elements.
  • Typ: der Typ des aktuellen Elements.
  • IsRequired: ob das aktuelle Element das erforderliche Attribut gesetzt oder nicht hat.
  • MinLength: der Daten-Minlength Wert des aktuellen Elements (falls zutreffend).

Da wir nun unsere Variablen festgelegt haben, können wir mit unserer Überprüfung starten. Für die Elemente, die die HTML5 input-Typen und Attribute verwenden, können wir die neue Validierung JavaScript-API verwenden, um ihre Gültigkeit zu überprüfen.

In HTML5 haben Formular-Elemente eine neue Eigenschaft namens Gültigkeit. Dies ist, wo alle die Überprüfungsdaten für dieses Element gespeichert ist. In Firebug sieht es wie folgt:

Firebug ScreenshotFirebug ScreenshotFirebug Screenshot

Wie Sie sehen, gibt es in diesem Objekt zahlreiche Eigenschaften, die uns einen Hinweis auf das Problem geben.  Die Werte der Eigenschaften sind entweder falsch oder falsch. In diesem Screenshot ich habe versucht, das Formular ohne Namen, und die Konsole (console.log(this.validity) die Gültigkeit-Eigenschaft für die Namenseingabe eingeloggt ). Dies zeigt mir, dass ein Wert fehlt (ValueMissing = True).

Unser Code für die Überprüfung der HTML5-Elemente:

1
//if HTML5 formfields are supported            
2
if( (this.validity) && !this.validity.valid ){
3
    formok = false;
4
    
5
    //if there is a value missing
6
    if(this.validity.valueMissing){
7
        errors.push(nameUC + errorMessages.required);    
8
    }
9
    //if this is an email input and it is not valid
10
    else if(this.validity.typeMismatch && type == 'email'){
11
        errors.push(errorMessages.email + nameUC);
12
    }
13
    
14
    this.focus(); //safari does not focus element an invalid element
15
    return false;
16
}

Wir überprüfen ob dieses Formularelement die Eigenschaft, Gültigkeit hat, und wenn dies der Fall, wir dann gültige Eigenschaft des Objekts Gültigkeit prüfen zu sehen, ob dieses Feld in Ordnung ist.  Wenn er nicht gültig ist (Ich benutze die Kurzschrift!, für falsch zu überprüfen), wir Formok auf False festgelegt, und führen Sie einige Tests um zu sehen, was das Problem ist.

Wenn der Wert nicht vorhanden ist (ausgelöst durch Pflichtfelder), fügen wir eine Fehlermeldung in der Fehler-Array, die, das wir zuvor festgelegt. Wir verwenden die Push()Methode des Array-Objekts. Die Fehlermeldung wird bestehen aus den Namen des Elements (erster Buchstabe Klassen-) verkettet mit der erforderlichen Fehlermeldung, die wir früher in unserem Skript festgelegt.

Wenn dieses Formular Felder Wert nicht vorhanden ist, wollen wir dann feststellen, ob die richtigen Daten eingegeben wurde. Der einzige Eingang in unser Formular, die Validierung ist das e-Mail-Feld. Mit diesem im Verstand, in der Elseif Teil unseres Codes sind wir überprüfen, ob die TypeMismatch Eigenschaft des Objekts Gültigkeit gleich wahr und ist wenn dieser Input Type eigentlich e-Mail ist. Wenn ja, fügen wir die e-Mail-Fehlermeldung auf unsere Fehler-Array.

Wenn der Browser ein Feld überprüft und wird als ungültig betrachtet, ist es automatisch ausgerichtet. Safari unterstützt dies, nicht deshalb aus Gründen der Konsistenz, wir uns manuell die Eingabe konzentrieren. Wir zurückgeben false, dann am Ende unsere HTML5 Eingabeüberprüfung zu brechen aus der Schleife, wie wir wissen, dass wir ein ungültiges Element (wir brauchen nicht unsere Zeit den Rest der Elemente in der Form Validierung zu vergeuden).

Dies deckt unsere HTML5 Eingaben sehr schön, aber müssen wir nun zu den Browsern gerecht zu werden, die nicht die Formularvalidierung JavaScript API unterstützen. Wenn die JavaScript-Form-Validierung-API nicht vom Browser unterstützt wird wird der obige Code nie Exectued und übersprungen.

Das erste, was, dem wir gesucht wird, ist, wenn das Feld erforderlich war. Unsere Polyfill dafür aussehen wird:

1
//if this is a required element
2
if(isRequired){    
3
    //if HTML5 input required attribute is not supported
4
    if(!Modernizr.input.required){
5
        if(value == placeholderText){
6
            this.focus();
7
            formok = false;
8
            errors.push(nameUC + errorMessages.required);
9
            return false;
10
        }
11
    }
12
}

Zunächst prüfen wir, ob dieses Feld ein Pflichtfeld ist (diktiert das erforderliche Attribut). Wir verwenden dann Modernizr, um zu überprüfen, ob das erforderliche Attribut vom Browser unterstützt wird. Wenn dies nicht der Fall ist, müssen wir manuell überprüfen den Wert des Elements und vergleichen Sie es mit Platzhalter-Attribut des Elements. Wenn sie identisch sind, wurde dann offensichtlich dieses Formularfeld nicht ausgefüllt so dass wir vier Dinge tun:

  1. Wir konzentrieren uns die Eingabe (als das was der Browser tut, wenn seine native Validierung mit)
  2. Wir festgelegt die Formok Variable auf False, wie das Formular ungültig ist
  3. Wir fügen eine Fehlermeldung auf unsere Fehler-Array.
  4. Wir geben Sie false, die bricht aus der Schleife und gehen direkt an das nächste Bit des Codes außerhalb der Schleife.

Als nächstes werden wir prüfen, ob dies ist ein e-Mail-Eingang, und wenn es ist, ob eine gültige Email Adresse eingegeben wurde.

1
//if HTML5 input email input is not supported
2
if(type == 'email'){     
3
    if(!Modernizr.inputtypes.email){ 
4
        var emailRegEx = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; 
5
        if( !emailRegEx.test(value) ){    
6
            this.focus();
7
            formok = false;
8
            errors.push(errorMessages.email + nameUC);
9
            return false;
10
        }
11
    }
12
}

Es ist ziemlich genau das selbe wie vor. Wir sehen, ob dies tatsächlich ein e-Mail-Feld, und dann verwenden Modernizr um zu überprüfen, ob der e-Mail-Eingang unterstützt wird. Wenn es nicht ist, wir unseren Code schreiben, der überprüft, ob es gültig oder nicht ist. Für diese Polyfill nutzen wir reguläre Ausdrücke um zu testen, ob die e-Mail gültig oder nicht ist. Wir erstellen einen regulären Ausdruck in der Variablen emailRegEx und verwenden dann die test ()  Methode des regulären Ausdrucks, um zu testen, ob der Wert der Eingabe für den regulären Ausdruck gültig ist. 

Erfahren Sie mehr über die Verwendung der JavaScript reguläre Ausdrücke hier.

Wenn die e-Mail-Adresse nicht gültig ist, tun wir die gleichen vier Dinge, die wir auf die erforderlichen Eingaben zu überprüfen.

Das letzte, was, das wir in unserem Formular überprüfen müssen, ist die Länge der Nachricht. Die erforderliche Validierung wurde bereits oben, geachtet wurde also alles, was wir tun müssen, ist die Nachrichtenlänge überprüfen:

1
//check minimum lengths
2
if(minLength){
3
    if( value.length < parseInt(minLength) ){
4
        this.focus();
5
        formok = false;
6
        errors.push(nameUC + errorMessages.minlength + minLength + ' charcters');
7
        return false;
8
    }
9
}

Wir brauchen nicht Modernizr hier verwenden. Stattdessen alles, was wir tun müssen ist zu überprüfen, die dieses Element hat eine Mindestlänge festlegen, und wenn ja, stellen Sie sicher die Länge größer als die eingestellte minimale Länge ist. Length ist eine Eigenschaft aller Zeichenfolgenobjekte in JavaScript und gibt die Anzahl der Zeichen in der Zeichenfolge zurück.  Wir verwenden parseInt() MinLength in eine Ganzzahl zu vergleichen es gegen value.length zu konvertieren. MinLength wurde aus dem Daten-Minlength Attribut abgerufen. Dies wird als eine Zeichenfolge abgerufen, also um mögliche Fehler auf der ganzen Linie (Vergleich von Zeichenfolgen, Zahlen usw.) zu vermeiden, dies in eine Ganzzahl umwandeln.

Unsere Polyfills und Validierung sind jetzt fertig und sortiert. Sie sollten mit dem folgenden Code gelandet:

1
//to ensure compatibility with HTML5 forms, we have to validate the form on submit button click event rather than form submit event. 
2
//An invalid html5 form element will not trigger a form submit.
3
formSubmitButton.bind('click',function(){
4
    var formok = true,
5
        errors = [];
6
        
7
    formElements.each(function(){
8
        var name = this.name,
9
            nameUC = name.ucfirst(),
10
            value = this.value,
11
            placeholderText = this.getAttribute('placeholder'),
12
            type = this.getAttribute('type'), //get type old school way
13
            isRequired = this.getAttribute('required'),
14
            minLength = this.getAttribute('data-minlength');
15
            
16
        //if HTML5 formfields are supported            
17
        if( (this.validity) && !this.validity.valid ){
18
            formok = false;
19
            
20
            //if there is a value missing
21
            if(this.validity.valueMissing){
22
                errors.push(nameUC + errorMessages.required);    
23
            }
24
            //if this is an email input and it is not valid
25
            else if(this.validity.typeMismatch && type == 'email'){
26
                errors.push(errorMessages.email + nameUC);
27
            }
28
            
29
            this.focus(); //safari does not focus element an invalid element
30
            return false;
31
        }
32
        
33
        //if this is a required element
34
        if(isRequired){    
35
            //if HTML5 input required attribute is not supported
36
            if(!Modernizr.input.required){
37
                if(value == placeholderText){
38
                    this.focus();
39
                    formok = false;
40
                    errors.push(nameUC + errorMessages.required);
41
                    return false;
42
                }
43
            }
44
        }
45
46
        //if HTML5 input email input is not supported
47
        if(type == 'email'){     
48
            if(!Modernizr.inputtypes.email){ 
49
                var emailRegEx = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; 
50
                if( !emailRegEx.test(value) ){    
51
                    this.focus();
52
                    formok = false;
53
                    errors.push(errorMessages.email + nameUC);
54
                    return false;
55
                }
56
            }
57
        }
58
        
59
        //check minimum lengths
60
        if(minLength){
61
            if( value.length < parseInt(minLength) ){
62
                this.focus();
63
                formok = false;
64
                errors.push(nameUC + errorMessages.minlength + minLength + ' charcters');
65
                return false;
66
            }
67
        }
68
    });
69
    
70
    //if form is not valid
71
    if(!formok){
72
        
73
        //show error message here
74
        
75
    }
76
    //if form is valid
77
    else {
78
        
79
        //ajax request + show success message here
80
        
81
    }
82
    
83
    return false; //this stops submission off the form and also stops browsers showing default error message
84
});

Prima! Wir sind fast da jetzt. An diesem Punkt müssen wir nur den Code schreiben, der die Logik behandelt, um zu prüfen, ob das Formular gesendet werden soll oder nicht.   Wir müssen, zeigen unsere Fehlermeldungen, die wir gespeichert haben, und das Formular absenden, wenn ein Fehler vorliegt. Wenn auf der anderen Seite gibt es kein Fehler, wir senden das Formular per AJAX und offenbaren die Erfolgsmeldung. Außerdem müssen wir die ucfirst() Funktion, die wir verwendet haben, um den ersten Buchstaben jeder Feldname in Großbuchstaben zu decken.


Schritt 11: Fast dort...

Das erste, was wir tun ist eine Funktion für den Umgang mit den Nachrichten und auch unsere ucfirst() Funktion zu schreiben. Fügen Sie den folgenden Code außerhalb der formSubmitButton.bind... Logik, die wir geschrieben haben.

1
//other misc functions
2
function showNotice(type,data)
3
{
4
    if(type == 'error'){
5
        successNotice.hide();
6
        errorNotice.find("li[id!='info']").remove();
7
        for(x in data){
8
            errorNotice.append('<li>'+data[x]+'</li>');    
9
        }
10
        errorNotice.show();
11
    }
12
    else {
13
        errorNotice.hide();
14
        successNotice.show();    
15
    }
16
}
17
18
String.prototype.ucfirst = function() {
19
    return this.charAt(0).toUpperCase() + this.slice(1);
20
}

Die ShowNotice Funktion werden zwei Argumente.

  • Der Typ der Meldung zeigen
  • Die Daten in der Nachricht angezeigt.

Wenn der Typ "Fehler" ist, wir verstecken die Erfolgsmeldung, durchlaufen die Daten (die ein Array sein sollte), und fügen Sie die Listenelemente, die Hinweise auf Fehler UL. Wir zeigen dann die Fehlermeldung mit der jQuery Funktion show(). Weil alle unsere Code befindet sich im gleichen Block, haben wir Zugriff auf Variablen, die außerhalb dieser Funktion (SuccessNotice und ErrorNotice). Wenn wir die Erfolgsmeldung anzeigen möchten, blenden wir einfach die Fehlermeldung aus und zeigen die Erfolgsmeldung an. 

Mit der Funktion ucfirst () füge ich diese Funktion dem Prototyp des String-Objekts hinzu.

"Ein Prototyp ist ein Objekt, von dem andere Objekte Eigenschaften erben." 

Dies bedeutet, dass alle String-Objekte unsere ucfirst ()  Funktion übernehmen. Deshalb haben wir früher name.ucfirst () verwendet. name ist eine Zeichenfolge, und da unsere Methode im Prototyp enthalten ist, steht sie zur Verfügung.

Wir erhalten das erste Zeichen (charAt (0)), machen es zu Großbuchstaben (toUpperCase ()) und geben es dann mit dem Rest der Zeichenfolge abzüglich des ersten Zeichens (Slice (1)) zurück. charAt, toUpperCase und slice sind alle Methoden des String-Objekts. Mehr über das Prototypobjekt erfahren Sie hier oder hier.

Nun, da wir unsere verschiedenen Funktionen sortiert haben, können wir uns auf die Logik für das Ergebnis des Formulars konzentrieren.  Wir arbeiten wieder in der formSubmitButton.bind Logik.

1
//if form is not valid
2
if(!formok){
3
    
4
    //show error message here
5
    
6
}
7
//if form is valid
8
else {
9
    
10
    //ajax request + show success message here
11
    
12
}

Wir beginnen mit der Logik, wenn das Formular nicht gültig ist.  Der folgende Code sollte in die if Anweisung eingefügt werden:

1
//animate required field notice
2
$('#req-field-desc')
3
    .stop()
4
    .animate({
5
        marginLeft: '+=' + 5
6
    },150,function(){
7
        $(this).animate({
8
            marginLeft: '-=' + 5
9
        },150);
10
    });
11
12
//show error message 
13
showNotice('error',errors);

Der erste Codeabschnitt animiert einfach das '* zeigt ein erforderliches Feld' an.  Das ist nicht wesentlich; Es ist nur eine nette Sicherheit, die dem Benutzer ein wenig mehr Feedback gibt - ein Problem ist tatsächlich aufgetreten.   Wir verwenden die jQuery-Funktion animate (), um den linken CSS-Wert des Elements zu animieren. Danach rufen wir unsere showNotice ()  Funktion auf. Wir möchten die Fehlermeldung anzeigen, so dass wir als erstes Argument 'error' übergeben, und dann für die Daten das Fehlerarray übergeben, in dem wir unsere Fehlernachrichten zur Formularüberprüfung gespeichert haben.

Wenn das Formular gültig ist, müssen wir es über AJAX einreichen. 

1
loading.show();
2
$.ajax({
3
    url: form.attr('action'),
4
    type: form.attr('method'),
5
    data: form.serialize(),
6
    success: function(){
7
        showNotice('success');
8
        form.get(0).reset();
9
        loading.hide();
10
    }
11
});

Zunächst enthüllen wir unser Ladegif, um anzuzeigen, dass das Formular etwas tut. Wir verwenden dann die jQuery-Funktion ajax (), um das Formular an process.php zu senden. Für die URL und den Typ verwenden wir die jQuery-Funktion attr (), um diese Attribute zu erhalten. Für die Daten verwenden wir die jQuery-Funktion serialize (). Wenn die AJAX-Anforderung erfolgreich war, rufen wir unsere Funktion showNotice () auf und übergeben sie als erstes Argument 'success'. Dies zeigt unsere Erfolgsmeldung.  Als letztes setzen wir das Formular zurück (löschen Sie die Formularfelder) und verbergen Sie das Ladegif Für das gesamte JavaScript ist jetzt gesorgt!  Congrats1 Sie sollten mit Ihrer script.js Datei fertig sein, die so aussieht: 

1
$(function(){
2
3
    //set global variables and cache DOM elements for reuse later
4
    var form = $('#contact-form').find('form'),
5
        formElements = form.find('input[type!="submit"],textarea'),
6
        formSubmitButton = form.find('[type="submit"]'),
7
        errorNotice = $('#errors'),
8
        successNotice = $('#success'),
9
        loading = $('#loading'),
10
        errorMessages = {
11
            required: ' is a required field',
12
            email: 'You have not entered a valid email address for the field: ',
13
            minlength: ' must be greater than '
14
        }
15
    
16
    //feature detection + polyfills
17
    formElements.each(function(){
18
19
        //if HTML5 input placeholder attribute is not supported
20
        if(!Modernizr.input.placeholder){
21
            var placeholderText = this.getAttribute('placeholder');
22
            if(placeholderText){
23
                $(this)
24
                    .addClass('placeholder-text')
25
                    .val(placeholderText)
26
                    .bind('focus',function(){
27
                        if(this.value == placeholderText){
28
                            $(this)
29
                                .val('')
30
                                .removeClass('placeholder-text');
31
                        }
32
                    })
33
                    .bind('blur',function(){
34
                        if(this.value == ''){
35
                            $(this)
36
                                .val(placeholderText)
37
                                .addClass('placeholder-text');
38
                        }
39
                    });
40
            }
41
        }
42
        
43
        //if HTML5 input autofocus attribute is not supported
44
        if(!Modernizr.input.autofocus){
45
            if(this.getAttribute('autofocus')) this.focus();
46
        }
47
        
48
    });
49
    
50
    //to ensure compatibility with HTML5 forms, we have to validate the form on submit button click event rather than form submit event. 
51
    //An invalid html5 form element will not trigger a form submit.
52
    formSubmitButton.bind('click',function(){
53
        var formok = true,
54
            errors = [];
55
            
56
        formElements.each(function(){
57
            var name = this.name,
58
                nameUC = name.ucfirst(),
59
                value = this.value,
60
                placeholderText = this.getAttribute('placeholder'),
61
                type = this.getAttribute('type'), //get type old school way
62
                isRequired = this.getAttribute('required'),
63
                minLength = this.getAttribute('data-minlength');
64
                
65
            //if HTML5 formfields are supported            
66
            if( (this.validity) && !this.validity.valid ){
67
                formok = false;
68
                
69
                //if there is a value missing
70
                if(this.validity.valueMissing){
71
                    errors.push(nameUC + errorMessages.required);    
72
                }
73
                //if this is an email input and it is not valid
74
                else if(this.validity.typeMismatch && type == 'email'){
75
                    errors.push(errorMessages.email + nameUC);
76
                }
77
                
78
                this.focus(); //safari does not focus element an invalid element
79
                return false;
80
            }
81
            
82
            //if this is a required element
83
            if(isRequired){    
84
                //if HTML5 input required attribute is not supported
85
                if(!Modernizr.input.required){
86
                    if(value == placeholderText){
87
                        this.focus();
88
                        formok = false;
89
                        errors.push(nameUC + errorMessages.required);
90
                        return false;
91
                    }
92
                }
93
            }
94
95
            //if HTML5 input email input is not supported
96
            if(type == 'email'){     
97
                if(!Modernizr.inputtypes.email){ 
98
                    var emailRegEx = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; 
99
                     if( !emailRegEx.test(value) ){    
100
                        this.focus();
101
                        formok = false;
102
                        errors.push(errorMessages.email + nameUC);
103
                        return false;
104
                    }
105
                }
106
            }
107
            
108
            //check minimum lengths
109
            if(minLength){
110
                if( value.length < parseInt(minLength) ){
111
                    this.focus();
112
                    formok = false;
113
                    errors.push(nameUC + errorMessages.minlength + minLength + ' charcters');
114
                    return false;
115
                }
116
            }
117
        });
118
        
119
        //if form is not valid
120
        if(!formok){
121
            
122
            //animate required field notice
123
            $('#req-field-desc')
124
                .stop()
125
                .animate({
126
                    marginLeft: '+=' + 5
127
                },150,function(){
128
                    $(this).animate({
129
                        marginLeft: '-=' + 5
130
                    },150);
131
                });
132
            
133
            //show error message 
134
            showNotice('error',errors);
135
            
136
        }
137
        //if form is valid
138
        else {
139
          loading.show();
140
            $.ajax({
141
                url: form.attr('action'),
142
                type: form.attr('method'),
143
                data: form.serialize(),
144
                success: function(){
145
                    showNotice('success');
146
                    form.get(0).reset();
147
                    loading.hide();
148
                }
149
            });
150
        }
151
        
152
        return false; //this stops submission off the form and also stops browsers showing default error messages
153
        
154
    });
155
156
    //other misc functions
157
    function showNotice(type,data)
158
    {
159
        if(type == 'error'){
160
            successNotice.hide();
161
            errorNotice.find("li[id!='info']").remove();
162
            for(x in data){
163
                errorNotice.append('<li>'+data[x]+'</li>');    
164
            }
165
            errorNotice.show();
166
        }
167
        else {
168
            errorNotice.hide();
169
            successNotice.show();    
170
        }
171
    }
172
    
173
    String.prototype.ucfirst = function() {
174
        return this.charAt(0).toUpperCase() + this.slice(1);
175
    }
176
    
177
});

Fazit 

Herzliche Glückwünsche!  Du hast es geschafft  Es war eine lange Fahrt, und wir haben in diesem Tutorial eine Menge Erfahrung gemacht. 

Also, wo gehst du hin?  Dies könnte zu einer viel größeren Form erweitert werden, und der gesamte Code, den Sie geschrieben haben, funktioniert weiterhin einwandfrei.  Sie können sogar Ihre eigene Validierung für Dinge wie das Telefoneingabefeld oder das Attribut maxlength hinzufügen! 

Vielen Dank für das Lesen und ich hoffe, Ihnen hat dieses Tutorial gefallen! 

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.