AMIGA-Magazin · Ausgabe 7/00 · Kurs: Programmieren in JavaScript (Teil 2)

Aktuelles Heft 7/00

Interaktive Formulare

Formulare eröffnen Interaktivität im Internet. Mit JavaScript lassen sich diese Eingaben zu einer direkten Interaktivität mit dem Benutzer verwenden. Spezielle Programme am Web-Server sind dazu nicht notwendig, alles spielt sich direkt am Computer des Anwenders ab. Wie Sie Ihrer Webseite diesen Zusatzschub an Interaktivität verpassen, zeigen wir Ihnen in diesem Teil unseres JavaScript-Kurses.

von Hartwig Tauber

Im ersten Teil des JavaScript-Kurses haben wir uns den Grundlagen der Programmiersprache gewidmet. Dieses Mal nutzen wir die Möglichkeiten in Verbindung mit den Standard-Elementen der HTML-Sprache, um die Webseiten um zusätzliche Optionen zu erweitern.

Interaktiv:
Mit Formularen treten Sie mit dem Surfer direkt in Kontakt.

Die Arbeit mit Formularen stellt dabei eine wichtige Option dar, um in direkte Interaktivität mit dem Surfer zu treten. Schon bisher waren Formulare die wichtigsten Elemente im WWW, um Benutzereingaben möglich zu machen und entsprechend zu reagieren. Normalerweise wird dazu dem Anwender eine Seite mit unterschiedlichen Eingabefeldern zur Verfügung gestellt. Der Surfer kann diese Felder entsprechend ausfüllen und klickt danach auf einen Schalter, dem die spezielle Eigenschaft Submit zugeordnet wurde. Dadurch wird der Browser dazu veranlasst ein Programm am Web-Server aufzurufen, das am Beginn der Formulardefinition festgelegt wird. Diesem werden die eingegebenen Daten zur weiteren Verarbeitung zur Verfügung gestellt.

CGI und JavaScript

Der Vorteil der CGI-Programmierung liegt darin, dass der Client, also der Webbrowser über keine besonderen Fähigkeiten verfügen muss, da die Abarbeitung vollständig am Server erfolgt. Zusätzlich ist dies die einzige Möglichkeit, auf zentral abgespeicherte Datenbanken zuzugreifen, da diese schon vom Prinzip her an den Server gebunden sind. Diese Vorteile stehen dem Nachteil gegenüber, dass über serverseitige Skripts die direkte und schnelle Interaktion mit dem Benutzer nicht möglich ist. Wenn z.B. Eingaben auf ihre Gültigkeit überprüft werden sollen oder die Interaktivität in einer einfachen Berechnung besteht, ist es dennoch notwendig, den Weg über den Webserver zu nehmen.

Berechnend:
Die eval()-Funktion berechnet mathematische Ausdrücke automatisch.

Hier bietet sich JavaSciprt als Lösung an. Dabei kann JavaScript entweder als Untersützung zur serverseitigen Skriptausführung herangezogen werden oder diese in vielen Fällen sogar vollständig ersetzen. Eine Kombination bietet sich z.B. dann an, wenn der Benutzer Daten für eine Datenbank eingeben soll. Noch bevor diese an das Server-Programm übergeben werden, können mittels JavaScript die wichtigsten Gültigkeitsprüfungen durchgeführt werden. Damit wird die Eingabe für den Benutzer einfacher und der Datenverkehr zwischen Server und Browser kann minimiert werden. Zusätzlich bedeutet die clientseitige Vorbearbeitung auch eine Entlastung des Servers.

Beispiel 1: Kreisberechnung interaktiv

Wie JavaScript in Verbindung mit Formularen in der Praxis eingesetzt werden kann, wollen wir uns in der Folge an Hand von Beispielen ansehen. Diese sind so gewählt, dass sie einfach angepasst und in der eigenen Homepage verwendet werden können. Das erste Listing zeigt dabei bereits eine typische interaktive Anwendung. Der Benutzer kann eine Zahl als Radius für einen Kreis eingeben und erhält als Ergebnis den Umfang und die Fläche des Kreises. Diese Anwendung bietet sich geradezu für eine JavaScript-Lösung an, da der interaktive Vorgang in einer einfachen Berechnung besteht. Es ist deshalb nicht notwendig, die Daten an einen Server zu schicken, die "Arbeit" wird vollständig "vor Ort" im Browser erledigt.

Überprüfung:
Mit JavaScript wird die Eingabe sofort auf deren Korrektheit getestet.

Listing 1 selbst enthält wenig Neues in Bezug auf JavaScirpt. Es wird eine Funktion definiert, die die gewünschte Berechnung vornimmt. Im eigentlichen HTML-Bereich erzeugen wir ein Formular, das aus drei Standard-Eingabefeldern besteht. Das erste wird dabei verwendet, um die Eingabe des Benutzers entgegenzunehmen, die beiden anderen dienen uns für die Ausgabe des Ergebnisses. Formularfelder sind die einfachste Variante, um Zahlen oder Texte auch nach der vollständigen Darstellung der Seite auszugeben, ohne dass deshalb eine andere Seite aufgerufen werden müsste. Denn während die aktuellen Versionen von Netscape und Internet Explorer in der Lage sind, auch nachträglich ganze Textbereiche auszutauschen, ist dieses Feature bei den Amiga-Browsern, aber auch z.B. bei Opera, (noch) nicht verfügbar.

Wer bereits mit Formularen gearbeitet hat, dem werden zwei wichtige Unterschiede zur herkömmlichen Formularprogrammierung auffallen. Der erste ist jener, dass beim FORM-Tag kein Programm definiert wurde (ACTION), das am Server aufgerufen werden soll. Dies ist nicht notwendig, da alle Arbeiten direkt innerhalb der Seite durchgeführt werden. Es wäre grundsätzlich möglich, als ACTION den Aufruf der JavaScript-Funktion anzugeben. Doch damit hat z.B. AWeb einige Probleme, da die Übergabe der Parameter in einer Form erfolgt, die zu einer Fehlermeldung führt.

Mathematik auf die Schnelle
Eigenschaften und Methoden der Klasse Math(Auszug)
Eigenschaften
Math.E Eulersche Konstante (ca. 2,718)
Math.LN2 natürlicher Logarithmus von 2
Math.LN10 natürlicher Logarithmus von 10
Math.PI Kreiskonstante Pi (ca. 3,1415926)

Methoden

erg=Math.abs(wert) liefert den positiven Wert von wert
erg=Math.acos(wert) liefert den Arcus Cosinus von wert
erg=Math.asin(wert) liefert den Arcus Sinus von wert
erg=Math.atan(wert) liefert den Arcus Tangens von Wert
erg=Math.ceil(wert) rundet wert zur nächsthöheren Ganzzahl auf
erg=Math.cos(wert) liefert den Cosinus von wert
erg=Math.exp(wert) liefert den Exponentialwert von wert
erg=Math.floor(wert) rundet wert zur nächstniedrigeren Ganzzahl ab
erg=Math.log(wert) liefert den natürlichen Logarithmus von wert
erg=Math.max(w1,w2) liefert den größeren der beiden Werte
erg=Math.min(w1,w2) liefert den kleineren der beiden Werte
erg=Math.pow(bas,exp) liefert erg=bas hoch exp
erg=Math.random() liefert eine Zufallszahl zwischen 0 und 1
erg=Math.round(wert) liefert die kaufmännisch gerundete Ganzzahl von wert
erg=Math.sin(wert) liefert den Sinus von wert
erg=Math.sqrt(wert) liefert die Quadratwurzel von wert
erg=Math.tan(wert) liefert den Tangens von wert

Darüber hinaus fehlt der SUBMIT-Schalter, um die Daten abzusenden. Dieser ist deshalb nicht notwendig, da wir auf die Methode onChange zurückgreifen. Diese wurde bei der Definition des Eingabefeldes für den Radius hinzugefügt. Sie bewirkt, dass immer, wenn der Benutzer den Wert im Feld ändert und dieses danach verlässt, d.h. den Focus von diesem entfernt, die Funktion kalkulation() aufgerufen wird.

Die Funktion selbst liest zuerst den Inhalt des Feldes radius aus. Dies erfolgt in der JavaScript-typischen Form über das Objekt Document, das die aktuelle HTML-Seite bezeichnet und den Namen des Formulares (in unserem Fall testformular). Dann wird mittels dieses Namens auf das Eingabefeld zugegriffen und die Eigenschaft value ausgelesen. Wer sich bereits mit der objektorientierten Vorgehensweise von JavaScript vertraut gemacht hat, dem wird diese Notation nicht neu sein. Einer der Vorteile liegt darin, dass beliebig viele Formulare auf einer Seite untergebracht werden können, deren Felder unabhängig und getrennt voneinander angesprochen werden können.

Die nächsten Schritte bestehen aus der einfachen Berechnung der Ergebnisse. Danach werden diese über denselben Weg in den Ergebnisfeldern ausgegeben. Denn die Eigenschaft value, die bei jedem Formularfeld zur Verfügung steht, kann sowohl ausgelesen als auch beschrieben werden. Damit ist die Arbeit bereits beendet, das Ergebnis steht dem Anwender zur Verfügung.

Neu ist in der Funktion die Verwendung der vordefinierten Funktionen der Klasse Math. Eine Auflistung finden Sie in der Tabelle »Mathematik auf die Schnelle«. Wichtig ist bei diesen lediglich, dass die Groß- und Kleinschreibung beachtet wird, da einige Browser andernfalls eine Fehlermeldung ausgeben. Da die Funktion zum Runden von Zahlen (round) keine Festlegung erlaubt, auf wie viele Stellen hinter dem Komma gerundet werden soll sondern immer nur ganzzahlige Ergebnisse zurückliefert, wird über den Umweg der Multiplikation mit 100 und der anschließenden Division des Ergebnisses dafür gesorgt, dass das Endergebnis mit zwei Kommastellen formatiert ausgegeben wird.

Beispiel 2: Überprüfung der Eingaben

Spezialoperatoren
x++ x=x+1
x-- x=x-1
y=x++ y=x und x=x+1
y=++x y=x+1 und x=x+1
x+=y x=x+y
x-=y x=x-y
x*=y x=x*y
x/=y x=x/y
y=x%z y=Rest von x/z

In dieser einfachen Form wird noch keine Überprüfung vorgenommen, ob die Eingabe korrekt ist, d.h. ob tatsächlich eine Zahl eingegeben wurde. Dennoch gibt in JavaScript kein Browser eine Fehlermeldung aus, falls Sie stattdessen einen Text eingeben. Ist dies der Fall, und ist es deshalb nicht möglich, eine Berechnung durchzuführen, so wird in die Ergebniszellen der Wert »NaN« (»Not a Number«) eingetragen. Dies ist ein vordefinierter Wert in JavaScript, der angibt, dass das Ergebnis kein numerischer Wert ist. Bei der Interpretation der Eingaben unterscheiden sich die Browser allerdings teilweise sehr stark. So akzeptiert AWeb beispielsweise eine Eingabe, die aus Zahlen und Texten besteht. Sofern die Eingabe mit einer Zahl beginnt, werden für die Berechnungen nur jene Teile der Eingabe herangezogen, die vor dem ersten ungültigen Zeichen stehen. Geben Sie z.B. »34ali4?4« ein, so wird mit dem Wert 34 weitergerechnet. Der Internet Explorer ist hier strikter und verweigert die Berechnung. Er gibt stattdessen als Ergebnis den NaN-Wert aus.

Gerade im Zusammenhang mit Berechnungen ist eine weitere Methode von JavaScript äußerst nützlich. Denn mit eval() hat JavaScript bereits einen vollständigen Interpreter für mathematische Ausdrücke enthalten. Fügen Sie dazu nach dem Auslesen des Radius im Skript die Zeile

radius=eval(radius);

ein. Mit dieser veranlassen Sie JavaScript, die Eingabe zu untersuchen und, falls möglich, diese zu berechnen. Geben Sie nach der Änderung als Wert einmal »3+5*2« ein, und sehen Sie sich das Ergebnis an.

<HTML> 
<HEAD> 
<SCRIPT LANGUAGE="JavaScript"> 
<!--- Hier gehts los 
function kalkulation() 
{ radius=document.testformular.eingabe.value; 
  umfang=Math.round(2*radius*Math.PI*100)/100; 
  inhalt=Math.round(Math.pow(radius,2)*Math.PI*100)/100; 
  
  document.testformular.ergebnis1.value=umfang; 
  document.testformular.ergebnis2.value=inhalt; 
} 
// Hier ist es aus! --> 
</SCRIPT> 
</HEAD> 
<BODY> 
<FORM NAME="testformular"> 
<h1>Berechnung von Kreisinhalt und Kreisradius</h1> 

Bitte geben Sie im Feld für den Radius den gewünschten Radius 
ein. Sobald Sie das Feld verlassen, wird das Ergebnis berechnet.
<p> 
Radius: <input type=text size=20 name="eingabe" onChange="kalkulation()"><p> 
<b>Ergebnisse:</b><br> 
Umfang: <input type=text size=20 name="ergebnis1"><br> 
Fläche: <input type=text size=20 name="ergebnis2"><p> 
</FORM> 
</BODY> 
</HTML>

Listing 1: Berechnung von Kreisumfang und -Fläche (bitte klicken, um es auszuprobieren)

Allerdings hat eval() auch einen entscheidenden Nachteil. Ist die Eingabe kein Ausdruck, der berechnet werden kann, liefert eval() eine Fehlermeldung zurück. Diese führt zwar nicht zum Abbruch des Programmes, doch sind die weiteren Berechnungen fehlerhaft. Im InternetExplorer wird darüber hinaus das Symbol für »Fehler auf der Seite« in der Statusleiste eingeblendet.

Eine Weiterentwicklung des ersten Beispiels stellt Listing 2 dar. Der Aufbau ist dabei sehr ähnlich, doch diesmal wird die Eingabe auf deren Gültigkeit überprüft. Dazu wurde eine eigene, kurze Funktion programmiert, die jedes Zeichen des Eingabefeldes überprüft, ob es sich dabei um eine Ziffer handelt. Andernfalls wird der Wert false zurückgegeben. Daraufhin wird der Anwender aufgefordert, die Eingabe noch einmal zu überprüfen. Die erste Änderung erfolgte direkt im Formular. Da dieses Mal der Umfang und Inhalt eines Rechteckes berechnet werden, sind zwei Eingaben notwendig. Deshalb macht es wenig, Sinn, gleich bei der Änderung eines Wertes die Berechnung zu beginnen, da der zweite Wert unter Umständen noch nicht verfügbar ist. Aus diesem Grund wurde ein Schalter eingefügt. Erst nach Anklicken desselben wird die JavaScript-Berechnung durchgeführt. Im Gegensatz zu herkömmlichen CGI-Formularen muss dieser Schalter nicht für die Standard-Funktionen »Submit« und »Reset« verwendet werden, sondern kann mit einer beliebigen Bezeichnung versehen sein. Entsprechend ist es auch möglich, mehrere Schalter in ein und dasselbe Formular einzubauen, die unterschiedliche Aktionen ausführen. Mit dem onKlick-Handler wird die JavaScript-Funktion aufgerufen.

Nach dem Auslesen der Felder erfolgt die Abfrage, ob es sich bei der Eingabe um einen numerischen Wert handelt. Ab der Version 1.1 von JavaScript ist dies mit der Funktion isNaN(Wert) möglich, die true zurückliefert, falls der übergebene Wert keine Zahl ist. Da jedoch viele Amiga-Browser noch mit dem JavaScript-Standard 1.0 arbeiten und deshalb diese Funktion nicht zur Verfügung steht, haben wir sie in Form von checkforNumber(Wert) nachgebildet. Diese Funktion liefert true als Ergebnis, falls der übergebene Wert eine Zahl ist.

<HTML> 
<HEAD> 
<SCRIPT LANGUAGE="JavaScript"> 
<!--- Hier gehts los 
function checkforNumber(wert) 
{  ergebnis=true; 
   for(i=0;i<wert.length;i++) 
   { buchstabe=wert.substring(i,i+1); 
     if((buchstabe<"0" || buchstabe>"9") && buchstabe!=".") 
     { ergebnis=false; i=wert.length; 
     } 
   } return ergebnis; 
} 

function kalkulation() 
{  laenge=document.testformular.laengein.value; 
   breite=document.testformular.breitein.value; 
   if (checkforNumber(laenge)==false || checkforNumber(breite)==false) 
   { alert("Sowohl Länge als auch Breite müssen eine Zahl sein!"); 
   } 
   else 
   { umfang=Math.round((2*laenge+2*breite)*100)/100; 
     inhalt=Math.round(laenge*breite*100)/100; 
     document.testformular.ergebnis1.value=umfang; 
     document.testformular.ergebnis2.value=inhalt; 
   } 
   document.testformular.laengein.focus(); 
} 
// Hier ist es aus! --> 
</SCRIPT> 
</HEAD>

Listing 2: Die verfeinerte Version mit Prüfungen

Im Rahmen dieser Funktion lernen wir auch einen weiteren Befehl von JavaScript kennen: Es handelt sich dabei um die for-Schleife. Sie dient dazu, die Befehle innerhalb dieser Schleife für eine definierte Anzahl von Wiederholungen durchzuführen. Die for-Schleife hat dabei drei Argumente. Der erste ist der Zähler, der für die Durchläufe herangezogen und dem gleichzeitig der Startwert zugewiesen wird. Danach folgt die Abbruchsbedingung. Das heißt, es wird jener Wert angegeben, bei dessen Erreichen oder Überschreiten die Schleife verlassen wird. Schließlich gibt der letzte Wert die Sprungweite an, mit der der Zähler erhöht bzw. erniedrigt werden soll. Neu ist dabei auch die Form, mit der der Zähler um eins erhöht wird: i++. Diese, auch von der Programmiersprache C bekannte Notation wurde in JavaScript übernommen. Sie steht für den Ausdruck i=i+1. Neben dieser Notation gibt es noch einige weitere, die in der Tabelle »Spezialoperatoren« zusammengefasst sind.

In der Schleife selbst wird der übergebene String Zeichen für Zeichen bearbeitet. Es wird überprüft, ob es sich bei jeder Stelle um eine Ziffer bzw. den Kommapunkt handelt. Ist das nicht der Fall, wird der Ergebniswert der Funktion auf false gesetzt und die Schleife beendet, indem der Zähler auf den Abbruchswert gesetzt wird. Die Zeichenkettenfunktionen, die notwendig sind, um diese Aufgaben zu erfüllen, sind in der Tabelle »Zeichenbearbeitung« zu finden.

Sollte bei der Überprüfung ein ungültiges Zeichen gefunden worden sein, wird dies dem Anwender mitgeteilt und er wird aufgefordert, nur Zahlen einzugeben. Andernfalls werden die Ergebnisse berechnet und ausgegeben. Im letzten Schritt wird der Eingabecursor wieder auf das Feld für die Länge gesetzt, um schnell die nächste Änderung vornehmen zu können. Dies erfolgt über die Methode focus(). Allerdings wird diese von Browser zu Browser unterschiedlich behandelt. Bei AWeb beispielsweise funktioniert in unserem Listing das Setzen des Focus nur, wenn keine Warnmeldung auf Grund einer fehlerhaften Eingabe notwendig ist. Andernfalls wird der Focus nach dem Bestätigen der Warnung zwar gesetzt, aber gleich wieder entfernt.

Die Möglichkeiten, die sich aus der Verbindung von Formularen und JavaScript ergeben, sind enorm. Die hier vorgestellten Beispiele können Ihnen als Ausgangspunkt dienen, um selbst interaktive Formulare zu erzeugen. Ihrer Phantasie sind dabei keine Grenzen gesetzt. In der nächsten Folge des Kurses befassen wir uns mit der Verwendung von Frames in Verbindung mit JavaScript und erstellen Navigationshilfen auf Skript-Basis.

lb

Zeichenbearbeitung
String-Methoden von JavaScript (Auszug).
Achtung!
Bei Zeichenketten hat das erste Zeichen die Position 0, nicht 1!
Eigenschaften
worte.length liefert die Länge der Zeichenkette "worte"
Methoden
pos=worte.indexOf("such") liefert die Position des ersten Vorkommens von "such" in "worte". Wird sie nicht gefunden, ist das Ergebnis -1
pos=worte.lastIndexOf("such") wie IndexOf(), es wird aber das letzte Vorkommen gesucht

erg=worte.substr(start,anz)

liefert ab Position "start" "anz" Zeichen als String
erg=worte.substring(start, ende) wie substr, statt der Anzahl gibt jedoch "ende" die Ende-Position der Zeichenkette in "worte" an.

 


Hauptseite © 2000 All Rights Reserved. Alle Rechte vorbehalten Franzis' Verlag GmbH
Veröffentlichung und Vervielfältigung nur mit schriftlicher Genehmigung des Verlags

Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am Datum.