Multimediakurs Leinfelder: Inhalt/Modul 7 "JavaScript in Handarbeit"/Modul 7.4 "JavaScript-Level 3/7.4.3 Weitere Syntaxmöglichkeiten

(© copyright)     Letzte Änderungen:08.04.2003


Modul 7.4.3: JavaScript "Level 3":Weitere Syntaxmöglichkeiten

Als Ergänzung zu unserer Diskussion der Bausteine und Regeln der JavaScript-Sprache in Level 2 (Modul 7.3.2.2) machen wir nachfolgend noch einige Ergänzungen für Fortgeschrittene, die Ihnen vielleicht hilfreich sind. Sie werden mit Beispielen erläutert. Die Beispiele sind bewusst einfach gehalten und dienen zur Syntaxerläuterung. Einige komplexere Beispiele finden Sie dann auf unserer ergänzendenn Level 3 - Beispielseite (7.4.5)

Sie finden hier insbesondere folgende Erläuterungen:


Event-Handler

Neben den in Level 1 vorgestellten Event-Handlern onClick, onMouseover, onMouseout und onLoad gibt es noch wesentliche weitere Eventhandler, insbesondere:

Die Eventhandler sind für unterschiedlichste Tags verwendbar. Hierbei unterstützt IE mehr Tags als NN. Probieren Sie es einfach aus bzw. sehen Sie bei Bedarf in der Java-Script-1.3-Referenz von Netscape nach. Zusätzlich gibt es ein zusätzliches sog. Eventmodell (zum generalisierten "Abfangen" von Events), dessen Erklärung aber den Inhalt dieses Kurses sprengen würden. Es bedient sich der Methoden des Event-Objekts. Sie finden Erläuterungen bei der Java-Script-1.3-Referenz von Netscape oder auch im SelfHTML-Kurs von S.Münzer.


Direkter Funktionsaufruf als Link als Alternative zum Eventhandler onclick

Sehr häufig lassen wir eine selbstdefinierte function durch einen onclick-Handler in einem Link aufrufen. In der Regel soll dann aber keine URL aufgerufen werden. Der normale Workaround dazu ist ja die Verwendung des Zeichens # als "URL"-Alternative. Nennen wir dies mal die "#-onclick-Methode". Dieses Zeichen ruft ja dann quasi die eigene Seite nochmals auf, was in der Regel aber nicht durchgeführt wird, da die Seite ja bereits geladen ist.

Beispiel im body-Teil eines html-Dokuments:

<a href="#" onclick="aufruf()">los geht's</a>

Anker auf der Seite beim Link bzw. knapp oberhalb des Links setzen und darauf verlinken, also beim obigen Beispiel etwa:

<a name = ankerback><a href="#ankerback" onclick="aufruf()">los geht's</a>

oder Funktionsaufruf bereits bei onmouseover machen lassen (also z.B. <a href="#ankerback" onMouseOver="aufruf()">los geht's</a>, was allerdings den Nutzer verwirren kann, wenn zu häufig was passiert, nur weil er mit der Maus herumwandert.

oder submit-Button eines Formulars als Auslöser verwenden (siehe Modul 9)

Es gibt aber eine meist sehr elegante Alternative. Sie können die Funktion aufruf() mit einem Linkklick auch folgendermaßen aufrufen (nennen wir dies für nachfolgende Beispiele mal die "Direktklick-Methode":

<a href="javascript:aufruf()">los geht's</a>

Beispiel 1 - "Direktklick"-Aufruf einer Methode im Body
Tipp: Wenn Sie nur eine (einfache) Methode aufrufen, können Sie dies ebenfalls direkt tun:

<a href="javascript:window.alert('Hallo');>klicken</a>

Achten Sie aber auf die korrekte Verschachtelung der Gänsefüßchen (" außen für den Pseudolink-Code, ' innen für den Methodenparameter) sowie auf den Abschluss der Methode durch ; (der Abschluss des Pseudolink-Codes mit Gänsefüßchen erfolgt danach).

Beispiel 1: Probieren Sie's aus

Beispiel 2 - #-onclick-Ausführung einer Methode im Body:
Auch mit der "#-onlick-Methode" kann man kleinere Skripte direkt ausführen lassen:

<a href="#" onclick="window.alert('hallo');">klicken</a>

Auch hier muss die "Gänsefüßchen-'Verschachtelung'" korrekt sein.

Beispiel 2: Probieren Sie's aus

Heißer Tipp: self.close funktioniert in Verbindung mit der Direktklick-Methode (also <a href="javascript:self.close();">Fenster schlie&szlig;en</a> ) für IE 5 und höher, Windows nicht, sofern im Dokument-Header ein base target angegeben ist.(mit IE 5 für Mac ist es interessanterweise kein Problem), dies ergibt ggf. eine Fehlermeldung. Lösung: verwenden Sie die onlick-Methode und brechen dabei das im base-Target-Tag angegebene Fenster durch _self, also: <a href="#" target="_self" onclick="self.close();">Fenster schlie&szlig;en</a>

Beispiel 3a: Methodenreihen direkt im Body ausführen:
Sie können je nach Browser und Methode z.T. sogar mehrere Methoden (als Alternative zu einer skriptdefinierten function) in einem Link aneinanderfügen und direkt mit Klick ("Direktklick-Methode" oder "#-onclick-Methode") aufrufen:

<a href="javascript:window.alert('bitte ok klicken');var fenster=window.open(); fenster.document.write('nicht schlecht<br>gleich geht das Fenster zu'); fenster.setTimeout('close()', '3000');">klicken</a>

Das ist quasi eine selbstdefinierte Funktion, die aber keinen Namen trägt, da sie ja nicht mehrfach, sondern nur mit diesem Link aufgerufen werden kann. Dies ist allerdings ein Extrembeispiel und für direkte Javascript-Anweisungen im Link viel zu komplex).

Beispiel 3a: Probieren Sie's aus (aber nur, wenn Sie InternetExplorer für Mac verwenden bzw. das Nichtfunktionieren in anderen Browsern testen wollen!)

Haben Sie den Code analysiert? Zuerst kommt ein Alert, klickt man dort auf ok, wird der Rest des Codes abgearbeitet, d.h., ein zusätzlichesFenster mit dem über eine Variable definierten Namen fenster aufgemacht, darin eine Textstring, der umgebrochen ist, ausgegeben, dann das Fenster nach 3 Sekunden wieder geschlossen.

Problem bei Netscape Navigator (4.x, 6.x), Opera sowie IE 5 für PC: diese Browser kommen mit der close-Methode in der aneinandergereihten Methodenanweisungen nicht klar. Dies entspricht auch nicht der offiziellen JavaScript-Syntax.

Wenn Sie bei Beispiel 3a ausprobieren wollen, was hierbei z.B. mit NN passiert, sehen Sie Folgendes: alert kommt normal, danach geht auch das Fenster auf und der Text wird reingeschrieben. gleichzeitig wird dieses aber nicht mehr geschlossen und der Inhalt des Originalfensters wird gelöscht und eine Zahl hineingeschrieben. Sie müssen in diesem Fenster dann mit der Rückwärtstaste wieder zu unserem Kurs zurück und das andere Fenster von Hand schließen.


Beispiel 3b: function-Definition -die bessere Lösung für alle Browser:
Das absolut identische Skript funktioniert aber, wenn man es im Head-Teil als Funktion definiert und dann via Link (mit einer der beiden oben erwähnten Methoden aufruft:

Head-Teil:

<script language="JavaScript">
<!--
function NNok()
{
window.alert('bitte ok klicken');
var fenster=window.open();
fenster.document.write('nicht schlecht<br>gleich geht das Fenster zu');
fenster.setTimeout('close()', '3000');
}
-->
</script>

Im Body z.B. <a href="javascript:NNok()">die bessere L&ouml;sung</a>

Beispiel 3b: Testen Sie die bessere Lösung

Sie sollten also komplexere Methodenreihen klassisch als function definieren und via function Namen aufrufen, dann haben Sie keine Probleme. Wenn Sie die Methode analog Beispiel 3b verwenden, müssen Sie zuvor kräftig mit möglichst vielen Browsern testen.

(Hinweis: mit Apples Safari-Browser funktioniert obiges zwar, aber es gibt eine Fehlermeldung, da angeblich etwas "undefined" war. Nachdem dieser Browser ab noch im Beta-Stadium steht, soll uns dies nicht weiter stören.


Hexadezimaler Unicode mit escape/unescape-Methoden für Stringausgabe

Textstrings in JavaScript können für Sonderzeichen und Umlaute in vielen Methoden keinen html-Code (z.B. &auml; für ä) verwenden. Dies gilt z.B. für alert(); prompt(); confirm();-Methoden sowie die window.status-Eigenschaft. Auch Dezimal-Unicode (wäre für ä &#228) versteht JavaScript hier nicht. Sie müssten also z.B. folgendes schreiben:

alert("Schoene Gruesse");

Das ist natürlich nicht schön. In der englischen Sprache tritt das Problem viel seltener auf (nur bei Zeichen wie z.B. @), im Deutschen ist es aber allgegenwärtig.

Um in der Ausgabe ein ä bzw. entsprechendes Zeichen zu erhalten, müssen Sie den Hexadezimal-Unicode verwenden und dieses Zeichen dann mit der JavaScript-Methode escape(); decodieren.

Also z.B. alert("Sch" + unescape('%F6')+"n");

Etwas umständlich aber immerhin; ergibt: Schön

alert("Sch" + unescape('%F6') +"ne Gr" + unescape('%FC%DF') +"e"); ergibt: Schöne Grüße.

Beispiel 4 - Unescape-Ausgabe: Probieren Sie's aus

Powertipp: Wenn Sie lange Textstrings ausgeben wollen, bei denen Umlaute und Sonderzeichen mehrfach vorkommen, oder Probleme mit der Verschachtelung der Methoden bekommen, definieren Sie diese einfach als Variablen. Obiges Beispiel könnte dann z.B. folgendermaßen aussehen:

var oe= unescape("%F6");
var ue= unescape("%FC");
var sz = unescape("%DF");
alert("Sch" + oe +"ne Gr" + ue + sz +"e");

Dies ergibt in der Ausgabe wiederum "Schöne Grüße".

Nachstehend haben wir die Codes für die Umlaute und das ß aufgelistet.

Zeichen html-Code Dezimal-Unicode
(für html)
Hexadezimal-Unicode
(für JavaScript
ä &auml; &#228; %E4
Ä &Auml; &#196; %C4
ö &ouml; &#246; %F6
Ö &Ouml; &#214; %D6
ü &uuml; &#252; %FC
Ü &Uuml; &#220; %DC
ß &szlig; &#223; %DF

Wenn Sie weitere Zeichen benötigen, finden Sie entsprechende Tabellen z.B. im Selfhtml-Kurs. Herr Münzer stellt auch einen schönen Umrechner für Dezimalzahlen in Hexadezimalzahlen und umgekehrt zur Verfügung, zu finden unter http://selfhtml.teamone.de/helferlein/dezhex.htm

Wichtiger Hinweis: für die Methoden write(); und writeln(); verwenden Sie die normalen html-Codes, also z.B.

var fen=fen.document.write("sch&ouml;ne Gr&uuml;&szlig;e");

Beispiel 4b-write()-Ausgabe in html: Probieren Sie's aus.

Da write(); und writeln(); einfachen html-Code schreiben können, kann man ja auch die Ausgabe mit html formatieren, wie z.B.

fen.document.write("<br><i><b>sch&ouml;ne Gr&uuml;&szlig;e>")

Dies ist in Beispiel 4 b ebenfalls enthalten. Das Zusatzfenster von 4b wird übrigens automatisch mit den unten erläuterten verschachtelten Methoden setTimeOut und close bewerkstelligt:
fen.setTimeout('close()', '2000');

Sonstige Escape-Sequenzen:

Es gibt weitere Formatiermöglichkeiten für JavaScript-Code, mit der Sie z.B. die Ausgabe von alertfenster verbessern können oder auch sonstige Syntaxhürden, z.B. die Verschachtelung von Gänsefüßchen umschiffen können.

z.B. Zweizeilige Ausgabe in einem Alert-Fenster

window.alert("Dies ist die erste Zeile.\nDies ist die zweite Zeile");

Beispiel 5: Probieren Sie es aus

Probleme gibt es v.a. bei der Verschachtelung mit Gänsefüßchen, insbesondere wenn Sie eine Methode mit Untermethode direkt als Skript-Link definieren oder wenn Sie innerhalb eines Alert- oder Promptfensters ebenfalls Gänsefüßchen verwenden wollen:

Also z.B.

window.alert("Sein Spitzname ist 'Gaga'");

Dies funktioniert also nur, wenn Sie die Gänsefüßchen verschachteln. In der Ausgabe steht dann eben nicht "Gaga", sondern 'Gaga'.

Folgendes produziert eine Fehlermeldung und ist nicht darstellbar:

window.alert("Sein Spitzname ist "Gaga"");
Die Gänsefüßchen-Verschachtelung ist nicht korrekt.

Mit escape-Sequenzen bekommen wir dies auch anders hin:

window.alert("Sein Spitzname ist \"Gaga\"");

Einige wichtige Escape-Sequenzen finden Sie nachstehend:

\n Zeilenumbruch (new line)
\r Leerzeile einfügen (carriage return)
\t Tabulator einfügen
\' Einfaches Gänsefüßchen
\” normales Gänsefüßchen
\\ Backslash innerhalb String


Syntax für verschachtelte Methoden

Teilweise benötigen wir die Verschachtelung von Methoden, in mehreren der vorhergehenden Syntax-Beispiele war dies bereits der Fall. Hier gibt es einen wichtigen Punkt zu beachten, um keine Fehlermeldungen oder gar Browserabstürze zu verursachen:

Wir stellten immer heraus, dass Methodenanweisungen mit einem Semicolon abgeschlossen werden, also z.B. window.alert("Hallo"); (oder die verkürzte Form alert("Hallo");
Wir haben dies deshalb so betont, um damit klar von selbstdefinierten Funktionen zu unterscheiden.

Für verschachtelte Methoden gilt diese Regelung aber nicht. Die untergeordnete Methode erhält keinen Semikolon am Ende, nur die übergeordnete.

Beispiel:

var datum = new Date ();
window.document.write(datum.getMonth()+1);

Die Methode getMonth(); ist hier untergeordnet, d.h. Teil der Methode write(); insgesamt ist dies nur eine Anweisungszeile, die dann nur einmal mit Semikolon abgeschlossen werden darf.

Weiteres Beispiel von oben:
alert("Sch" + unescape('%F6')+"n");

Hier ist die Methode unescape(); verschachtelt in der Methode alert(); so dass unescape() ebenfalls ihren Strichpunkt verliert.

Noch ein Beispiel von oben:
fen.setTimeout('close()', '2000'); untergeordnet zur Methode setTimeOut(); ist hier close(), deshalb letzte auch ohne Strichpunkt.

Zur Vermeidung von Methodenverschachtelungen sowie Konflikten mit Gänsefüßchenverschachtelungen können Variablen (s.o.) eingesetzt werden, was ich sehr empfehle.


Funktionen zu Methoden machen

Ja, Sie haben richtig gelesen. Bislang haben wir immer ganz streng zwischen vom Programmierer definierten Funktionen (den functions) und den Methoden . Methoden sind meist objektorientiert, selten objektunabhängig ("built-in functions"). Bei letzterem sehen Sie bereits den Übergang zu functions.

In functions definieren wir ja abgekapselte Programmabläufe, die aus der Abarbeitung einer oder mehrerer Methoden, häufig unter Benutzung von Variablen und Schleifen bestehen und von Eventhandlern aufgerufen werden.

Stellen Sie sich vor, dass Sie diese von uns definierten functions aber auch in anderen functions verwenden können. Dann sind sie quasi zu objektunabhängigen, von uns definierten Methoden geworden. Eine function kann damit als Methode eine andere function aufrufen. Entsprechend benötigt die als Methode benutzte function zum Abschluss auch den Semikolon.

Das Ganze funktioniert also vom Prinzip her folgendermaßen:

<script language=JavaScript>
<!--
function beispiel_1()
{
objektmethode_1();
Objektmethode_2();
}
function beispiel_2()
{
objektmethode_1;
Objektmethode_2;
beispiel_1();
}
-->
</script>

Sie sehen also, dass function beispiel_1() von function beispiel_2() als von uns definierte "Methode", also via des Methodencodes
beispiel_1();
aufrufbar ist.

Übrigens könnten die beiden Funktionen auch von der Reihenfolge her vertauscht sein. Die erstdefinierte kann die zweitdefinierte via Methode aufrufen, da ja auch die erstdefinierte Methode nur via Eventhandler, also frühestens nach dem Body-Tag (durch einen onload - Eventhandler) aufgerufen wird. Dann sind bereits beide Funktionen vorgeladen, d.h. abrufbereit.

In unserem früheren Beispiel Farbkonverter mit verbesserter Abbruchmöglichkeit in Level 2 (Modul 7.3.4) hatten wir bereits ein entsprechendes Beispiel verwendet.

Besonders interessant wird es, wenn eine Funktion, die von einer anderen aus als Methode aufgerufen wird, gleich Variablen mit übergibt. Dazu kommen wir weiter unten auf dieser Seite.


Funktionen mit Variablen als Parameter

JavaScript verwendet Variablen in vielfältiger Weise. Sie können global (d.h. für das gesamte Skript zur Verfügung stehen) oder lokal (d.h. nur für eine Funktion zur Verfügung stehen), Objektmethoden adressieren oder für die Abarbeitung von Schleifen wichtig sein (vgl. entsprechende Erläuterungen in JS-Level 2 (Teilmodul 7.2.2)

Variablen können aber auch als Parameter direkt bei der Funktionsdefinition generiert oder übergeben werden. Sie stehen dann (ohne den Zusatz var) als Parameter in geschweiften Klammern. Generelle Syntax hierzu z.B.:

function aufrufen(variable_1, variable_2)
{
variable_1=objektmethode_a();
objekteigenschaft_2=variable_2;
objektmethode_2(variable_1, variable_2);
}

Beispiel 6: Funktionsaufruf mit Variablen als Parameter
Ein kleines Beispiel zur Erläuterung:

function aufrufen(ausgabe1, ausgabe2)
{
neuFenster=window.open("","testfenster","menubar=no, statusbar=no, locationbar=no, scrollbar=no, width=200, height=200, left=300, top=300");
neuFenster.document.writeln(ausgabe1 + "<br>");
neuFenster.document.writeln(ausgabe2 + "br>");
neuFenster.document.writeln("br>");
neuFenster.document.writeln("in zwei Sekunden schlie&szlig;t sich das Fenster");
neuFenster.setTimeout('close()', '2000');
}

Beispiel 6a: Obige Funktion aufrufen

Das macht noch wenig Sinn. Als Ausgabe bekommen Sie nur ein doppeltes 'undefined' (je nach Browser), da ja die Variablen zwar definiert aber noch nirgendwo mit einem Wert belegt sind.

Deshalb übergeben wir jetzt (in Beispiel 5b) mit dem Funktionsaufruf Variablen und zwar beim Linkklick, also eine der beiden folgenden Möglichkeiten:
<a href="#" onclick="aufrufen('Hallo', 'was soll das?')">Obige Funktion aufrufen</a>
oder
<a href="JavaScript:aufrufen('Hallo', 'Was soll das?')">Obige Funktion aufrufen</a>

Die beiden als Parameter übergebenen Textstrings werden dann automatisch die Werte der Variablen ausgabe1 bzw. ausgabe2

Probieren Sie es aus:

Beispiel 6b: Obige Funktion aufrufen (mit Variablenübergabe)

Sie können nun die Funktion beliebig oft von den verschiedensten Stellen im Dokument aufrufen und jedesmal neue Variablen übergeben, z.B.

Beispiel 6c: Obige Funktion aufrufen (mit den Variablen 'sehr nett' sowie 'jetzt hab ich es kapiert')

Ein komplexeres Beispiel finden Sie im nachfolgenden Abschitt


Rückgabe und Weitergabe von Werten mit return variable

Sie wissen bereits, dass wir globale Variablen benutzen können, die wir auch erst später wieder abrufen können. Hierzu ein Beispiel zur Erinnerung:

Beispiel 7: Eingabe einer benutzerdefinierten Variablen bei Seitenaufruf mit späterer Abfrage durch Benutzer.

Wir wollen das Skript kurz zur Wiederholung erläutern:

<script><!--
// jetzt wird die globale Variable name, noch ohne Wert definiert
var name;

/*nachfolgend kommt die Abfrage des Namens durch die prompt(); Methode.
Da sie nicht in einer function steht, wird sie beim Laden der Seite automatisch
aufgerufen. Damit wird der globalen Variablen name der Eingabewert zugeteilt*/

name=window.prompt("Ihr Name?", "");

//Die nachfolgende Funktion wird durch den Linkklick aufgerufen.
function ausgabe()
{
//der nachfolgende Code ist bekannt, die globale Variable Name wird dabei ausgegeben
neuFen=window.open();
neuFen.document.writeln("Hallo " + name +"<br>herzlich willkommen");
neuFen.document.writeln("<br>");
neuFen.document.writeln("in zwei Sekunden schlie&szlig;t sich das Fenster");
neuFen.setTimeout('close()', '2000');
}
// -->
</script>

Der Name kann also zu jedem beliebigen Zeitpunkt aufgerufen werden, da die eingegebene Variable global ist. Erst wenn wir die Seite verlassen, wird die Variable wieder gelöscht.

Schwieriger aber wird es, wenn wir einer Variablen erst bei Aufruf einer Funktion einen Wert zuweisen wollen und wiederum erst später, bezutzerdefiniert abfragen wollen. Hier wird die Variable ja innerhalb einer Funktion mit Wert belegt und ist damit lokal. Wie können wir diese Variable dann in mit einer späteren Funktion wieder abfragen?

Beispiel 8: Lokale Variablen mit return zu globalen Variablen machen
Die Lösung finden Sie in diesem Beispiel .

Viel hat sich nicht im Skript geändert. Die Ausgabefunktion blieb identisch. Nur die Eingabe hat sich verändert:

var name;
function eingabe()
{
var name=window.prompt("Ihr Name?", "");
return name;
}

Dies ist nur ein einfaches Beispiel, um die return-Anweisung zu erläutern. Ein komplexeres Beispiel finden Sie auf den Beispielseiten zu Level 3 (7.4.5).

Wichtig: Globale Variablen können mit obiger Methode zu beliebigen Zeitpunkten abgerufen, verändert und wieder abgerufen werden. Dies gilt jedoch nur, solange die entsprechend html-Seite geladen ist, da nur so lange die globale Variable im Browsercache geladen bleibt. Auf andere html-Seiten können derartige Variablen mit folgenden beidenMöglichkeiten übernommen werden:

Globale Variablen können leider nicht in externe Skripte übernommen werden und von dort aus an andere Seiten weiterübergeben werden, das geht prinzipiell nur mit den oben beschriebenen Möglichkeiten. Nur wenn die Originalseite mit der Variablen geladen bleibt, können Sie von einem anderen Fenster aus via JavaScript auch die Variable der Originalseite abfragen.

Tipp: Ein besserer Workaround ohne Cookies wäre, dass Sie Frames verwenden. Die globale Variable ist z.B. in einem oberen Frame immer abrufbar, da dort die gleiche Seite geladen bleibt. Die Dokumente eines unteren Frames können dabei wechseln. Mit JavaScript kann dann sogar die Ausgabe der Variablen des oberen Frames im unteren möglich sein.


JavaScript Shorthand: Verkürzte if-Abfragen und weitere Möglichkeiten

If-Abfragen sind ein wichtiges und häufig benutztes Programmiermittel für JavaScripte. Sie erlauben aufgrund Ihrer Verklammerung mittels { und } auch extrem verschachtelte Abfragen sowie die Ausführung mehrerer Methoden bei Erfüllung bzw. Nichtrfüllung der Abfragebedingung.

Für einfache if-Abfragen gibt es verkürzte Syntaxmöglichkeiten.

Hier ein Beispiel:

Komplette Syntax

var zahl=window.prompt("Ihre Antwort?", "");
if (zahl==5)
{
window.alert("Ihre Antwort ist richtig");
}
else
{
window.alert("Ihre Antwort ist falsch");
}

Vereinfachung durch Weglassen von else und Klammern: Da bei positiver if-Abfrage nur eine Methode abgearbeitet wird (nämlich alert) und auch else nicht weitere Verschachtelungen bringt, können wir else weglassen, sofern wir auf ggf. auf die Angabe "Ihre Antwort ist falsch" verzichten können sowie auch die geschweiften Klammern weglassen.

var zahl=window.prompt("Ihre Antwort?", "");
if (zahl==5)
window.alert("Ihre Antwort ist richtig");
weiterer Programmcode, der nach der if-Abfrage abgearbeitet wird;

In unserem Beispiel wäre es aber doch sinnvoll, dass auch angegeben wird, wenn eine falsche Antwort gegeben wurde. Obige Vereinfachung ist also eher selten möglich (z.B. bei einer Browserabfrage, falls sie nur einen bestimmten Browser auslesen wollen und dann bei erfüllter if-Abfrage mit window.document.href=URL gleich auf eine andere Seite umleiten).

Kurzform-Vereinfachung für einfache Abfragen:

Vorgehensweise:

Wenn nicht nur die Bedingung als Variable definiert werden kann (wie oben zahl), sondern auch die if und else Ergebnisse, kann der Code noch stark verkürzt werden.

Zur Erläuterung erst nochmals die Langform unter Verwendung solcher Variablen:

var zahl=window.prompt("Ihre Antwort?", "");
var kontrolle;
if (zahl==5)
{
kontrolle="richtig";
}
else
{
kontrolle="falsch";
}
window.alert("Ihre Antwort ist " + kontrolle);

Erläuterung: Hier wird zusätzlich die Variable kontrolle angelegt. Je nach Ergebnis der if-Abfrage wird der Variablen kontrolle ein anderer Wert zugeordnet. Dieser Wert wird erst nach Verlassen der if-else-Abfrage als nächster Programmschritt in einem alert-Fenster angezeigt.

Diese Form kann nun noch stark verkürzt werden:

var zahl=window.prompt("Ihre Antwort?", "");
var kontrolle= (zahl==5)? "richtig": "falsch";
window.alert("Ihre Antwort ist "+ kontrolle);

Sehen Sie sich das Ergebnis an (Beispiel 9)

Codeerläuterung:

Die if-Abfrage ist nun als Variable (nämlich kontrolle) definiert, der je nach Übereinstimmung des Wert einer anderen Variablen, zwei unterschiedliche Werte zulässt. Zu schnell? Also nochmals langsam:

(zahl==5) bedeutet nicht, dass der Variablen zahl eine 5 zugeordnet wird (sonst müsste dies zahl=5 lauten). Der Wert der Variablen wurde ja durch die Prompt-Abfrage zugeordnet (der Benutzer musste eine Antwort aus einer Rechenaufgabe eingeben, die auf Richtigkeit überprüft wird). Die Variable zahl wird durch == auf evtl. Übereinstimmung mit einer Vorgabe, in unserem Beispiel mit der Zahl 5 verglichen. Je nach Ausgang dieser Überprüfung wird der Variablen kontrolle ein unterschiedlicher Wert zugeordnet. Der an erster Stelle nach dem Fragezeichen stehende (bei uns "richtig"), wird genommen, wenn die Bedingung erfüllt ist, ansonsten wird der zweite, nach dem Doppelpunkt stehende genommen.

Danach wird die Abfrage verlassen und der nächste Programmpunkt ausgeführt. Das ist die alert();-Methode, in der wir den gemäß der if-Abfrage eingestellten Wert der Variablen kontrolle ausgeben lassen.

Vom Prinzip her also genau dasselbe wie in dem darüberstehenden Langformbeispiel. Eine Zeile Abfragecode statt 8 Zeilen in der Langform ist schon ein Gewinn. Beachten Sie aber, dass Sie als Ergebnis der verkürzten Abfrage nur einen Variablenwert erhalten und keine Methoden direkt abarbeiten lassen können. Den Variablenwert können Sie danach aber weiter verwenden, wie oben geschehen.

Gesamtsyntax also nach dem Prinzip:

var afe (Bedingung) ? afewert_b_erfüllt : afewert_b_nichterfüllt;

(afe: Abfrageergebnis; afewert_b_erfüllt: Abfrageergebniswert bei erfüllter Bedingung)

Hinweis: die Bedingung muss nicht unbedingt ein Variablenvergleich sein, es kann hier auch direkt der Wert einer Objekteigenschaft verglichen werden, also z.B.

var afe (window.document.bgcolor=="#ff0000") ? afewert_b_erfüllt : afewert_b_nichterfüllt;

Weitere Kurzformmöglichkeiten (nicht empfohlen):

Operator this

this spricht das aktuelle Objekt an. Dadurch kann man sich das Wiederholen der Objektketten bei nacheinanderfolgenden verschiedenen Methoden des gleichen Objekts sparen. Funktioniert also nach dem Prinzip

this.eigenschaft bzw. this.methode();

Sie müssen allerdings wissen, welche Objekte durch diesen Operator unterstützt werden. Im empfehle die Verwendung nicht.

Variablen: Sie können im Prinzip auf das Schlüsselwort var bei der Definition von Variablen verzichten, das macht den Code allerdings unübersichtlicher.

also statt:

var farbe;
farbe=window.document.bgColor;

hätten Sie auch schreiben können:

farbe;
farbe=window.document.bgColor

oder gleich nur:
farbe=window.document.bgColor;

Sie müssen jedoch immer berücksichtigen, ob Sie globale Variablen (werden außerhalb von Funktionen definiert) oder lokale Variablen (innerhalb von Definitionen) einrichten.

Wie Sie Variablen direkt als Funktionsparameter definieren, haben wir weiter oben behandelt.

Abgekürzte Objektadressierung:

Als objektorientierte Programmiersprache müssen Methoden für untergeordnete Objekte eigentlich mit kompletter Objekt/Unterobjekt-Adressierung ("Objektpfad") angesprochen werden.

Beispiel:

window.document.forms[0].elements[4].focus();

Es gibt jedoch einige objektbezogene Methoden bzw. objektbezogene Eigenenschaften, bei denen Sie nicht unbedingt den kompletten Objektpfad angeben müssen, z.B.:

Auch wenn der Kursleiter selbst immer wieder mal inkonsequent ist, empfehle ich dieses Vorgehen nicht, zumal manche Abkürzungen nicht in allen Browsern funktionieren. Mit kompletten Objektpfadangaben erlernen Sie auch am schnellsten die Objekthierarchie von JavaScript


do-while-Schleifen

Ebenfalls eine Art Kurzdefinition für Abfragen sind sog. do-while-Abfragen.

Sie erinnern sich an die while-Schleifen. Sie funktioniert nach folgendem Prinzip:

while (Bedingung)
{
Programmabläufe, solange die Bedingung erfüllt ist
}

Die Bedingung wird hierbei vor jedem Durchlauf geprüft.

Die do-while-Schleife ist recht ähnlich, allerdings erfolgt die Überprüfung erst am Ende eines Schleifendurchlaufs. Dies bedeutet, dass die Schleife wenigstens einmal ausgeführt wird. Besonders gut ist sie geeignet, um einen Vorgang zu wiederholen, bis das vorgesehene Ereignis eingetreten ist (z.B. das richtige Passwort oder die richtige Antwort eingegeben ist):

Generelles Prinzip:

do
{
Programmablauf, weitere Durchläufe nur, falls u.a. Bedingung erfüllt ist
}
while (bedingung)

Beispiel:

do
{
eingabe=window.prompt("Geben Sie die richtige Antwort ein", "");
}
while (eingabe!="Korallen")
alert("richtige Antwort!");

Hier das Ergebnis (Beispiel 10)

Im Unterschied zu Beispiel 9 wird also hier so lange abgefragt, bis die richtige Antwort kommt.

(die richtige Antwort ist Korallen, sonst bekommen Sie die Eingabeaufforderung nicht mehr weg).


>> Modul 7.4.4: Zusammenfassung JavaScript-Level 3

<< Modul 7.4.2: vereinfachte JS-Referenz