CSS, HTML und Javascript mit {stil}

Wie funktionieren Formulare auf Webseiten?

Javascript für HTML-Formulare

Um Daten mit einem HTML-Formular zu sammeln und zu verarbeiten, brauchen wir eine HTML-Datei, in der ein HTML-Formular (<form>) die Eingaben des Benutzers aufnimmt.

Auf dem Server muss eine Anwendung – zumeist eine PHP-Anwendung oder ein CGI-Programm – bereitstehen, um die Daten zu verarbeiten.

Formulare bestehen aus mindestens zwei Komponenten: dem HTML-Formular mit form- und input-Tags für die HTML-Seite und einem PHP-Programm (hier z.B. formmailer.php) auf dem Server.

<form action="formmailer.php" method="post">
   <label>Name 
      <input type="text" name="username" value="" placeholder="Name" />
   </label>
   <label>Ort
      <select name="ort">
         <option value="Münster">Mü;nster</option>
         <option value="Böblingen">Böblingen</option>
         <option value="Rüdesheim" selected="selected">Rüdesheim</option>
         <option value="München">München</option>
      </select>
   </label> 
   <label>Bemerkung
      <textarea name="bemerkung"></textarea>
   </label>
   <label><input type="submit" value="Absenden" /><label>
</form>

Form submit

Der Benutzer füllt Felder des Formulars aus und klickt auf „Absenden“ (submit), damit der Browser die Daten zur Weiterbearbeitung an das Programm auf dem Server (formmailer.php) überträgt.

Formular Query String

Beim Absenden des Formulars stellt der Browser aus den Eingaben einen HTTP-Request zusammen. Das ist letztendlich nicht anderes als eine Zeichenkette (Query String), die bestimmten Regeln folgt: Alle Eingaben des Benutzers werden mit ein paar Sonderzeichen aneinander geheftet. Umlaute und Leerzeichen werden durch eine kleine Zeichenkette kodiert (z.B. das Leerzeichen durch %20, ein ü durch %C3%BC).


Wenn die Felder des Formulars ausgefüllt sind und das Formular abgeschickt wird, entsteht ein Übergabestring:

So würde zum Beispiel der String aussehen, der beim Absenden des Formulars zum PHP-Programm auf dem Server geschickt wird:

Peter | Rüdesheim | Meine Bemerkung

form.php?name=Peter&ort=R%C3%BCdesheim&bemerkung=Meine%20Bemerkung

Darum müssen wir uns im Grunde genommen nicht kümmern: Das Zusammensetzen und Übertragen der Daten übernimmt der Browser, das PHP-Programm bekommt die Daten automatisch mundgerecht aufbereitet.

Nur wenn die Daten vor dem Absenden geprüft werden – z.B. sind alle erforderlichen Felder ausgefüllt? – kommt eine dritte Komponente ins Spiel: Javascript für Formulare.

Javascript Zugriff auf Formularfelder

Javascript greift auf den Inhalt von Formularfeldern genauso zu wie auf andere Elemente:

  • Wenn das Formularfeld ein id-Attribut hat, mit getElementById(),
  • zusätzlich kann Javascript in Formularen das name-Attribut benutzen – getElementsByName().

Wenn der Benutzer das Formular absendet, feuert der Browser ein onsubmit-Event. Javascript muss dieses Ereignis abfangen und verhindern, dass die Daten an die Anwendung übertragen werden.

document.getElementById('myForm').onsubmit = function () {
    var muser = document.getElementById('muser');
    var errorMsg = document.getElementById('errorMsg');
    
    console.log('Formular wird ausgefüllt');
    if ( muser.value == '') {
        errorMsg.innerHTML = 'Feld ist erforderlich';
        muser.focus();
        return false;
    }
}

Das Abfangen des Ereignisses onsubmit alleine reicht nicht. Erst return false oder heute lieber preventDefault verhindert bei einer falschen oder fehlenden Eingabe, dass die Daten an die Anwendung auf dem Server übermittelt werden. muser.focus() setzt den Cursor in das Eingabefeld.

Wenn kein Fehler gefunden wird, werden die Daten automatisch an den Server ausgeliefert.

Die Prüfung in diesem Beispiel ist einfach gehalten. I.d.R. wird mit regulären Ausdrücken geprüft, ob die Eingabe eine minimale Länge hat und ob es sich um korrekte Zeichen handelt.

<form action="form1.php" method="get" id="myForm">
    <label for="muser">Name 
        <span style="color:firebrick" id="errorMsg"></span><br>
        <input type="text" id="muser" name="muser" value="" placeholder="Name">
    </label>
    <input type="submit" value="Absenden" />
</form>

Formulardaten per POST oder GET

Bei Daten in kleinen Mengen wird der HTTP-Request i.d.R. als GET-Request übertragen, während ein POST-Request für für das Heraufladen von Dateien und großen Mengen von Text eingesetzt wird. Ein GET-Request kodiert die Nachricht in einem »Query-String«, der an die URL der angefragten Resource angehangen wird. Ein POST-Request sendet die Nachricht im Body des Requests.

Für Javascript ist das GET oder POST unerheblich, solange kein XMLHTTPRequest eingesetzt wird.

Formulardaten erkennen

Die Anwendung auf dem Server muss erkennen, aus welchen Feldern das Formular besteht und welche Daten der Anwender in welches Feld eingetragen hat. Die Informationen bilden Name/Wert-Paare, die durch ihre Kodierung voneinander getrennt werden:

form.phpdie aufgerufene URL
?trennt die URL von den Daten
=trennt den Namen vom Wert
&trennt die Namen=Wert-Paare

Der Browser übermittelt nur die Daten aus Eingabefelder mit name- und value-Attributen, denn diese Attribute bilden die Name-/Wertpaare. Die einzige Ausnahme ist das textarea-Element, das kein value-Attribut benötigt, weil der Wert automatisch durch den eingegebenen Text erzeugt wird.

Formular verarbeiten: Name-Wert-Paar

Die Daten kodiert werden codiert:

  • Leerzeichen in eingegebenen Daten (z.B. bei mehreren Wörtern) werden durch + oder %20 ersetzt.
  • Alle Zeichen mit den ASCII-Werten 128 bis 255 (hexadezimal 80 bis FF) werden als Hexwerte geschrieben, eingeleitet durch % und dahinter der Hexadezimalwert des Zeichens (z.B. wird ö im Zeichensatz ISO-8859-1 durch %F6 ersetzt).
  • Alle Zeichen, die in diesen Regeln als Steuerzeichen vorkommen (also &, +, = und %) werden ebenfalls hexadezimal kodiert.

Das PHP POST-Array

Serverseitige Anwendungen in PHP müssen sich nicht um die Kodierung der Daten kümmern. In einer PHP-Anwendung landen die Daten fertig vorbereitet als Werte eines Arrays.

PHP kann die Daten direkt abfragen. Wenn die Eingabe aus dem Formular mit method="post" versendet wurden, kann PHP jedes Feld mit $_POST[<Name>] ansprechen.

if (isset ($_POST ['ort']) && $_POST ['ort'] == "Rüdesheim") {
    …
}

Die Anwendung muss sich auch nicht darum kümmern, ob "ort" aus einem Input-Feld, einem Select oder einer Textarea kommt, oder ob das Eingabefeld vom Typ "text" oder "hidden" ist.