Suche nach als

Formulare

Auf dieser Seite:

Vorwort zu Formularen

Formulare dienen einem Websitebetreiber zum Einholen von Informationen, oder dem Surfer zum Stellen von Fragen und abgeben von Kommentaren und um sich einzuloggen; es ist eigentlich das Mittel zur Kontaktaufnahme. Hier erstelle ich ein Formular und schreibe über die Möglichkeiten und Regeln zum Versenden.

Das Formular soll möglichst wenig Felder haben, am besten nur die, welche sowieso mit * als obligatorisch zum Ausfüllen gekennzeichnet würden.

Den Nutzern zuliebe soll die Notwendigkeit der Datenerfassung begründet, über deren Verwendung informiert, und der vertrauliche Umgang damit garantiert werden, und es sollte eine Möglichkeit zum Beantragen der Löschung der Daten gegeben werden.

Formular definieren

<form>...</form>

Ein Formular wird durch die <form>...</form> Tags definiert. Alles was zu einem Formular gehört, bis und mit Absende-Button, gehört zwischen diese Tags.

Der Formularnamen und die ID, ermöglichen, das Formular per Javascript anzusprechen: name="bananenformular" id="bananenformular" Dann geben drei Attribute action="..." , method="..." und enctype="..." im Start-Tag an, was mit den Daten im Formular geschehen soll, wenn man den Button zum Absenden gedrückt hat:

Versandwege

method= "get" / "post"

Bei method="get" werden die Daten als Umgebungsvariable zwischen Transport und Verarbeitung festgehalten, dieser QUERY_STRING (Abfragezeile) zeigt sich nach dem Absenden im Adressfeld des Browsers, er wurde mit einem ? an die Adresse angehängt. Der Querystring ist in der Länge traditionell auf 255 Zeichen begrenzt. In den Query-String kann hinein geschrieben werden - auch ohne Formular.

Der QUERY_STRING benutzt folgende Regeln:

  • Die einzelnen Formularelemente inklusive ihrer Daten werden durch ein kaufmännisches und (&) voneinander getrennt.
  • Name und Daten eines Formularelements werden durch ein Gleichheitszeichen (=) voneinander getrennt (als Variablenname=Wert), Werte nicht in Anführungszeichen.
  • Leerzeichen in den eingegebenen Daten (z.B. bei mehreren Wörtern) werden durch ein Pluszeichen (+) ersetzt.
  • Alle Zeichen mit den (erweiterten) ASCII-Werten 128 bis 255 (hexadezimal 80 bis FF) werden durch eine Hexadezimalzeichenfolge umschrieben, eingeleitet durch ein Prozentzeichen (%) und dahinter der Hexadezimalwert des Zeichens (z.B. wird der deutsche Umlaut ö im Zeichensatz ISO-8859-1 durch %F6 umschrieben).
  • Alle Zeichen, die in diesen Regeln als Steuerzeichen vorkommen (also &, +, = und %) werden ebenfalls hexadezimal umschrieben, wie höherwertige ASCII-Zeichen.

Bei method="post" werden die Daten als Variablen versteckt versendet, die Menge kann auch viel grösser sein; sollten als Resultat des Formulars Einträge in einer Datenbank erstellt werden, dann ist dies die bessere Methode weil unsichtbar.
Auch bei E-Mail Formularen (veraltet) und Formularen mit Dateiupload muss die post Methode gewählt werden.

Versandziele

Also, was mit den Daten im Formular passiert wird am Anfang im <form>-Tag festgelegt (nicht etwa erst im Absende-Button)!

action="scripts/meinformularprozessor.php"

Als action="wert" wird also die URL eines Skrips angeben, welches die Daten empfängt, kontrolliert und verarbeitet. Es sendet ev. auch eine Antwortseite mit Empfangsbestätigung an den Absender-Browser.
Ein Perl-Script wird manchmal vom Host auf dem Server in einem speziellen cgi-bin Ordner bereit gestellt (CGI = Common Gateway Interface, Allgemeines Tor als Schnittstelle).
Einige Hosts stellen auch eine Mailer-Applikation zur Verfügung, welches aber nicht unbedingt im CGI-bin zu finden ist sondern beim Host erfragt werden muss.
Es können aber auch PHP, Python oder andere Scriptsprachen verwendet werden: action="scripts/meinformularprozessor.php"

Als action= könnte direkt ein E-Mail Versand ausgelöst werden, das ist aber einfach zu misbrauchen, denn kein Script prüft die Daten; Spammer und Hacker können solche Formulare relativ einfach kapern und neue Empfänger anhängen oder Code in die Formular Felder eingeben!
<form name="buch_bestellung" action="mailto:antwort@1000fragen.ch?subject=Irgend ein Betreff&body=Hallo" method="post" enctype="text/plain">...</form> sendet die Daten als E-Mail mit Betreff und dem Inhalt Hallo an die genannte Adresse.

enctype=

Das enctype="text/plain" (nur zum E-Mailversand) bedeutet, dass die Daten in Klartext empfangen werden, also nicht in ASCII umkodiert, das enc im enctype heiss nicht encrypt (Verschlüsselung) sondern encode (Kodierung). Mit enctype="text/plain" kann PHP nicht anfangen, geht der Formularinhalt an ein PHP Script, sollte enctype weggelassen werden.
Will man mit dem Formular das hochladen von Dateien ermöglichen, so ist enctype="multipart/form-data" zwingend.

lang="de"

Das lang-Attribut ist optional, es dient zur Internationalisierung.

Eingabefelder

<input type="...">...</input>

Das input-Tag erzeugt je nach type folgende Felder:

Textfeld

<input type="text" name="ErstesEingabeFeld" id="ErstesEingabeFeld">
Der ursprünglichste input type. Das funktioniert aber nur, wenn der Doctype HTML Transitional ist; bei strict oder gar XML brauchen wir zudem zwingend ein </input> Endtag es sei denn wir schreiben den Anfangstag so: <input ... /> !

Alle Felder sollen einen Namen und eine id bekommen, damit sie angesprochen werden können.

Jedes Eingabefeld wird mit dem Attribut name="..." benannt und mit id=".." identifizierbar gemacht. Der Name wird als Variablenname den Wert (das ist die Eingabe in das Feld) an das Empfänger-Skript weitergeben. Die Id ermöglicht einem JavaScript und CSS-Anweisungen das Feld direkt zu manipulieren. Die User können nun in das Feld klicken und etwas hinein schreiben:

Weitere Attribute im <input> Tag sind:
size="8"; um die dargestellte Länge des Feldes auf 8 Zeichen zu begrenzen (per Default, also ohne diese Angabe wird das feld 20 Zeichen lang).

Anmerkung zu CSS: Durch CSS (CascadingStileSheet) kann die Grösse des textfeldes Pixelgenau bestimmt werden! Zudem können mit CSS auch die Feld-Höhe und die Ränder, ja sogar Hintergrundfarben und vieles mehr gestylt werden. >> Beispiel Formular mit CSS

maxlength="4" um die Anzahl der eingebbaren Zeichen auf 4 zu beschränken,
readonly verhindert eine Änderung bezw. Eingabe.
value="irgendwas" damit im Feld schon irgendwas geschrieben steht:

Anmerkung zu Javascript: Durch einen JavaScriptEvent als Attribut kann diese Vorgabe automatisch gelöscht werden, wenn zur Eingabe in das Feld geklickt wird! onfocus='this.value="" ' (ich achte dabei auf die Anführungszeichen: onfocus=' und nix dazwischen bei value="" '):

Ein weiteres JavaScript Snipplet (hier für im BodyOpenTag) setzt den blinkenden Kursor schon in ein vorbestimmtes Feld des Formulars, falls Formular und Feld Namen haben: <body onload="document.bananenformular.kursor_textfeld.focus( )"> macht den Kursor schon mal ins Feld hinein. Falls sich dieses Feld am unteren Ende einer Seite befindet, öffnet sich die Seite so, dass dieses Feld im Fenster sichtbar ist, auch wenn dafür der obere Teil der Seite vom Fenster abgeschnitten wird! Also vielleicht besser nur oben an einer Seite verwenden (hier wird auf das Beispiel verzichtet).

<input type="text" name="textfeld_kursor" size="5" />

Passwort

<input type="password" name="SternchenFeld" />
Das Feld sieht normal aus, bei der Eingabe von Zeichen erscheinen aber nur Sternchen!
Übermittelt werden aber die richtigen Zeichen die dann ausgewertet werden:

Hidden

<input type="hidden" name="UnsichtbaresFeld" value="EinMitzusendenderWertWelcherUserNichtSieht" />
Erzeugt ein verborgenes Feld welches (per Script) mit einem Wert (String oder Variable) gefüllt werden kann, welche von einem Script nach der Übermittlung des Formulars abgerufen und ausgewertet werden kann, womit dann eine Hin und Zurück Kommunikation etabliert wäre:

Checkbox

<input type="checkbox" name="KontrollFeld_Hunger" />
<input type="checkbox" name="KontrollFeld_Durst" checked="checked" />
<input type="checkbox" name="KontrollFeld_Muede" />
Attribute sind:
checked="checked" Macht schon ein Häkchen (wie beim mittleren Feld)
name="müssenSichVonEinanderUnterscheiden"
value="etwasAnderesUebermittelnAlsDasDefaultOn"

Bitte abhaken, mehrere Antworten sind möglich:
Ich habe Hunger
Ich habe Durst
Ich bin müde

Radio

<input type="radio" name="immerDerSelbeName" value="rot" />
<input type="radio" name="immerDerSelbeName" value="blau" checked="checked" />
<input type="radio" name="OptionsFeld" value="rotundblau" />
Attribute sind:
checked="checked" Macht schon ein Punkt (wie beim mittleren Feld)
name="immerDerSelbeName" identifiziert die Zugehörigkeit zur selben Gruppe, innerhalb derer nur eine Wahl getroffen werden kann!
value="eindeutigeKennzeichnungDesAngklicktenButtons"

Entweder oder:
Rot
Blau
Rot und Blau

Eingabeblock

<textarea>...</textarea>

Erwarten wir von unseren Besuchern etwas mehr als eine Zeile Text, kann diesem auch mehr Platz zur Verfügung gestellt werden. So ein Textareal wird automatisch mit Scrollbalken versehen. In den Starttag <textarea> kommen wie üblich einige Attribute:
name="TextAreal"
cols="40" d.h.40 Anschläge angezeigte Breite
rows="4" d.h. 4 Zeilen angezeigte Höhe
wrap="virtual" ein Zeilenumbruch findet nur im Eingabefeld statt, wrap=physical" der Zeilenumbruch wird mit dem Text auf den Server übertragen. (Ich glaube aber, dieses Attribut ist nicht W3C konform.)
Mittels CSS lassen sich auch die Scrollbalken entfernen, solange das Feld nicht überfüllt wird: <textarea style="overflow:auto">

Listenfeld

<select><option>...</option></select>

Statt einer Serie aus Radiobuttons oder Checkboxen, können Auswahlmöglichkeiten in einer Liste zur Verfügung gestellt werden.
Attribute im <select> Tag:
name="Selectionierung"
size="3" es werden 3 Elemente (von 4) angezeigt, Scrollbalken sind automatisch eingerichtet.
multiple="multiple" so sind auch mehrere vorgefertigte Antworten auswählbar; (zum Auswählen muss STRG oder SHIFT gedrückt werden).

Die eigentlich auszuwählenden Inhalte werden in einer Liste untergebracht, deren Zeilen werden zwischen die <option>...</option> Tags geschrieben.
Die Attribute im <option> Opentag sind:
value="64" der zu übermittelnde Wert einer ausgewählten Zeile muss nicht mit dem zwischen den <option>Blablabla</option> Tags angezeigten Text übereinstimmen.
selected="selected" markiert eine Vorauswahl.
Die Breite wird bestimmt durch die eingegebenen Zeichen oder durch CSS.

<optgroup label="Gruppenbezeichnung">...</optgroup>
Will man mehrere Optionen zu Gruppen zusammenfassen, kann dies mit dem <optgroup> Tag geschehen. Im 'label' kann die Gruppe bezeichnet werden. Es können mehrere Gruppen in einem Listenfeld nacheinander gemacht werden. Die Optionen erscheinen gegenüber dem 'label' eingerückt:

Dropdown Menu

Fast das Selbe, aber mit zwei Abweichungen im <select> Tag:
size="1", beschränkt das Feld auf eine Zeile
und es gibt keine multiple="multiple" Auswahl.

HTML 5 Felder

HTML 5 wird die Unterscheidung von Desktopprogrammen und Internetapplikationen als Apps quasi aufheben.

In HTML 5 kommen daher etliche input-Felder hinzu welche die Eingabe von Suchbegriffen, URL- und E-Mail-Adressen, Telefonnummern, Datums- und Zeitangaben, nur Zahlen sowie Farbangaben ermöglichen.

<input type='search' />

<input type='url' />

<input type='email' />

<input type='tel' />

<input type='time' />

<input type='datetime' />

<datalist>

Das Element 'datalist' stellt einem Input-Feld eine vordefinierte Liste von Optionen zur Verfügung (Vervollständigungsvorschläge):

weitere html 5 Elemente

Im Entwurfsstadium sind zudem die Formular-Elemente:
'progress' zur Fortschrittsanzeige (während Berechnungen, beim Laden oder Speichern),
'meter' für Wertebereiche, (z.B. Speicherbelegung auf Festplatte),
'output' stellt das Ergebnis eines Scripts oder Formel dar.

Für weitere Informationen und Beispiele zum HTML 5 Formular gehe direkt zum W3C Working Draft!

Felder ansteuern

tabindex="..."

Das Attribut tabindex="6" im OpenTag des jeweiligen Formularelements, legt die Reihenfolge fest mit der das Element mit dem Tabulator erreicht werden kann (z.B. hier als sechster Tab-Schlag).

Auch direkt über eine speziefische Tastenkombination kann jedes Feld erreicht werden.
Das Attribut accesskey="Q" im OpenTag des anzusteuernden Formularelements bewirkt, dass jenes Element, je nach Browser, mit der Tasten-Kombination ALT+q oder ALT+SHIFT+q erreicht werden kann. Dies müsste jedoch irgendwo erwähnt werden, sonst kennt niemand das Kürzel...

Felder beschriften

<label for="..."

Zur logischen Verknüpfung einer Beschriftung mit seinem Eingabefeld dient der Tag <label for="..." mit der Angabe der ensprechenden Feld-id:
<input type="radio" name="radio" value="yes" id="ja" /> <label for="ja">eher</label>
<label for="nein">weniger</label> <input type="radio" name="radio" value="no" id="nein" />

Die label-Tags eignen sich übrigens besstens zum Ausrichten der Felder mittels CSS.

Felder gruppieren

<fieldset><legend>...</legend>hier die Felder</fieldset>

Legende Hier kämen nun verschiedene Felder hinein,
die alle durch diesen Rahmen, welcher von einer Legende unterbrochen wird, eingefasst sind.

Verschlüsseln

keygen

Das keygen-Element generiert im Netscape (Mozilla FF) Client seitig ein SSL Certifikat (Benutzername / Passwort Paar), und funktionirt nur, wenn die Seite mit dem Formular vom type "text/html" ist.
Keygen ist nicht HTML 4.01 Standard, soll aber in HTML 5 aufgenommen werden und erzeugt zwei Schlüssel (einen public und einen private), welcher zu Verifizierung genutzt werden kann.
<keygen name="Schlüssel" challenge="publickey">

Schaltflächen

Hier treffen wir einen alten Bekannten wieder, den <input> Tag!
Wie gewohnt definieren die Attribute seine Erscheinung und Funktion.
Die Auswahl an vordefinierten HTML-Schaltern ist ziemlich beschränkt.

Dateiupload

type="file"

Will man dem User ermöglichen, eine Datei von seiner Festplatte auf unseren Server hochzuladen, kann man ein Feld definieren, welches ein explorerartiges Fenster öffnet in dem zur Dateiauswahl durch die lokalen Ordner gebraust werden kann.
<input type="file" name="fileGetter" tabindex="16" lang="de"> (Kein Attribut size erlaubt!)

Bedingungen zur Funktionalität sind:

  • Im form-Tag muss die method="post", und der enctype="multipart/form-data" stehen.
  • Zur Begrenzung der Dateigrösse kann ein hidden Feld mit dem name=="MAX_FILE_SIZE" vor diesem Inputfeld stehen, Angabe der Grösse in Bites: <input type="hidden" name="MAX_FILE_SIZE" value="2048000" /> (2000000 B = 2000 KB = 2 MB). Das Attribut maxlength wird von keinem Browser kontrolliert, auch das Attribut accept, welches das Dateiformat einschränken sollte, hat keinen Effekt.
  • Das Formular muss durch ein CGI oder PHP, etc. Script ausgewertet werden, welches die hochzuladende Datei speichert.
  • Der Ordner in welchen die Dateien hochgeladen werden, müssen chmod-Schreibberechtigung haben.
  • Das Attribut lang="de" bestimmt die Beschriftungssprache des Buttons; den Text kann man nicht verändern um den Button etwa zu tarnen.
  • Auch kann keine Vorbelegung durch value="böseDatei.xxx" bestimmt werden und die Grösse lässt sich auch nicht verkleinern, beides zum Schutz des Users.

Zurücksetzen

type="reset"

Damit man mit Ausfüllen des Formulars wieder bei den Voreinstellungen anfangen kann (Zurücksetzen), gibts ein Standartschalter, der braucht nicht einmal einen Namen, und wenn er kein Attribut wie value='Alles löschen' hat, dann ist er je nach Systemsprache schon angeschrieben:
<input type="reset" tabindex="17" />

Absenden

type="submit"

<input type="submit" name="submitButtonName" tabindex="18" value="send" />

Buttons

type="button"

Es gibt auch Schalter deren Funktion nicht vordefiniert ist, aber ohne ein kleines JavaScript (sh. letztes Attribut) könnte diese Schaltfläche nichts auslösen, sein Value bestimmt die Aufschrift:
<input type="button" name="retour" value="Zurück" tabindex="19" onClick="history.back()" />

<button type="button"></button>

Seit HTML 4 gibt es einen eigentlichen <button></button> Tag, auf den man eine Grafik legen kann:
<button type="button" name="sendButton"><img src="images/butn_write.gif" alt="mail it now" /></button>

type="image"

Will ich ganz auf die Schaltfläche verzichten und nur ein Bild als Schalter benutzen, gibt es auch noch diesen Super Tag (allerdings funktioniert dieser nur als Submitbutton!):
<input type="image" src="images/butn_read.gif" />

Attribute

checked, selected

Bei den Checkboxen, dem Radiobutton und den Optionen kann eine Auswahl bereits vorgegeben werden. Das Attribut im input-Tag heisst checked, bei XHTML checked="checked", im option-Tag entsprechend selected="selected". Diese Attribute sind bei den jeweiligen Feldern als Beispiele zu sehen.

disabled

Formularelemente können ausgegraut dargestellt werden, deren Benutzung, das Drauf- und Reinklicken ist dann nicht möglich. Durch ein Javascript kann ich je nach Auswahl in anderen Feldern Elemente also unzugänglich bzw. zugänglich machen durch Hinzufügen oder Entfernen des Attributs disabled. Es gibt nur den einen Wert, bzw. das eine Attribut Diese Elemente können das Attribut disabled="disabled" enthalten:
<input>, <textarea>, <select>, <option>, <optgroup> und <button>
Je nach Browser wird so ein Element ausgegraut oder einfach unbenutzbar:

required, autofocus

In HTML 5 sind auch zusätzliche Attribute vorgesehen.
'required' soll beim Versuch ein Formular zu versenden in welchem ein solches Feld leer gelassen wurde, den Versand verhindern und ein Hinweis zeigen.

'autofocus' soll beim öffnen eines Formulars den blinkenden Cursor zuerst in jenes Feld setzen. (Ein Attribut, welches auf einer Seite nur einmal vorkommen kann. Dieser Effekt wurde weiter oben mittels javaScript erzeugt.) (Die Attribute sind natürlich nicht in Kombination mit 'disabled' nutzbar.)

Weitere neue Attribute werden hier besprochen, wenn sie von den meisten Browsern unterstützt werden (2014). Es könnten sein: autocomplete, form overrides (formaction, formenctype, formmethod, formnovalidate, formtarget), height und width, list, min und max und step, multiple, pattern (regexp), placeholder, readonly.

Formatieren

Zur Formatierung der Formular-Felder sollten CSS herangezogen werden, die Möglichkeiten sind unzählig. Zum Ausrichten werden manchmal noch Tabellen verwendet, denn das Ausrichten ist kompliziert; wie es ohne geht - siehe Beispiel 1 und Beispiel 2 von Formularen mit CSS.

Nicht zu beeinflussen sind leider die 3D Defaulteffekte folgender Felder:

  • Dropdown-Menue-Buttons mit Pfeil
  • Durchsuchen ...Buttons zum Hochladen von Dateien
  • Scrollleisten (IE proprietär schon)
  • Checkbox und Radio- Buttons (Beispiel grafische Buttons*)

* Es gibt zwar die Möglichkeit (z.B. an Stelle der Checkbox und Radiobuttons) Bilder mit JavaScript verknüpften hidden-Felder zu verwenden, aber das hiesse die grafische Gestaltung über die Accessability (Anwenderfreundlichkeit beispielsweise für Blinde) zu stellen.

Vorcheck

Mit Javascript kann nicht auf schädlichen Inhalt geprüft werden, denn im Browser kann Javascript einfach ausgeschaltet werden - und schon findet keine Prüfung mehr statt.

Die Eingabefelder checken wir mit JavaScript noch im Browser. Das Formular kann so bei Fehlerhaften Eingaben gleich nochmals zur Verfügung gestellt werden und zwar so, dass nur die fehlerhaften Felder und nicht das ganze Formular neu ausgefüllt werden muss; auf das betroffene Feld kann mit einem Alert, einem eingefügten Hilfetext oder durch Hervorhebung mit Vorauswahl oder blinkender Corsorposition aufmerksam gemacht werden.
Zuletzt den Erhalt bestätigen! Ein Feedback zeigt, das alles richtig gemacht wurde.
>> Beispielformular mit Javascript-Checks

Sicherheit

Das empfangende Script auf der Zielseite muss unbedingt die Formular-Eingaben richtig prüfen, bevor sie in die Datenbank eingetragen werden, oder bevor mit ihnen eine Datenbank abgefragt wird!
Auch vor dem Speichern in einer Datei oder der Ausgabe im Browser müssen die empfangenen Daten geprüft werden.
Siehe: Sicherheit im Teil PHP


Valid XHTML 1.0 Check den Code.

Doctype und Quirks >> << iFrame
Ich bin hier: > HTML Lehrling >> Formulare
 
HTML und XHTML | CSS | JavaScript und DHTML | PHP und MySQL | Andere Sprachen
Letzter Update: 27.12.2011