JavaScript

Transcrição

JavaScript
Gestaltung von Webseiten mit
JavaScript
• Einleitung
• JavaScript-Kern
◦ Datentypen
◦ Kontrollstrukturen
◦ Funktionen
◦ Objekte
◦ Felder
◦ Reguläre Ausdrücke
• Client-seitiges JavaScript
◦ Windows und Frames
◦ Dokument-Objekt-Modell
◦ Formulare
◦ Ereignisbehandlung
◦ Cookies
• Beispiele
JavaScript
Dirk Husung
Gestaltung von Webseiten mit JavaScript (1)
1 Einleitung
JavaScript ist eine (typischerweise) durch WWWBrowser interpretierte, in HTML integrierbare Programmiersprache, von Netscape entwickelt und lizensiert.
Unterschieden werden JavaScript-Kern, Client-seitiges („LiveScript“), und Server-seitiges JavaScript
(„LiveWire“, Active Server Pages (ASP) bei Microsoft).
Client-seitiges JavaScript umfaßt neben dem JavaScript-Kern u.a. Window- und Form-Objekte sowie
ein Dokument-Objekt-Modell.
Server-seitiges JavaScript stellt File-, Database-,
Request- und Client-Objekte zur Verfügung und bildet (eine herstellerabhängige) Alternative zu CGISkripten.
Im folgenden sollen der JavaScript-Kern und Clientseitiges JavaScript betrachtet werden.
JavaScript
Dirk Husung
Einleitung (2)
JavaScript lehnt sich in seiner Syntax (wie Java) an
C an.
Ab der Version 1.3 ist JavaScript vollständig konform zu den internationalen Standards ECMA-2621
und ISO-162622.
Der MS Internet-Explorer interpretiert tatsächlich
eine Sprachvariante, JScript, die spezielle Befehle für Betriebssystemerweiterungen bereitstellt.
Was kann JavaScript?
• JavaScript stellt eine vollwertige Programmiersprache dar.
Es unterstützt beliebige Berechnungen mit einer Vielzahl von Standardfunktionen.
• Event-Handler erlauben es, auf Benutzereingaben über Tastatur oder Maus zu reagieren.
• Mit Hilfe des Window-Objekts ist es möglich,
neue Browser-Fenster zu erzeugen, zu öffnen
und zu schließen.
1
2
ECMA: European Computer Manufacturers Association
ISO: International Organization for Standards
JavaScript
Dirk Husung
Einleitung (3)
• Im einfachsten Fall lassen sich vordefinierte
Popup-Dialogboxen anzeigen, etwa bevor ein
Benutzer ein wichtiges Formular versendet.
• Im allgemeinen können Größe und Position sowie Kontrollelemente eines neuen Fensters vorgegeben werden.
• Das Dokument-Objekt-Modell bietet Zugriff auf
eine Hierarchie von Objekten, entsprechend
dem Inhalt einer Web-Seite.
Unter Ausnutzung des Dokument-Objekt-Modells ist es möglich, Dokumente von Grund auf
vollständig aufzubauen.
IE 4 unterstützt ein vollständiges Dokument-Objekt-Modell, das es gestattet, Inhalt und Aussehen eines jeden Elements zu modifizieren.
• document.write() fügt beliebigen HTMLCode in ein Dokument ein, zu dem Zeitpunkt,
zu dem die Seite von dem Browser analysiert
wird.
• Das Form-Objekt erlaubt den Zugriff auf HTMLFormulare, insbesondere Button-, CheckBox-,
JavaScript
Dirk Husung
Einleitung (4)
Hidden-, Password-, Radio-, Reset-, Select-,
Submit-, Text- und TextArea-Elemente.
Damit gestattet JavaScript die Konsistenzprüfung von Formularen vor ihrer Versendung und
die Vorverarbeitung von Eingaben.
• JavaScript kann steuern, welche Web-Seiten im
Browser angezeigt werden.
• Das History-Objekt stellt die Funktionalität des
Forward- und Back-Buttons zur Verfügung.
• Es ist möglich, beliebige Meldungen in der Statuszeile des Browser-Fensters anzuzeigen, etwa wenn der Benutzer die Maus über einen Hypertextlink bewegt.
• Ein Navigator-Objekt liefert Rechner-Plattform,
Name und Version des Browsers.
• JavaScript erlaubt es, Cookies zu schreiben und
zu lesen: einige wenige Zustandsdaten, die temporär oder dauerhaft durch den Client gespeichert werden.
JavaScript
Dirk Husung
Einleitung (5)
Seit JavaScript 1.1:
• Austausch eines per IMG-Tag angezeigten Bildes
• Zusammenarbeit mit Java Applets
• Scrollen von Fensterinhalten
Seit JavaScript 1.2:
• Modell zur Ereignisbehandlung
• Style-Sheets
• dynamische Positionierung
• reguläre Ausdrücke
• switch-Anweisung
• delete-Operator
• Ein Screen-Objekt liefert Größe und Farbtiefe
des verwendeten Bildschirms
• Verschieben und Verändern der Größe von Fenstern
JavaScript
Dirk Husung
Einleitung (6)
Was kann JavaScript nicht?
• JavaScript bietet keine Grafikfunktionen über die
vordefinierten GUI-Elemente hinaus.
• JavaScript kennt keine Methoden, die es gestatten, Frames direkt zu erzeugen oder zu verändern.
Versionen
JavaScript
Navigator
JavaScript 1.0
JavaScript 1.1
JavaScript 1.2
JavaScript 1.3
Navigator 2.0
Explorer 3.0
Navigator 3.0
Explorer 4.0
Navigator 4.0–4.05 Explorer 4.0, teilw.
Navigator 4.06–4.5
JavaScript
Dirk Husung
Internet Explorer
Einleitung (7)
1.1 Einführendes Beispiel
Einfache JavaScript-Eingaben können über ein
JavaScript-Pseudo-Protokoll erfolgen:
javascript:
URL
Bei dem Netscape Navigator öffnet die alleinige Eingabe von
javascript:
als URL eine JavaScript-Konsole.
Integration von JavaScript in eine HTML-Datei:
<html><head>
<title>JavaScript-Test</title>
<script language="JavaScript">
<!-function Quadrat (Zahl) {
Ergebnis = Zahl * Zahl;
alert (Zahl + "^2 = " + Ergebnis);
}
//-->
</script>
</head><body>
<form>
<input type=button
value="Quadrat von 7 errechnen"
onClick="Quadrat(7)">
</form>
</body></html>
JavaScript
Dirk Husung
Einführendes Beispiel (1)
Alternativ können JavaScripte in eigenen Dateien
gespeichert werden:
<html><head>
<title>JavaScript-Test</title>
<script language="JavaScript"
src="quadrat.js" type="text/javascript">
</script>
</head><body>
<form>
<input type=button
value="Quadrat von 6 errechnen"
onClick="Quadrat(6)">
</form>
</body></html>
JavaScript-Debugger stehen zur Verfügung unter:
http://developer.netscape.com/products/jsdebug/
http://www.microsoft.com/scripting/debugger/
JavaScript
Dirk Husung
Einführendes Beispiel (2)
2 Lexikalische Elemente
• JavaScript ignoriert Zwischenraumzeichen zwischen Sprachelementen.
• Grundsätzlich wird jede Anweisung durch ein
Semikolon abgeschlossen. Ein Semikolon hinter der letzten Anweisung einer Zeile ist optional.
Kommentare
// Kommentar bis zum Zeilende
/* Kommentar über mehrere Zeilen,
nicht schachtelbar */
<!-- Kommentar bis zum Zeilenende
//-->
Bezeichner
• Folge von Buchstaben und Ziffern, beginnend
mit einem Buchstaben; „_“ und „$“ (seit JavaScript 1.1) zählen zu den Buchstaben. Zulässig
sind nur ASCII-Zeichen (keine Umlaute).
JavaScript
Dirk Husung
Lexikalische Elemente (1)
• Unterscheidung zwischen Groß- und Kleinbuchstaben (im Gegensatz zu HTML).
Ausnahmen sind bei Client-seitigem JavaScript
möglich (JavaScript Style-Sheets in Navigator 4:
document.tag.BODY.COLOR = "red";)
• Maximallänge 32 Zeichen
Reservierte Schlüsselwörter
abstract
boolean
break
byte
case
catch
char
class
const
continue
debugger
default
delete
do
double
JavaScript
Dirk Husung
else
enum
export
extends
false
final
finally
float
for
function
goto
if
implements
import
in
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
static
super
switch
synchronized
this
throw
throws
transient
true
try
typeof
var
void
volatile
while
with
Lexikalische Elemente (2)
3 Datentypen
JavaScript unterscheidet
• primitive Datentypen
◦ (Gleitkomma-)Zahlen
◦ Boolsche Werte: true und false
◦ Zeichenketten
• zusammengesetzte Datentypen
◦ Objekte
◦ Felder
• Funktionen
Felder und Funktionen stellen spezielle Objekte dar.
Primitive und Referenzdatentypen
Ein primitiver Datentyp speichert seinen Wert selbst;
jede Variable eines primitiven Datentyps belegt eine feste Speicherplatzgröße.
JavaScript
Dirk Husung
Datentypen (1)
Ein Referenz-Datentyp speichert einen Verweis auf
seinen Wert; Variablen desselben Referenz-Datentyps können unterschiedlich viel Speicherplatz belegen. Verschiedene Referenzvariablen können auf
denselben Wert verweisen.
Objekte, Felder und Funktionen sind als Referenzdatentypen implementiert.
Zeichenketten können als unveränderlicher Referenztyp betrachtet werden.
JavaScript
Dirk Husung
Datentypen (2)
3.1 Zahlen
stellt JavaScript stets im 8-Byte-IEEE-Gleitkommaformat dar.
Es gibt keinen gesonderten Ganzzahltyp, auch
wenn die meisten ganzzahligen Operationen auf
32-Bit-Werten ausgeführt werden.
• Die mathematischen Standardfunktionen sind
als Eigenschaften des Math-Objekts gespeichert.
c = Math.sqrt (a*a + b*b);
• Eine Zahl kann mittels toString() in eine Zeichenkette konvertiert werden:
x = 10;
s = x.toString(2); // zur Basis 2
Spezielle Werte
Wert
Bedeutung
Number.MAX_VALUE
Number.MIN_VALUE
Number.NaN
Number.POSITIVE_INFINITY
Number.NEGATIVE_INFINITY
größte darstellbare Zahl
kleinste negative Zahl
„not a number“
+∞
−∞
JavaScript
Dirk Husung
Zahlen (1)
3.2 Zeichenketten
(Konstantenschreibweise s.u.)
JavaScript kennt keinen gesonderten Zeichentyp.
• „+“ dient dem Aneinanderhängen von Zeichenketten; ggf. wird dabei ein numerischer Wert in
eine Zeichenkette umgewandelt.
Achtung:
"37" + 7 // liefert 377
"37" - 7 // liefert 30
• s.length liefert die Anzahl der Zeichen einer
Zeichenkette s.
• Einige Methoden:
s.charAt(s.length-1);
s.substring(1,4);
s.indexOf(’a’);
• Navigator 4 (nicht aber IE 4) unterstützt den Zugriff auf einzelne Zeichen wie auf Feldelemente:
s[s.length-1];
JavaScript
Dirk Husung
Zeichenketten (1)
3.3 Boolsche Werte
sind in der Regel das Ergebnis von Vergleichsoperatoren.
Obwohl JavaScript im Gegensatz zu C einen eigenständigen boolschen Datentyp kennt, erfolgt im
Bedarfsfall eine implizite Typumwandlung von
false in 0 und von true in 1.
JavaScript
Dirk Husung
Boolsche Werte (2)
3.4 Objekte
stellen eine Sammlung benannter Komponenten dar.
Dies können Daten (Zustand) oder Funktionen (Verhalten) sein.
image.width
image.height
document.write("text");
Objekte in JavaScript können als assoziative Felder dienen.
image["width"]
image["height"]
Objekte werden durch spezielle Konstruktorfunktionen erzeugt:
var o = new Object();
Seit JavaScript 1.2 können Objekte mit einer Intitialisierungssyntax eingeführt werden:
var point = { x:2.3, y:-1.2 };
JavaScript
Dirk Husung
Objekte (1)
Für die Werte der Komponenten können beliebige
Ausdrücke angegeben werden.
Wrapper-Objekte
Zu jedem der primitiven Datentypen gibt es eine
ensprechende Wrapper-Objektklasse. Ein WrapperObjekt nimmt den Wert einer Variable eines primitiven Typs auf, stellt jedoch zusätzliche Komponenten zur Verfügung.
JavaScript konvertiert implizit je nach Kontext primitive Variablen vorübergehend in Wrapper-Objekte
und umgekehrt.
len = s.length;
S = new String ("Hello, World");
msg = S + ’!’;
JavaScript
Dirk Husung
Objekte (2)
3.5 Felder
stellen eine Sammlung indizierter Feldelemente dar.
Die Indizierung erfolgt mit natürlichen Zahlen, beginnend bei 0. Die Feldelemente können beliebigen Typ besitzen (heterogene Felder).
Erzeugen eines Feldes
var a = new Array();
a[0] = 1.2;
a[1] = "JavaScript";
Seit JavaScript 1.2 können Felder mit einer Initialisiserungssyntax eingeführt werden:
var a = [ 1.2, "JavaScript" ];
Für die Werte der Feldelemente können beliebige
Ausdrücke angegeben werden.
Auslassen eines Initialwertes bewirkt ein undefiniertes Element.
Achtung:Navigator 4 besitzt folgenden Fehler: Wird
in der Initialisierungssyntax nur ein einzelnes Element angegeben, legt dessen Wert die anfängliche
Zahl der Feldelemente fest.
JavaScript
Dirk Husung
Felder (1)
3.6 Funktionen
stellen in JavaScript erstrangige Datentypen dar:
Sie können in Variablen, Feldern und Objekten gespeichert und anderen Funktionen als Argumente
übergeben werden.
Eine Funktion, die als Eigenschaft eines Objekts
gespeichert ist, heißt Methode.
Event-Handler sind Methoden spezieller Objekte
in Client-seitigem JavaScript, die vom Web-Browser
aufgrund entsprechender Benutzeraktionen aufgerufen werden.
function square(x) {
return x*x;
}
Seit JavaScript 1.2 können Funktionsdefinitionen
geschachtelt werden.
Eine Funktion kann mit einem Konstruktor erzeugt
werden.
var square =
new Function ("x", "return x*x");
JavaScript
Dirk Husung
Funktionen (1)
Die führenden Argumente bennen die Parameter,
das letzte Argument beschreibt den Funktionsrumpf.
square hält einen Verweis auf die erzeugte Funktion, die Funktion selbst ist „anonym“.
JavaScript 1.2 unterstützt Lamda-Funktionen, eine
Konstantenschreibweise für Funktionen:
var square = function(x) { return x*x; }
JavaScript
Dirk Husung
Funktionen (2)
3.7 null und undefined
Der Wert null bedeutet, daß eine Variable keinen
gültigen Wert besitzt.
Der Wert undefined ergibt sich bei Benutzung einer nicht existierenden oder nicht initialisierten Variable oder Methode.
Es gibt kein Schlüsselwort undefined. Bei einem Vergleich werden null und undefined als
gleich behandelt, der typeof-Operator (ab JavaScript 1.1) liefert jedoch:
type = typeof null;
// "object"
var undefined;
type = typeof undefined; // "undefined"
JavaScript
Dirk Husung
null und undefined (1)
3.8 Konstanten
Zahlen
ganzzahlige Werte:
42 (Basis 10), 0x1234 (Basis 16), 007 (Basis 8)
Gleitkommawerte:
3.1415, -3.1E12, .1e12, oder 2E-12
Boolsche Werte
true, false
Zeichenketten
"123", ’eins zwei drei’
Da HTML sehr oft doppelte Anführungszeichen verwendet, sind für JavaScript einfache empfehlenswert. Ein Apostroph ist dann als „\’“ mit einem
Backslash zu schreiben.
JavaScript
Dirk Husung
Konstanten (1)
Spezielle Zeichen
\b
\f
\n
\r
\t
\\
\’
\"
\ddd
\xdd
\udddd
Backspace
Seitenvorschub (form feed)
Zeilenende (new line)
Zeilenrücklauf (carriage return)
horizontaler Tabulator
Fluchtsymbol (backslash)
Apostroph (quote)
Anführungszeichen (double quote)
ASCII-Zeichen in oktaler Notation
ASCII-Zeichen in hexidezimaler Notation
Unicode-Zeichen in hexidezimaler Notation (ab Version 1.3)
Felder
array = ["eins", , "drei"];
// array[0] besitzt den Wert "eins"
Objekte
Eine Objektkonstante besteht aus einer Liste von
Paaren aus Schlüsselnamen und assoziierten Werten, eingeschlossen in „{ }“.
JavaScript
Dirk Husung
Konstanten (2)
var Sales = "Toyota";
function CarTypes(name) {
if(name == "Honda")
return name;
else
return "Sorry, we don’t sell "
+ name + ".";
}
car = {myCar: "Saturn",
getCar: CarTypes("Honda"),
special: Sales}
document.write(car.myCar);
// Saturn
document.write(car.getCar); // Honda
document.write(car.special); // Toyota
Spezielle Konstanten
null
JavaScript
Dirk Husung
Konstanten (3)
3.9 Variablen
Eine Variable verknüpft einen Namen mit einem Wert.
Dynamische Typisierung
In JavaScript können derselben Variablen Werte
unterschiedlichen Typs zugewiesen werden.
i = 1;
i = "one";
Je nach Kontext führt JavaScript implizit Typkonvertierungen durch.
null bedeutet 0 in numerischem, false in boolschem Kontext,
undefined bedeutet false in boolschem Kontext.
Deklaration
Variablen können außerhalb von Funktionen (global) oder innerhalb einer Funktion (lokal) erklärt
werden.
Globale Variablen lassen sich durch einfache Wertzuweisung einführen, optional mit dem Schlüsselwort var, lokale Variablen sind stets mit var einzuführen.
JavaScript
Dirk Husung
Variablen (1)
var i;
Eine Wertzuweisung an eine nicht mit var deklarierte Variable definiert ein globale Variable.
Der Versuch, den Wert einer nicht mit var deklarierten Variable zu lesen, führt zu einem Laufzeitfehler.
Variablen können bei ihrer Deklaration initialisiert
werden.
var i = 0, k = 0;
Wird eine Variable nicht initialisiert, so erhält sie
den Wert undefined oder NaN in numerischem
Kontext.
Mittels var deklarierte Variablen sind permanent.
Sie können nicht mit delete gelöscht werden.
Variablen können mehrfach deklariert und initialisiert werden.
Sichtbarkeitsbereich
JavaScript
Dirk Husung
Variablen (2)
Eine globale Variable ist programmweit sichtbar, eine lokale Variable innerhalb der Funktion, in der sie
deklariert ist, auch vor ihrer Deklaration. Im Falle geschachtelter Funktionsdefinitionen besitzt jede Funktion ihren eigenen Sichtbarkeitsbereich.
Eine lokale Variable verdeckt eine gleichnamige globale.
var scope = "global";
function checkscope() {
document.write (scope); // undefined
var scope = "local";
document.write (scope); // "local"
}
Variablen sollten am Beginn einer Funktion deklaraiert werden.
Namensauflösung
Jede globale Variable wird als Komponente eines
globalen Objekts angelegt. Im Client-seitigen JavaScript dient das window-Objekt als globales Objekt. Es besitzt eine sich selbst referenzierende
window-Komponente.
JavaScript
Dirk Husung
Variablen (3)
Parameter und lokale Variablen einer Funktion werden als Komponenten eines Aufruf-Objekts angelegt.
Bei Aufruf einer Funktion erzeugt der JavaScriptInterpreter einen neuen Ausführungskontext. Teil
dieses Kontextes ist das Aufruf-Objekt.
Es werden verschiedene globale Ausführungskontexte unterstützt, jeder mit einem eigenen globalen
Objekt. Zwischen diesen Kontexten ist ein Datenaustausch möglich (Sicherheitproblem!)
Jedem Ausführungskontext ist eine Sichtbarkeitskette zugeordnet: Dazu sind die Aufruf-Objekte entsprechend der lexikalischen Struktur der zugehörigen Funktionsdefinitionen verkettet. JavaScript
sucht den Wert einer Variablen entlang dieser Kette.
Garbage Collection
JavaScript besitzt eine automatische Speicherfreigabe.
JavaScript
Dirk Husung
Variablen (4)
3.10 Operatoren
Operator-Priorität
Operatorart
Operatoren
Komponetenzugriff
Instantiierung
Unterprogrammaufruf
Negation/Inkrement
. []
new
()
! ~ - + ++ -- typeof void
delete
Multiplikation/Division
* / %
Addition/Subtraktion
+ bitweiser Shift
<< >> >>>
Vergleich
< <= > >=
Gleichheit
== !=
bitweises Und
&
bitweises Exklusiv-Oder ^
bitweises Oder
|
logisches Und
&&
logisches Oder
||
Bedingter Ausdruck
?:
Zuweisung
= += -= *= /= %= <<= >>=
>>>= &= ^= |=
Komma
,
JavaScript
Dirk Husung
Operatoren (1)
Anmerkungen:
• JavaScript konvertiert Operanden in die geeigneten Typen für eine Operation, wenn möglich.
i = "3"*"5" // 15
• Der Zuweisungsoperator liefert den Wert des
rechten Operanden.
Vergleichsoperatoren
Operator Beschreibung
==
!=
===
!==
>
>=
<
<=
true bei gleichem Wert, ggf. nach Typkonvertierung
true bei ungleichem Wert, selbst nach Typkonvertierung
true bei gleichem Typ und Wert
true bei ungleichem Typ oder Wert
größer
größer oder gleich
kleiner
kleiner oder gleich
JavaScript
Dirk Husung
Operatoren (2)
Zwei Operanden werden wie folgt auf Gleichheit
verglichen:
• Besitzen die Operanden denselben Typ, werden
ihre Werte verglichen.
Besitzt einer der Operanden den Wert NaN, sind
die Operanden ungleich.
Referenzieren die Operanden verschiedene Objekte, sind sie ungleich, selbst wenn beide Objekte zu gleichen primitiven Datentypen konvertiert werden könnten.
• Ist einer der Operanden null und der andere
undefined, sind die Operanden gleich.
• Andernfalls wird versucht, die Operanden in gleiche Typen zu konvertieren:
Ist der eine Operand eine Zahl, der andere eine Zeichenkette, wird die Zeichenkette in eine
Zahl konvertiert und der Vergleich erneut durchgeführt.
Besitzt einer der Operanden einen boolschen
Wert, wird false nach 0, true nach 1 konvertiert und der Vergleich erneut durchgeführt.
JavaScript
Dirk Husung
Operatoren (3)
Ist einer der Operanden ein Objekt und der andere eine Zahl oder Zeichenkette, wird versucht,
das Objekt mittels valueof() oder toString()
zu konvertieren; danach wird der Vergleich erneut ausgeführt.
In allen anderen Fällen liefert der Vergleich ungleich.
Anmerkungen:
• Wenn Navigator 3 bei einem Vergleich eine Zeichenkette nicht in eine Zahl konvertieren kann,
meldet er einen Fehler statt das Ergebnis false
zu liefern.
• Ist im <SCRIPT>-Tag die JavaScript-Version 1.2
angegeben, führt Navigator 4 vor einem Vergleich auf Gleichheit keine Typ-Konvertierung
durch.
• Der strikte Vergleichsoperator „===“, implementiert in IE 4, entspricht einem Vergleich auf
Gleichheit ohne vorherige Typkonvertierung der
Operanden.
null und undefined werden nicht als gleich
bertrachtet.
JavaScript
Dirk Husung
Operatoren (4)
• Die Operatoren „<“, „<=“, „>“, „>=“ erlauben Operanden beliebigen Typs, sind jedoch nur für Zahlen und Zeichenketten erklärt; die Operanden
werden ggf. konvertiert.
Arithmetische Operatoren
Im wesentlichen wie in C, aber:
• Bei „+“-Verknüpfung einer Zeichenketten mit
Zahl, wird die Zahl in eine Zeichenkette konvertiert, und die Zeichenketten werden aneinandergehängt.
s = "1" + 2 // "12"
• Die Division ganzer Zahlen erfolgt gleitpunktmäßig.
• Der Modulo-Operator ist auch für Gleitpunkt-Datentypen erklärt.
JavaScript
Dirk Husung
Operatoren (5)
Bitweise Operatoren
Operator Beschreibung
&
|
^
~
<<
>>
>>>
bitweises Und
bitweises Oder
bitweises Exklusiv-Oder
bitweise Negation
Shift um eine Bitposition nach links
arithmetischer Shift um eine Bitposition nach
rechts unter Erhalt des Vorzeichens
logischer Shift um eine Bitposition nach rechts mit
Einführung einer führenden 0
Anmerkungen:
• Die bitweisen Operatoren liefern NaN, wenn ihre
Operanden nicht ganzzahlig oder nicht als 32Bit-Werte darstellbar sind.
Logische Operatoren
Anmerkungen:
• Kann der linke Operand von „&&“ zu false konvertiert werden, liefert „&&“ den Wert des linken
Operanden, sonst den des rechten.
JavaScript
Dirk Husung
Operatoren (6)
• Kann der linke Operand von „||“ zu true konvertiert werden, liefert „||“ den Wert des linken
Operanden, sonst den des rechten.
Spezielle Operatoren
Operator Beschreibung
new
delete
this
typeof
void
Instantiierung eines Objekts
Löschen eines Objekts, eines Objektattributs oder
eines Feldelements
Referenz auf das aktuelle Objekt
Typkennung (als Zeichenkette)
Ausdrucksauswertung ohne Ergebnisrückgabe
Anmerkungen:
• Objekte und Felder werden mit dem new-Operator
erzeugt:
new constructor
Der constructor muß die Form eines Funktionsaufrufs besitzen. Falls keine Argumente angegeben werden, können die Klammern entfallen.
Der new-Operator erzeugt zunächst ein Objekt,
das dann der constructor-Funktion als Wert
von this übergeben wird.
JavaScript
Dirk Husung
Operatoren (7)
• delete dient dem Löschen einer Objektkomponente. Bei einigen vordefinierten und einigen
Client-seitigen
Objektkomponenten
bleibt
delete wirkungslos. Ein Aufruf von delete
für mittels var deklarierte Variablen führt zu einer Fehlermeldung.
• Der typeof-Operator (seit Navigator 3 und IE 3)
liefert eine Zeichenkette, die den Typ des Operanden beschreibt: "number", "string",
"boolean" für die entsprechenden primitiven
Datentypen, "object" für Objekte, Felder und
null, "function" für Funktionen sowie
"undefined" für nicht definierte oder uninitialisierte Komponenten.
Um verschiedene Objekttypen zu unterscheiden,
kann meist die constructor-Komponente herangezogen werden:
if (typeof d == "object" &&
d.constructor == Date) {
...
}
• void liefert für beliebige Operanden das Ergebnis undefined. Dies kann nützlich sein innerhalb von HTML-Tags:
<A HREF="javascript:void window.open();">
New Window</A>
JavaScript
Dirk Husung
Operatoren (8)
4 Kontrollstrukturen
4.1 Blockanweisung
s.u.
4.2 Verzweigungs-Anweisungen
if- und if-else-Anweisung
var array = new Array();
if (!array[0])
initialize();
var input;
if(input === undefined) {
doThis();
}
else {
doThat();
}
JavaScript
Dirk Husung
Verzweigungs-Anweisungen (1)
switch-Anweisung (ab JavaScript 1.2)
switch(Eingabe) {
case "1":
alert("Erster Zweig");
break;
case "2":
alert("Zweiter Zweig");
break;
default:
alert("Standard");
break;
}
4.3 Wiederholungs-Anweisungen
while-Anweisung
var i = 1;
while(i <= 10) {
var x = i * i;
document.write("<br>" + i + "^2 = " + x);
i++;
}
JavaScript
Dirk Husung
Wiederholungs-Anweisungen (1)
for-Anweisung
for(i = 1; i <= 10; i++) {
var x = i * i;
document.write("<br>" + i + "^2 ist " + x);
}
var Ergebnis = "";
for (var Eigenschaft in Objekt) {
Ergebnis += ObjName + "." + Eigenschaft
+ " = " + Objekt[Eigenschaft] + "<br>";
}
do-while-Anweisung
var i = 1;
do {
var x = i * i;
document.write("<br>" + i + "^2 ist " + x);
} while(i <= 10);
JavaScript
Dirk Husung
Wiederholungs-Anweisungen (2)
4.4 Spezielle Anweisungen
break- und continue-Anweisung
while (i < 6) {
if (i == 3) {
alert("Das war’s, i ist gleich " + i);
break Ende;
}
i++;
}
Ende:
with-Anweisung
with(document) {
open();
write("Hintergrundfarbe: " + bgColor);
close();
}
JavaScript
Dirk Husung
Spezielle Anweisungen (1)
5 Funktionen
5.1 Funktionsdefinition
function square(x) {
return x*x;
}
Anmerkungen:
• Wird eine Funktion mit mehr Argumenten aufgerufen als vereinbart, werden die überzähligen
Argumente ignoriert.
• Wird eine Funktion mit weniger Argumenten aufgerufen als vereinbart, erhalten die restlichen
Paramter den Wert undefined.
• Enthält eine Funktionsdefinition keine returnAnweisung, liefert sie den Wert undefined zurück.
Obige Funktionsdefinition erzeugt ein Funktionsobjekt und weist es der Variablen square zu; entsprechend ist zulässig:
JavaScript
Dirk Husung
Funktionsdefinition (1)
var f = square;
var y = f(2);
Funktionen können an Objektkomponenten zugewiesen werden; sie werden damit zu Methoden:
var o = new Object;
o.square = function (x) { return x*x; };
5.2 Argument-Objekt
Parameter und lokale Variablen einer Funktion werden als Komponenten eines Aufruf-Objekts angelegt.
Ein Aufruf-Objekt definiert außerdem eine Komponente arguments, die auf ein arguments-Objekt
verweist. Dieses Objekt stellt ein Feld dar:
arguments.length liefert die Anzahl aktueller Argumente, arguments[i] das i-te Argument.
Damit sind Funktionen für beliebige Argumentanzahl implementierbar:
JavaScript
Dirk Husung
Argument-Objekt (1)
function max()
{
var m = Number.NEGATIVE_INFINITY;
for (var i = 0; i < arguments.length; i++)
if (arguments[i] > m)
m = arguments[i];
return m;
}
arguments besitzt zusätzlich die Komponenten
callee (seit JavaScript 1.2) und caller (seit Navigator 4 mit geänderter Bedeutung):
arguments.callee verweist auf die aktuell ausgeführte Funktion. Damit kann eine anonyme Funktion rekursiv aufgerufen werden.
arguments.caller verweist auf das ArgumentObjekt der Funktion, die die aktuell ausgeführte aufgerufen hat, die aufrufende Funktion selbst ergibt
sich mit arguments.caller.callee.
5.3 Funktions-Objekt
Die length-Komponente eines Funktions-Objekts
liefert die Zahl definierter Parameter. Seit JavaScript 1.2 wird die Verwendung von arity statt
length empfohlen (mit gleicher Bedeutung).
JavaScript
Dirk Husung
Funktions-Objekt (1)
Achtung:In Navigator 4 sind arity und length
nur korrekt implementiert für JavaScript 1.2.
Seit Navigator 4 definiert ein Funktionsobjekt die
Methoden apply() und call(). Sie erlauben die
betreffenden Funktion aufzurufen, als sei sie Methode eines anderen Objekts:
f.apply (o, [1,2]); oder
f.call (o, 1, 2);
vergleichbar mit
o.m = f;
o.m(1,2);
delete o.m;
Benutzterdefinierte Komponenten eines Funktionsobjekts entsprechen static-Variablen aus C; ihr
Wert besteht über einen Funktionsaufruf hinaus.
uniqueInteger.counter = 0;
function uniqueInteger() {
return uniqueInteger.counter++;
}
JavaScript
Dirk Husung
Funktions-Objekt (1)
5.4 Prototyp-Objekt
Ein Funktionsobjekt besitzt eine prototype-Komponente, die auf ein vordefiniertes Prototyp-Objekt
verweist.
JavaScript
Dirk Husung
Prototyp-Objekt (2)
6 Objekte
• Objekte können erzeugt werden mit dem newOperator gefolgt von dem Aufruf einer Konstruktor-Funktion oder seit JavaScript 1.2 mit einer
Literalschreibweise.
• Auf Objekt-Komponenten wird mit dem „.“-Operator zugegriffen.
• Der Versuch, den Wert einer nicht definierten
Komponente zu lesen, liefert undefined.
• Eine Objekt-Komponente wird durch einfache
Wertzuweisung erzeugt (ohne var).
• Seit JavaScript 1.2 kann eine Objekt-Komponente mit delete gelöscht werden.
• Mit der for/in-Schleife können alle benutzerdefinierten Komponenten eines Objekts durchlaufen werden; einige vordefinierte Komponenten bleiben unberücksichtigt.
function listPropertyNames (obj) {
var names = "";
for (var i in obj)
names += i + "\n";
alert (names);
}
JavaScript
Dirk Husung
Objekte (1)
6.1 Konstruktor-Funktionen
Eine Konstruktor-Funktion dient der Initialisierung
eines neu erzeugten Objekts.
Sie wird durch den new-Operator aufgerufen und
erhält einen Verweis auf ein neu erzeugtes, leeres
Objekt als Wert der vordefinierten this-Variable.
Konstruktor-Funktionen liefern in aller Regel kein
Ergebnis. Gegebenenfalls ersetzt der Rückgabewert das zuvor angelegte Objekt als Ergebnis des
new-Operators.
6.2 Methoden
Eine Methode ist eine JavaScript-Funktion, deren
Aufruf an ein Objekt geknüpft ist. Über die vordefinierte this-Variable erhält die Methode Zugriff auf
dieses Objekt.
Einer Methode wird auf diese Weise stets ein zusätzliches implizites Argument übergeben.
JavaScript
Dirk Husung
Methoden (1)
Allerdings gilt: Eine Funktion speichert ihren Wert
in einer Variablen. Jede globale Variable wird als
Komponente eines globalen Objekts gespeichert.
Eine Funktion ist damit zunächst Methode dieses
globalen Objekts, this verweist innerhalb der Funktion auf das globale Objekt.
Der Unterschied liegt in der Intention: Methoden
wirken vorrangig auf das Objekt, an das ihr Aufruf
geknüpft ist, Funktionen sind eigenständig.
6.3 Prototyp-Objekt
Es ist ineffizient, mittels einer Konstruktor-Funktion
dieselben Methoden in jedem einzelnen Objekt einzutragen; eine Lösung bietet seit JavaScript 1.1
das Prototyp-Objekt.
Zu jeder Konstruktor-Funktion wird ein PrototypObjekt erzeugt und jedes mit einer KonstruktorFunktion initialisierte Objekt erbt alle Komponenten dieses Prototyp-Objekts; die Komponenten des
JavaScript
Dirk Husung
Prototyp-Objekt (1)
Prototyp-Objekts erscheinen unmittelbar als Komponenten des Objekts, auch wenn sie dem Prototyp-Objekt nach Erzeugung des Objekts hinzugefügt werden.
Damit eignet sich das Prototyp-Objekt ideal zur
Speicherung von Konstanten und Methoden.
Wird lesend auf eine Objekt-Komponente zugegriffen, so wird die Komponente zunächst in dem Objekt, dann in dessen Prototyp-Objekt gesucht.
Bei einer Wertzuweisung bleibt das Prototyp-Objekt
dagegen unberücksichtigt, es wird eine Komponente in dem betreffenden Objekt angelegt, die eine
gleichnamige Komponente des Prototyp-Objekts verdeckt.
In Navigator 4 wird zu jeder Funktion ein PrototypObjekt erzeugt, für den Fall, daß die Funktion als
Konstruktor-Funktion dient. Navigator 3 erzeugt ein
Prototyp-Objekt erst bei der tatsächlichen Verwendung einer Funktion als Konstruktor-Funktion.
JavaScript
Dirk Husung
Prototyp-Objekt (1)
6.4 Vererbung
Ein Prototyp-Objekt ist selbst ein Objekt, erzeugt
mittels new Object(), besitzt damit seinerseits
ein Prototyp-Objekt. Es ist möglich, eine Klasse zur
abgeleiteten Klasse einer Basisklasse zu erklären,
indem man die prototype-Komponente der abgeleiteten Klasse setzt:
Car.prototype = new Vehicle();
Damit verliert man jedoch die von JavaScript generierte constructor-Komponente des PrototypObjekts für Car, die auf die Konstruktor-Funktion
für Car verweist.
Die constructor-Komponente ist häufig hilfreich
zur Identifizierung eines Objekttyps.
Navigator 4 bietet die Möglichkeit, präziser zu erklären:
Car.prototype.__proto__ =
new Vehicle.prototype;
JavaScript
Dirk Husung
Vererbung (1)
6.5 Vergleich C++,Java – JavaScript
C++, Java
JavaScript
klassenbasierte Vererbung
Klasse
Instanzvariablen
Instanzmethode
prototypbasierte Vererbung
Konstruktor-Funktion, Prototyp
gesetzt in Konstruktor-Funktion
Komponente des Prototyp-Objekts
Komponente des KonstruktorFunktionsobjekts
Komponente des KonstruktorFunktionsobjekts
Klassenvariable
Klassenmethode
6.6 Einige Methoden
Jedes Objekt erbt die für Object definierten Komponenten.
toString(), angewandt auf ein Objekt o, liefert
einige interne Information über o, unter Navigator 4
für JavaScript 1.2 eine Literal-Darstellung des Objekts. Ab JavaScript 1.3 sollte toSource() stattdessen benutzt werden.
Wurde die originale toString()-Methode überdefiniert, kann sie mittels
JavaScript
Dirk Husung
Einige Methoden (2)
Object.prototype.toString.apply(o);
aufgerufen werden.
valueOf(), angewandt auf ein Objekt o, liefert
das Objekt selbst.
Unter Navigator 4 für JavaScript 1.2 können watch()
und unwatch() zu Debug-Zwecken genutzt werden: Im Fall einer Wertzuweisung an eine Objektkomponente wird durch den JavaScript-Interpreter
eine benutzerdefinierte Funktion aufgerufen:
function readOnlyHandler (
property, oldValue, newValue) {
if (newValue != oldValue)
alert (property + "is read only");
}
for (i in o) o.watch (i, readOnlyHandler);
JavaScript
Dirk Husung
Einige Methoden (3)
7 Felder
7.1 Array-Definition
Felder können auf unterschiedliche Weise erkärt
werden:
var a = new Array();
var a = new Array(1.2, "JavaScript");
var a = new Array(10);
Achtung:Navigator 4 legt im dritten Fall für JavaScript 1.2 statt eines 10-elementigen Feldes ein 1elementiges mit dem Wert 10 an.
Die Anzahl der Elemente eines Feldes kann jederzeit geändert werden durch Zuweisung von Feldelementen oder Setzen der length-Komponente.
Feldelemente können beliebigen Objekten hinzugefügt werden, allgemeinen Objekten fehlen jedoch
für Felder typische Komponenten (etwa length).
JavaScript
Dirk Husung
Array-Definition (1)
7.2 Array-Methoden
join() konvertiert alle Elemente eines Felder zu
Zeichenketten und hängt sie aneinander, standardmäßig getrennt durch Kommata.
var a = [1, 2, 3];
s = a.join();
// s == "1,2,3"
s = a.join(", "); // s == "1, 2, 3"
reverse() kehrt die Reihenfolge der Elemente eines Feldes um („in Place“).
var a = [1, 2, 3];
a.reverse();
// [3, 2, 1]
sort() sortiert die Elemente eines Feldes („in
Place“), standardmäßig in alphabetischer Reihenfolge.
var a = [33, 4, 1111, 222];
a.sort();
// [1111, 222, 33, 4]
a.sort(function(a,b) {
return a-b;}); // [4, 33, 222, 1111]
concat() (seit JavaScript 1.2) fügt die angegbenen Argumente an ein Feld an; Felder werden dabei durch ihre Elemente ersetzt (nicht rekursiv).
JavaScript
Dirk Husung
Array-Methoden (2)
var a = [1, 2, 3];
a.concat(4,[5,[6,7]]);
// [1,2,3,4,5,[6,7]]
slice() (seit JavaScript 1.2) liefert einen Teilbereich eines Feldes. Das erste Argument gibt den
Index des ersten Elements, das zweite Argument
verringert um 1 den Index des letzten Elements an.
Ein negatives Argument i wird als length-|i|
behandelt. Fehlt das zweite Argument, wird length
verwandt.
var a = [1, 2, 3, 4, 5];
a.slice(1,3);
// [2, 3];
toString() liefert grundsätzlich dasselbe wie
join(), unter Navigator 4 für JavaScript 1.2 jedoch eine Literaldarstellung. Ab JavaScript 1.3 sollte toSource() statt toString() benutzt werden.
JavaScript
Dirk Husung
Array-Methoden (3)
8 Reguläre Ausdrücke
8.1 Muster
Muster bestehen aus Zeichenfolgen, eingeschlossen zwischen zwei „/“.
In einem Muster steht ein einzelnes Zeichen für
sich selbst, mit Ausnahme folgender Sonderzeichen
Zeichen steht für
\f
\n
\r
\t
\v
\c
\ddd
\xdd
\cX
Seitenvorschub (form feed)
Zeilenende (new line)
Zeilenrücklauf (carriage return)
horizontaler Tabulator
vertikaler Tabulator
c selbst für c aus / \ . * + ? | ( ) [ ] { }
ASCII-Zeichen in oktaler Notation
ASCII-Zeichen in hexadezimaler Notation
Kontrollzeichen ^X
JavaScript
Dirk Husung
Muster (1)
Es lassen sich Zeichenklassen bilden:
Zeichen steht für
[. . . ]
[^. . . ]
.
\w
\W
\s
\S
\d
\D
[\b]
jedes Zeichen zwischen den Klammern
jedes Zeichen nicht zwischen den Klammern
[^\n ]
[a-zA-Z0-9]
[^a-zA-Z0-9]
[ \t\n\r\f\v]
[^ \t\n\r\f\v]
[0-9]
[^0-9]
Rückschritt (backspace), Sonderfall
Für vorangehende Teile von Mustern kann die Mindest- und Höchstzahl ihrer Wiederholung angegeben werden:
Zeichen Bedeutung
{n,m}
{n,}
{n}
?
+
*
mindestens n, höchstens m mal
mindestens n mal
genau n mal
{0,1}
{1,}
{0,}
JavaScript
Dirk Husung
Muster (2)
Es können Alternativen angegeben und Teile von
Mustern gruppiert werden; auf Gruppen kann Bezug genommen werden.
Zeichen Bedeutung
|
(. . . )
\n
entweder vorangehender oder nachfolgender Teilausdruck
Gruppierung
n-te Gruppe. Gruppennummern werden durch Abzählen ihrer öffnenden Klammern vergeben
Für das Auftreten von Mustern können bestimmte
Positionen vorgeschrieben werden:
Zeichen Bedeutung
^
$
\b
\B
Anfang einer Zeichenkette/Zeile
Ende einer Zeichenkette/Zeile
Wortgrenze
keine Wortgrenze
Schließlich können einem Muster Attribute angehängt werden:
Zeichen Bedeutung
i
g
Mustervergleich ohne Beachtung von Groß/Kleinschreibung
Behandlung aller passenden Teilzeichenketten
JavaScript
Dirk Husung
Muster (3)
8.2 String-Methoden
search() liefert den Index des ersten Zeichens
einer Zeichenkette, ab der ein gegebenes Muster
paßt, oder -1.
"JavaScript".search (/script/i);
replace() ersetzt in einer Zeichenkette den Text,
auf den ein gegbenes Muster paßt, durch einen gegebenen Ersetzungstext.
text.replace (/javascript/ig, "JavaScript");
match() liefert zu einem gegebenen Muster bei
nicht gesetztem g-Attribut ein Feld, dessen erste
Komponente den gesamten passenden Teil der Zeichenkette enthält und dessen folgende Komponenten die zu den Gruppen des Musters passenden
Teile enthalten.
Bei gesetztem g-Attribut liefert match() ein Feld
mit den Teilen einer Zeichenkette, die auf das gegebene Muster passen.
JavaScript
Dirk Husung
String-Methoden (1)
"1 plus 2 plus 3".match(/\d+/g)
// ["1", "2", "3"]
split() verwendet das gegebene Muster zur Trennung einer Zeichenkette und liefert ein Feld der resultierenden Teilzeichenketten.
"1,2, 3".split(/\s*,\s*/) // ["1", "2", "3"]
8.3 RegExp-Methoden
test() prüft, ob das Muster eines RegExp-Objektes auf eine gegebene Zeichenkette paßt.
var pattern = /java/i;
pattern.test("JavaScript");
exec() ähnlich der String-Methode match().
var pattern = /java/ig;
var text = "JavaScript oder Java?";
var result;
while ((result = pattern.exec(text)) != null)
alert ("gefunden: " + result[0]
+ " an Position " + result.index);
JavaScript
Dirk Husung
RegExp-Methoden (1)
Wird das g-Attribut angegeben, setzt exec() die
lastIndex-Komponente des RegExp-Objekts auf
das erste Zeichen hinter der Teilzeichenkette, auf
die das Muster paßt.
Ein erneuter Aufruf von exec() beginnt seine Suche ab der lastIndex-Position.
Wird keine passende Teilzeichenkette gefunden, so
wird lastIndex auf 0 zurückgesetzt.
JavaScript
Dirk Husung
RegExp-Methoden (2)
9 Windows und Frames
Das window-Objekt stellt das globale Objekt in
Client-seitigem JavaScript dar; es speichert alle globalen Variablen.
Daneben besitzt es eine Reihe vordefinierter Komponenten, die die Kontrolle des Browser-Fensters
erlauben:
Daten-Komponenten
Komponente Beschreibung
closed
true, wenn das Fenster geschlossen ist.
defaultstatus, status
Inhalt der Statuszeile.
document
Verweis auf das document-Objekt.
frames[]
Feld der Frames innerhalb des Fensters.
history
Verweis auf das history-Objekt.
innerHeight, innerWidth, outerHeight,
outerWidth
innere und äußere Fenstermaße (nicht bei
IE 4).
JavaScript
Dirk Husung
Windows und Frames (1)
Komponente Beschreibung
Verweis auf das location-Objekt, das die
URL des angezeigten Dokuments repräsentiert. Durch Wertzuweisung kann eine andere
Seite geladen werden.
locationbar, menubar, personalbar,
scollbars, statusbar, toolbar
legt die Sichtbarkeit der entsprechenden Teile
eines Navigator-Fensters fest (nicht bei IE 4).
name
Name des Fensters.
opener
Verweis auf das öffnende Fenster.
pageXOffset, pageYOffset
Ausmaß, um das der Fensterinhalt gescrollt ist
(nicht bei IE 4).
parent
Verweis auf das umschließende Fenster eines
Frame.
self
Verweis auf das window-Objekt selbst.
top
Verweis auf das oberste Fenster einer FrameHierarchie
window
Verweis auf das window-Objekt selbst.
location
Methoden
Methode Beschreibung
alert(), confirm(), prompt()
einfache vordefinierte Popup-Dialogboxen.
close() schließt ein Fenster.
JavaScript
Dirk Husung
Windows und Frames (2)
Methode Beschreibung
find(), home(), print(), stop()
Funktionalität der entsprechenden NavigatorButtons (nicht bei IE 4).
focus(), blur()
fordert den Tastatur-Focus für ein Fenster bzw. gibt
ihn frei (nicht bei IE 3).
moveBy(), moveTo()
verschiebt ein Fenster.
resizeBy, resizeTo()
ändert die Fenstergröße.
scrollBy, scrollTo()
scrollt den Fensterinhalt.
setInterval(), clearInterva()
bewirkt, daß eine Funktion in gegebenen Zeitabständen aufgerufen wird bzw. dies nicht länger erfolgt.
setTimeOut(), clearTimeOut()
bewirkt, daß eine Funktion nach einer gegebenen
Zeit aufgerufen wird bzw. dies nicht mehr erfolgt.
JavaScript
Dirk Husung
Windows und Frames (3)
9.1 Einfache Dialoge
var msg = "Grafiken in hoher Auflösung?"
if (confirm (msg))
location.replace ("hires.htm");
else
location.replace ("lowres.htm");
n = prompt ("Wie heißen Sie?");
document.write (
"<h1>Willkommen, " + n + "</h1>");
9.2 Statuszeile
<a href="sitemap.htm"
onMouseOver=
"status=’Go to Site Map’; return true;"
onMouseOut="status=’’;">
Site Map</a>
Der onMouseOver-Handler muß true liefern, um
die Standardaktion des Browsers zu unterdrücken,
die URL in der Statuszeile anzuzeigen.
Der Standardtext der Statuszeile kann durch Zuweisung an defaultStatus gesetzt werden.
JavaScript
Dirk Husung
Statuszeile (1)
9.3 Periodische Aktionen
Beispiel: Uhr in der Statuszeile
<HTML>
<HEAD>
<SCRIPT>
function displayTime()
{
var d = new Date();
var h = d.getHours();
var m = d.getMinutes();
if (m < 10) m = "0" + m;
var t = h + ’:’ + m;
defaultStatus = t;
setTimeout("displayTime()", 60000);
// 60000 ms = 1 Minute.
}
</SCRIPT>
</HEAD>
<BODY onLoad="displayTime();">
<!-- HTML Dokument -->
</BODY>
</HTML>
JavaScript
Dirk Husung
Periodische Aktionen (2)
9.4 navigator-Objekt
Die window.navigator-Komponente verweist auf
ein navigator-Objekt, das Informationen über den
verwendeten Browser liefert:
Komponente
Beschreibung
Name des Browsers.
Versionsnummer des Browsers.
typischerweise Informationen aus appName
und appVersion.
appCodeName Codename des Browsers, z.B. „Mozilla“.
platform
Rechnerplattform (neu in JavaScript 1.2).
language
Sprachversion
des
Browsers;
z.B.
„en“ für Englisch (neu in Navigator 4,
userLanguage,
systemLanguage in
IE 4).
appName
appVersion
userAgent
Anzeige aller Browser-Informationen:
var browser = "Browser-Informationen\n";
for (var item in navigator)
browser +=
item + ": " + navigator[item] + "\n";
alert (browser);
JavaScript
Dirk Husung
navigator-Objekt (1)
9.5 Fenster-Kontrolle
Öffnen und Schließen eines Fensters:
var win = window.open (
’javascript:"<h1>Hello</h1>"’, "hello",
"width=400,height=350,status,resizeable");
var id = window.setInterval("bounce()", 100);
function bounce() {
if (win.closed()) {
clearInterval (id);
return;
}
//...
win.moveTo (x,y);
}
win.close();
JavaScript
Dirk Husung
Fenster-Kontrolle (1)
10 Dokument-Objekt-Modell
Das document-Objekt stellt eine Reihe nützlicher
Komponenten bereit:
Komponente
Beschreibung
Farbe eines aktivierten Links (während des
Anklickens).
anchors[]
Feld von Anker-Objekten.
applets[]
Feld von Applet-Objekten.
bgColor
Hintergrundfarbe des Dokuments.
cookie
erlaubt JavaScript-Programmen Cookies
zu lesen und zu schreiben.
domain
erlaubt verschiedenen Web-Servern derselben Internet-Domäne, Sicherheitsbeschränkungen wechselseitig zu lockern.
embeds[]
Feld eingebetteter Objekte.
fgColor
Textfarbe des Dokuments.
forms[]
Feld von Formular-Elementen.
images[]
Feld von Grafiken.
lastModified Zeichenkette mit dem letzten Änderungsdatum.
linkColor
Farbe nicht besuchter Links.
links[]
Feld von Link-Objekten.
location
statt location sollte URL verwandt werden.
alinkColor
JavaScript
Dirk Husung
Dokument-Objekt-Modell (1)
Komponente
Beschreibung
URL des Dokuments, von dem aus das aktuelle Dokument aufgerufen wurde.
title
Text zwischen <title> und </title>.
URL
Zeichenkette mit der URL, von der das
aktuelle Dokument geladen wurde; vgl.
location.href.
vlinkColor Farbe besuchter Links.
referrer
Auf einfache Weise läßt sich erreichen, daß vor
einer untergeordneten HTML-Seite zuerst die auf
oberster Ebene angezeigt wird:
if (document.referrer == ""
|| document.referrer.indexOf (
"mysite.com") == -1)
window.location = "http://home.mysite.com";
Folgende Zeilen implementieren einen Zufalls-Link:
<a href="about:"
onMouseOver=
"status=’click me!’; return true;"
onMouseOut="status=’’"
onClick=
"this.href=document.links[Math.floor(
Math.random()*document.links.length)]">
Zufalls-Link</a>
JavaScript
Dirk Husung
Dokument-Objekt-Modell (2)
Die folgende Funktion listet die Links eines Dokuments:
function listlinks(d) {
var win = window.open("", "linklist",
"menubar,scrollbars,resizable,"
+"width=600,height=300");
for (var i = 0; i < d.links.length; i++) {
win.document.write(
’<A HREF="’ + d.links[i].href + ’">’)
win.document.write(d.links[i].href);
win.document.write("</A><BR>\n");
}
win.document.close();
}
JavaScript
Dirk Husung
Dokument-Objekt-Modell (3)
Das folgende Beispiel erstellt ein Verzeichnis aller
Ankerpunkte eines Dokuments:
listanchors.nav = true;
if (navigator.appName.indexOf(
"Microsoft") != -1)
listanchors.nav = false;
function listanchors(d) {
var win = window.open("", "navwin",
"menubar,scrollbars,resizable," +
"width=600,height=300");
win.document.writeln(
"<H1>Navigation Window:<BR>" +
document.title + "</H1>");
for(var i = 0; i < d.anchors.length; i++) {
var text;
var a = d.anchors[i];
if (listanchors.nav)
text = a.text;
// Navigator 4
else
text = a.innerText; // IE 4
if ((text == null) || (text == ’’))
text = a.name;
win.document.write(
’<A HREF="#’ + a.name + ’"’ +
’ onClick="opener.location.hash=\’’ +
a.name + ’\’; return false;">’);
win.document.write(text);
win.document.write(’</A><BR>\n’);
}
win.document.close();
}
JavaScript
Dirk Husung
Dokument-Objekt-Modell (4)
11 Formular-Elemente
HTML-Tag
Beschreibung; Ereignis
Druckknopf; onClick
Option; onClick
Eingabefeld; onChange
Daten, die zusammen mit einem Formular verschickt werden, unsichtbar für den Benutzer; kein Ereignis
<option>
Eintrag innerhalb eines selectElements; kein Ereignis
<input type=password> Paßwort-Eingabe; onChange
<input type=radio>
Alternative; onClick
<input type=reset>
Druckknopf zum Zurücksetzen
eines Formulars; onClick
<select>
Liste oder Drop-Down-Menü
zur Auswahl eines Eintrags;
onChange
<select multiple>
Liste zur Auswahl eines oder
mehrerer Einträge; onChange
<input type=submit>
Druckknopf zum Absenden eines Formulars; onClick
<input type=text>
einzeiliges Textfeld; onChange
<textarea>
mehrzeiliges Textfeld;
onChange
<input
<input
<input
<input
type=button>
type=checkbox>
type=file>
type=hidden>
JavaScript
Dirk Husung
Formular-Elemente (1)
11.1 Formularüberprüfung
function verify(f)
{
var msg;
var emptyFields = "";
var errors = "";
for(var i = 0; i < f.length; i++) {
var e = f.elements[i];
if ((e.type == "text"
|| e.type == "textarea")
&& !e.optional) {
if (e.value == null || e.value == ""
|| isblank (e.value)) {
emptyFields += "\n
" + e.name;
continue;
}
if (e.numeric
|| e.min != null || e.max != null) {
var v = parseFloat(e.value);
if (isNaN(v)
|| e.min != null && v < e.min
|| e.max != null && v > e.max) {
errors += "- The field " + e.name
+ " must be a number";
if (e.min != null)
errors +=
" that is greater than " + e.min;
if (e.max != null && e.min != null)
errors += " and less than " + e.max;
else if (e.max != null)
errors +=
" that is less than " + e.max;
errors += ".\n";
}
JavaScript
Dirk Husung
Formularüberprüfung (1)
}
}
}
if (!empty_fields && !errors) return true;
// ...
}
<form onSubmit="
this.firstname.optional = true;
this.phonenumber.optional = true;
this.zip.min = 0;
this.zip.max = 99999;
return verify(this);
">
First name:
<input type=text name="firstname">
Last name:
<input type=text name="lastname"><br>
Address:<br>
<textarea name="address" rows=4 colS=40>
</textarea><br>
Zip Code:
<input type=text name="zip"><br>
Phone Number:
<input type=text name="phonenumber"><br>
<input type=submit>
</form>
JavaScript
Dirk Husung
Formularüberprüfung (2)
12 Ereignisbehandlung
Ereignis
Eintreten
bei Abbruch
beim Verlassen eines Elements
bei erfolgter Änderung
beim Anklicken; Rückgabe von false, um
Standardaktion zu unterdrücken
onDblClick bei doppeltem Anklicken
onError
im Fehlerfall
onFocus
beim Aktivieren eines Elements
onKeyDown
bei gedrückter Taste; Rückgabe von false
zum Abbruch
onKeyPress bei erfolgtem Tastendruck; Rückgabe von
false zum Abbruch
onKeyUp
bei losgelassener Taste
onLoad
nach volständigem Laden einer Datei
onMouseDown bei gedrückter Maustaste; Rückgabe von
false zum Abbruch
onMouseMove bei weiterbewegter Maus
onMouseOut beim Verlassen des Elements mit der Maus
onMouseOver beim Überfahren des Elements mit der
Maus; Rückgabe von true, um die Anzeige
einer URL in der Statuszeile zu verhindern
onMouseUp
bei losgelassener Maustaste; Rückgabe von
false zum Abbruch
onAbort
onBlur
onChange
onClick
JavaScript
Dirk Husung
Ereignisbehandlung (1)
Ereignis
Eintreten
beim Zurücksetzen des Formulars; Rückgabe von false zum Abbruch
onRsize
beim Ändern der Fenstergröße
onSelect
beim Selektieren von Text
onSubmit
beim Absenden des Formulars; Rückgabe
von false zum Abbruch
onUnload
beim Verlassen der Datei
javascript: bei Verweisen
onReset
12.1 Eventhandler als JavaScriptKomponenten
Statt Eventhandler in HTML-Tags einzutragen
<input type="button" name="b1"
value="Press Me"
onClick="alert(’Thanks!’);">
können sie in JavaScript-Code gesetzt werden:
<input type="button" name="b1"
value="Press Me">
<script>
document.b1.onclick =
function () { alert(’Thanks!’); }
</script>
JavaScript
Dirk Husung
Eventhandler als JavaScript-Komponenten (2)
Vorsicht: In diesem Fall sind gegenüber oben
Button, Form und Document nicht Bestandteil der
Sichtbarkeitskette des Eventhandlers.
In JavaScript sind Eventhandler-Komponenten vollständig klein zu schreiben.
JavaScript
Dirk Husung
Eventhandler als JavaScript-Komponenten (3)
13 Cookies
13.1 Cookie-Beschränkungen
Cookies sind gedacht für die gelegentliche Speicherung kleiner Datenmengen.
• Ein Web-Browser braucht nicht mehr als insgesamt 300 Cookies zu speichern,
• er braucht nicht mehr als 20 Cookies je WebServer (nicht je Seite) zu speichern.
• er braucht nicht mehr als 4 KBytes je Cookie zu
speichern (für Schlüssel und Wert zusammen).
Ein Cookie-Wert darf kein Semikolon, Komma oder
Zwischenraumzeichen enthalten. Deshalb empfiehlt sich die Verwendung der JavaScript-Funktionen escape() und unescape() zur Ver- und Entschlüsselung eines Cookie-Wertes.
JavaScript
Dirk Husung
Cookie-Beschränkungen (1)
13.2 Speichern eines Cookies
var nextYear = new Date();
nextYear.setFullYear (
nextYear.getFullYear ()+1);
document.cookie = "version="
+ escape(document.lastModified)
+ ";expires=" + nextYear.toGMTString();
Neben dem Wert eine Cookies können folgende
Attribute gesetzt werden:
expires=Datum
standardmäßig bleiben Cookies nur bis zum Ende einer
Web-Browser-Sitzung erhalten.
path=Pfad
standardmäßig ist ein Cookie nur Web-Seiten in demselben Verzeichnis und dessen Unterverzeichnissen zugänglich. Durch Angabe eines verkürzten Pfades kann ein
Cookie auch übergeordneten Verzeichnissen und deren
Unterverzeichnissen zugänglich gemacht werden
domain=Domäne
standardmäßig ist ein Cookie nur für Web-Seiten desselben Servers zugänglich. Durch Angabe einer übergeordneten Domäne kann ein Cookie auch für Web-Seiten anderer Server zugänglich gemacht werden.
secure
Die Übertragung eines Cookies erfolgt nur über ein vergleichsweise sicheres Protokoll, z.B. HTTPS.
JavaScript
Dirk Husung
Speichern eines Cookies (2)
Ein Cookie kann gelöscht werden, indem er mit
demselben Schlüssel, einem beliebigen Wert und
einem bereits verstrichenen Verfallsdatum erneut
geschrieben wird.
13.3 Lesen eines Cookies
Beispiel:
var allcookies = document.cookie;
var key = "version="
var pos = allcookies.indexOf (key);
if (pos != -1) {
var start = pos + key.length;
var end = allcookies.indexOf (";", start);
if (end == -1)
end = allcookies.length;
var value = allcookies.substring (
start, end);
value = unescape (value);
if (value != document.lastModified)
alert ("Neue Version!");
}
JavaScript
Dirk Husung
Lesen eines Cookies (1)
15 Beispiele
15.1 Ereignisse
<html><head><title>Events</title>
<script language="JavaScript">
<!-if ( navigator.appName == ’Netscape’ &&
parseFloat(navigator.appVersion) >= 3
|| parseFloat(navigator.appVersion) >= 4)
version = "ro";
else
version = "noro";
if (version == "ro") {
Picture = new Array(2);
for(i = 0; i < 2; i++) {
Picture[i] = new Image();
Picture[i].src = "welcome"+i+".gif";
}
}
function picChange (name,number) {
if (version == "ro")
name.src = Picture[number].src;
}
//-->
</script>
</head><body>
<a href="event.htm"
onMouseOut="picChange(welcome,0)"
onMouseOver="picChange(welcome,1)">
<img name="welcome" src="welcome1.gif"
border=0 width="201" height="210"></a>
</body></html>
JavaScript
Dirk Husung
Ereignisse (1)
15.2 Cookies
<html><head><title>Cookies</title>
<script language="JavaScript">
<!-function readValue () {
var value = "";
if (document.cookie) {
var valueStart =
document.cookie.indexOf ("=") + 1;
var valueEnd =
document.cookie.indexOf (";");
if (valueEnd == -1)
valueEnd = document.cookie.length;
value = document.cookie.substring (
valueStart, valueEnd);
}
return Wert;
}
function writeValue (ident, value, lifetime) {
var now = new Date();
var timeout = new Date (
now.getTime() + lifetime);
document.cookie = ident + "=" + Wert
+ "; expires=" + timeout.toGMTString()
+ ";";
}
JavaScript
Dirk Husung
Cookies (2)
function access() {
var lifetime = 1000*60*60*24*365;
var count = readValue();
var counter = 0;
if (count != "")
counter = parseInt (count);
if (document.cookie)
counter = counter + 1;
else
counter = 1;
writeValue ("Counter", counter, lifetime);
alert ("Dies ist Ihr " + counter
+ ". Besuch auf dieser Seite!");
}
//-->
</script>
</head><body onLoad="access()">
Inhalt der Datei
</body></html>
JavaScript
Dirk Husung
Cookies (3)
15.3 Formulare
<html><head><title>Seitentitel</title>
<script language="JavaScript">
<!-function checkForm() {
if (document.Formular.User.value == "") {
alert("Bitte Ihren Namen eingeben!");
document.Formular.Name.focus();
return false;
}
if (document.Formular.Mail.value == "") {
alert("Bitte Ihre eMail-Adresse eingeben!");
document.Formular.Mail.focus();
return false;
}
if (document.Formular.Alter.value == "") {
alert("Bitte Ihr Alter eingeben!");
document.Formular.Alter.focus();
return false;
}
if (document.Formular.Mail.value.indexOf(’@’)
== -1) {
alert("Keine E-Mail-Adresse!");
document.Formular.Mail.focus();
return false;
}
JavaScript
Dirk Husung
Formulare (1)
with (document.Formular.Alter) {
var ok = true;
for(i=0; i < value.length; ++i)
if (
value.charAt(i) < "0"
|| value.charAt(i) > "9")
ok = false;
if(!ok) {
alert("Altersangabe keine Zahl!");
focus();
return false;
}
}
}
//-->
</script>
</head><body>
<form name="Formular"
action="mailto:[email protected]"
method=post
onSubmit="return checkForm()">
<pre>
Name:
<input type=text size=40 name="User">
E-Mail:
<input type=text size=40 name="Mail">
Alter:
<input type=text size=40 name="Alter">
Formular: <input type=submit value="Absenden">..
<input type=reset value="Loeschen">
</pre>
</form>
</body></html>
JavaScript
Dirk Husung
Formulare (2)