Clientspezifische Eigenschaften

Bisher sind im wesentlichen Eigenschaften der Sprache JavaScript betrachtet worden. Nun werden wir die Einsatzgebiete von JavaScript näher betrachten.

JavaScript im Browser

In diesem Abschnitt werden wir sehen, wie man JavaScript in HTML einbettet. Weiterhin werden die Objekte, die im Browser im Zusammenhang mit JavaScript verwendet werden können, betrachtet. Diese Objekte sind etwa wie folgt grob klassifizierbar:

In diese Betrachtung fließt auch das Document Object Modell (DOM) ein.

JavaScript in HTML einbetten

Mit dem script Tag lässt sich JavaScript Kode in HTML einbetten - so wie wir es bisher immer in den Beispielen gemacht haben. Nun betrachten wir:

Das Tag SCRIPT

Das Tag  script ist eine Erweiterung von HTML, das beliebig viele JavaScript Anweisungen umschließt.

<SCRIPT>
     JavaScript statements...
</SCRIPT>

In HTML Dokumenten können beliebig viele solcher Tags stehen.

JavaScript Version

Die unterschiedlichen Browser unterstützen in Abhängigkeit ihrer Version eine spezifische JavaScript Version. Jede JavaScript Version hat besondere Eigenschaften, die in Vorgängerversionen nicht unterstützt sind.

Mit dem Attribut language des Tags script kann man die Version von JavaScript angeben.

Ein Browser ignoriert den Kode, der innerhalb eines script  Tags steht, wenn er die JavaScript Version, die mit dem Attribut language angegeben ist nicht unterstützt.

Das folgende Kodefragment  zeigt, wie man vorgeht, wenn man eine eigene JavaScript Funktion (hier doClick) realisieren muss, die in jeder Browserversion funktionieren muss:

<SCRIPT LANGUAGE="JavaScript">
// Define 1.0-compatible functions such as doClick() here
</SCRIPT>

<SCRIPT LANGUAGE="JavaScript1.1">
// Redefine those functions using 1.1 features
// Also define 1.1-only functions
</SCRIPT>

<SCRIPT LANGUAGE="JavaScript1.2">
// Redefine those functions using 1.2 features
// Also define 1.2-only functions
</SCRIPT>

<FORM ...>
  <INPUT TYPE="button" onClick="doClick(this)" ...>
   ...
</FORM>

Wenn man nun eine Funktion innerhalb eines mit language Attribut versehenes Tags definiert, kann es zu Problemen kommen, wie folgendes Beispiel zeigt:

Beispiel 7.1-1

Das Laufzeitproblem kommt daher, dass der JavaScript Kode überlesen wird, da z.Z. die Version 2.3 nicht existiert und somit die Funktion test() nicht definiert ist.

Einige Browser unterstützen überhaupt kein JavaScript. Um HTML Kode mit eingebettetem JavaScript allgemein verwenden zu können, also auch wenn der Browser JavaScript nicht kennt, kann man folgenden Konstruktion verwenden:

Der JavaScript Kode ist in HTML Kommentar Tags (<!--   -->) einzubetten, wobei die letzte Kommentarzeile mit // (JavaScript Kommentar) anfangen muss .

<SCRIPT>
<!-- Begin to hide script contens from old browsers
</SCRIPT>
     .... JavaScript statements
// End the hiding here -->
<SCRIPT>
// Redefine those functions using 1.1 features
// Also define 1.1-only functions
</SCRIPT>

Browser überlesen normalerweise nicht bekannte Tags. Deshalb wird ein nicht JavaScriptfähiger Browser das script Tag überlesen, den Kommentar ebenfalls. JavaScriptfähige Browser interpretieren das script Tag richtig, sie überlesen die Zeile mit //.

Beispiel 7.1-2

JavaScript Bibliotheken

Ein weiteres Attribut des script Tag ist src. Damit kann man eine Quelle von JavaScript Kode angeben.

<SCRIPT src="common.js"
</SCRIPT>

Damit sind alle Funktionen, die in der Datei "common.js" definiert sind verwendbar.

Neben der Angabe des Dateinamens, wie oben, sind allgemeine URLs (http, ftp, file) verwendbar, zB.

<SCRIPT src="http://www.fbi.h-da.de/common.js"
</SCRIPT>

Solche externen Dateien dürfen nur JavaScript Kode enthalten (HTML Kode also nicht!). Wird eine solche Datei über eine http URL angesprochen, so muss der Server den richtigen MIME Typ setzen.   

Dies wird normalerweise durch den Eintrag

  type=application/x-javascript   exts=js

in der Konfigurationsdatei des Web Servers "mime.types" ausgedrückt. Damit wird der Web Server veranlasst, die js Datei im http Header zurück zu senden.

JavaScript Ausdrücke als HTML Attributwerte

Mit JavaScript Entitäten (entities) können die Werte von HTML Attributen angegeben werden. Dazu wird ein JavaScript Ausdruck in "&{" und 2};" eingeschlossen.

(Analog zu "&GT;" als Ersatzdarstellung für ">" in HTML)

Beispiel 7.1-3

Das NOSCRIPT Tag

Wenn ein Browser JavaScript  nicht unterstützt kann man den alternativen Text mit dem NOSCRIPT Tag angeben.

<NOSCRIPT>
   This page uses JavaScript, so you need to get Netscape
   Navigator 2.0 or later! <BR>
   <A HREF="http://home.netscape.com/comprod/mirror/index.html">
   If you are using Navigator 2.0 or later, and you see this message,
   you should enable JavaScript by on the Advanced page of the
   Preferences dialog box.
</NOSCRIPT>


Übung 7.1-1

Legen Sie eine JavaScript Bibliothek "Uebungen.js" an, in der Sie die folgenden Funktionen definieren:

Entwerfen Sie eine HTML Seite zum Testen (Eingabe von Testwerten mit Ausgabe der Ergebnisse) der Funktionen der Bibliothek "Uebungen.js"


window Objekt

Das window Objekt ist die Stelle, in die eine HTML Seite geladen wird. Dieses Objekt ist stets als Basis für die JavaScript Programmierung (mit Ablaufumgebung Browser) vorhanden.

Die Methoden, die von allen gängigen Browsern unterstützt werden sind:

Das folgende Beispiel verwendet open() und close() zum Öffnen und Schliessen eines Fensters, bei dem die URL als Parameter angegeben wird.

Beispiel 7.1-4

In der Funktion wird durch open() ein Fenster geöffnet. Normalerweise müsste man schreiben window.open(). Das window Objekt stellt hier eine Ausnahme dar. Besser ist es aber, trotzdem die Sysntax einzuhalen: "Objekt.Methode".

Das Schliessen eines Fensters geschieht analog, man verwendet die Methode close().

Im folgenden Beispiel wird ein Fenster durch open geöffnet, dabei werden beim Aufruf Eigenschaften definiert, die das neue Fenster haben soll.

Beispiel 7.1-5

Der erste Parameter von open definiert dieURL, der zweite den Namen des Fensters, der dritte die Eigenschaften. Der Name des Fensters ("anzeigeZenster") ist dann zu verwenden, wenn man von einem anderen Fenster auf dieses Fenster zugreifen will; dann ist ja die Variable "fenster" nicht bekannt, wohl aber der Name.

So kann z.B. durch folgendes HTML Fragment auf das neue Fenster zugegriffen werden:

<a href="andereSeite.htm" target="anzeigeFenster" hier klickeb>
</a>

Die folgende Tabelle listet die Eigenschaften des window Objektes auf (JavaScript 1.0, 1.1):

Eigenschaft Bedeutung
toolbar Werkzeukleiste (ein/aus)
location Textfeld der URL (ein/aus)
directories Buttonleiste (ein/aus)
status Statusleiste (ein/aus)
menubar Menüleiste (ein/aus)
scrollbars Rollbalken (ein/aus)
resizable Größe abänderbar
width Breite (in Pixel)
height Höhe in (Pixel)

Weitere Eigenschaften sind der Referenz des Herstellers zu entnehmen (im IE kann man z.B. in der neueren Version, die Position auf dem Bildschirm angeben, auf der das Fenster beim Start platziert werden soll).

Die Methode alert() ist eine window Methode zur Erzeugung eines Hinweisfensters. Diese Methode ist bereits ausgiebig mit Beispielen illustriert.

Eine weitere window Methode ist confirm() zur Abfrage einer Bestätigung des Benutzers. Die Methode erzeugt ein Auswahlfenster mit zwei Schaltflächen: "OK" (dann liefert confirm() als Ergebnis true) und "Abbrechen" (dann liefert confirm() als Ergebnis false).

Die Methode prompt() fordert den Anwender auf, eine Eingabe in ein Textfeld des erzeugten Fensters zu machen. Der erste Parameter ist der Text, der dem Anwender sagt, was er eingeben soll, der zweite ist der Defaulttext, der im Textfeld erscheint. Zwei Schaltflächen "OK" (dann liefert promt() als Ergebnis true) und "Abbrechen" (dann liefert promt() als Ergebnis false) steuern das Benutzerverhalten.

Diese drei Methoden von window sind modal, das bedeutet, dass diese Fenster stets geschlossen werden müssen, bevor man das initiierende Fenster wieder aktivieren kann.

Beispiel 7.1-6

Frames als Bestandteile von Fenstern  werden wird gesondert behandeln, da dies eine Möglichkeit ist, besondere Interaktionen zu realisieren.

document Objekt

Das document Objekt ist das zentrale Element der HTML Seitenerstellung. In den Beispielen wurde geschrieben: document.write(..). Dabei wurde die Methode "write" des document Objektes angesprochen.

Auf das document Objekt kann man von allen Stellen einer HTML Seite zugreifen.

Die Erstellung von HTML Seiten war vor einigen Jahren nur statisch möglich, d.h. eine Seite, die abgerufen wurde, musste vorher "geschrieben" werden. Mit CGI Programmen war es erstmals möglich zur Laufzeit HTML Dokumente zu erzeugen, etwa um Daten aus einer Datenbank auf einer HTML Seite anzuzeigen.

Mit JavaScript kann man HTML Dokumente dynamisch erzeugen, ohne auf einen Server  zugreifen zu müssen.

Dies wird mit dem document Objekt realisiert.

Beispiel 7.1-7

Bevor ein Dokument mittels document.write() beschrieben werden kann, ist es zu öffnen (document.open(). Durch  fenster.document.write() wird nicht in das aktuelle Dokument geschrieben, sondern in das Objekt "fenster".  Durch den Methodenaufruf fenster.document.close() wird das Dokument geschlossen und der Browser erkennt, das die Ausgabe beendet ist.

Zu beachten:

Die Methoden open () und close() gibt es für window und document Objekte. document.close() sollte stets verwendet werden, auch wenn anschließend irgendwann ein window.close() das Fenster schliesst. Erst durch document.close() wird der Ausgabestrom auf das Dokument abgeschlossen.

location Objekt

Das location Objekt wird vom Browser verwendet, um Informationen über das darzustellende Dokument zu speichern. Die Informationen werden bei mit dem Dokument vom Web Server übertragen.

Das location Objekt hat folgende Eigenschaften:

Eigenschaft Bedeutung
protocoll verwendetes Protokololl
port Port, über den die Verbindung "abgewickelt" wird (Default 80)
hostname Web Server
search Suchstring in Adresse
pathname Pfad- und Dateiname der Seite
href Referenz
hash Anker

Eine Internetadresse setzt sich aus den folgenden Bestandteilen zusammen, die das location Objekt einzeln als Eigenschaften zur Verfügung stellt:

protocol // hostname : port pathname search hash

http//fbi.fh-farmstadt.de:80/~schuette#a1

Der Suchstring wird oft in CGI-Skripten verwendet, um Daten zwischen Seite und Webserver auszutauschen.

Beispiel 7.1-8

Das location Objekt kann verwendet werden, um in einem JavaScript Programm eine neue Seite zu laden, in dem man der Eigenschaft href einen neuen Wert zuweist.

Beispiel 7.1-9

history Objekt

Die Historie der zuletzt besuchten Seiten im history Objekt abgelegt. Die Eigenschaft length gibt die Anzahl der Elemente an.

Die Methoden

dienen zum Wandern durch die besuchten Seiten. go(-n) gibt an, dass man sich n Schritte rückwärts bewegt;

history.back() und history.forward() sind selbsterklärend.

Damit lassen sich selbst Schaltflächen zum Navigieren realisieren, z.B

<a href="javascript:history.back(1)">
<img border=0 src="Bilder/LeftArrow.gif" width="31" height="23">
</a>
 

Durch diese Methoden kann man die zuletzt besuchten Seiten ansprechen, die eigentliche Adresse ist aus Sicherheitsgründen nicht abfragbar. (Man könnte ja sonst Benutzereingaben bei der Methode GET zurückverfolgen)

navigator Objekt

Die Informationen, die über den Browser selbst bekannt sind, sind über das navigator Objekt abrufbar. Folgende Eigenschaften gehören zum navigator Objekt:

Beispiel 7.1-10

Achtung:

Diese Information sollte nicht verwendet werden, um in Abhängigkeit davon Eigenschaften der jeweiligen Browser auszunutzen - Opera meldet sich hierbei als Netscape, obwohl er nicht alle Netscapefunktionen unterstützt.

Document Object Model

JavaScript bahandelt die Elemente einer HTML Seite als Objekte mit Eigenschaften und Methoden. Die einzelnen Objekte sind dabei in eine hierarchische Beziehung gesetzt, aus sie angesprochen werden. Dazu wurde das "Document Object Modell" (kurz DOM) entwickelt. DOM ordnet jedem Objekt einen Platz in der Hierarchie zu und legt damit fest, wie die einzelnen Objekte referenziert werden.

Das Objektmodell hat sich im Laufe der Zeit weiterentwickelt. Zunächst wird DOM Level 0 betrachtet. Dies ist das Objektmodell, dass von allen Browsern unterstützt wird. Dann wird das vom W3C vorgeschlagene DOM Level 2 diskutiert.

DOM Level 0

HTML Dokumente sind in diesem Modell recht einfach aufgebaut. Dokumente bestehen aus Bildern (images) Links und Formularen. Formulare wiederum bestehen aus den einzelnen Formularelementen.

Am Beispiel eines einfachen HTML Dokumentes sehen wird die DOM Level0 Hierarchie.

<html>

<head>
    <title>Titel der Seite</titel>
<head>

<body>
    <p>
        <img src="bild1.gif" width="100" height="200">
    </p>
    <p>
        <a href="www.fhd.de">FHD</a>
    </p>
    <form name="f1">
        <input type="text" name="eingabe" value="abc">
        <input type="button" value="send" onClick="...">
    </form>
</body>

</html>

Dieses Dokument hat folgende Objekthierarchie:

 

Man erkennt, dass es einige Arrays gibt, über die man auf die HTML Objekte zugreifen kann. Für Bilder, Links und Formulare gibt es jeweils ein Array, bei dem die Auftreten der Objekte in der Reihenfolge innerhalb des HTML Dokumentes durchnummeriert werden.

So ist das Bild im Dokument als

document.images[0]

ansprechbar; der Link als

document.links[0] und die Formularelemente mit

document.forms[0].element[0] (bzw ..[1])

Eine Eigenschaft des Textfeldes könnte demzufolge in JavaScript durch

document.forms[0].element[0].value = "neuer Wert"

geändert werden.

Der Zugriff über den Index ist nicht immer sinnvoll. Man kann die Objekte auch über ihre Namen ansprechen, im Beispiel etwa:

document.f1.element[0].value = "neuer Wert" oder
document.f1.eingabe.value = "neuer Wert"

DOM Level 2

In DOM  Level 2 sieht die Objekthierarchie der Beispielseite wie folgt aus:

Im Beispiel sieht man, dass im DOM Level2 alle HTML Tags als Objekte abgebildet sind. Jeder Position des Objektbaums stellt einen Knoten (node) dar. Rechteckige "Knoten" sind Elemente (elements), die abgerundeten Knoten sind Textobjekte (textnodes), die den Inhalt eines HTML Tags repräsentieren. Jedem Element könne die Attribute des HTML Tags zugeordnet werden (wie width, value, ...).

Im Gegensatz zu DOM Level 1 kann man hier nicht nur Elemente ansprechen, sondern die Struktur des Objektbaums dynamisch verändern.

Ziel von DOM Level 2 ist neben der erweiterten Möglichkeit der Scriptprogrammierung, die Vereinheitlichung für browserunabhängige Darstellung.

Somit kann man auf deas selber HTML Dokument in zwei Art und Weisen zugreifen: DOM0 und DOM2 like. Das Document Objektmodel stellt eine Schnittstelle zum Zugriff auf die HTML Objekte dar.

Nach dem Überblick wird der Zugriff auf den DOM2 Objektbaum aus JavaScript Sicht in einem eigenen Teil verdeutlicht.

Eventhandling

JavaScript Anwendungen, die in Browsern ablaufen, sind ereignisgesteuert. Ereignisse sind Aktionen, die normalerweise wegen Benutzereingriffen stattfinden.

Beispiele sind:

Damit ein Skript auf solche Ereignisse reagieren kann, sind so genannte "Eventhandler" zu definieren, wie "onChange" oder "onClick".

In diesem Teil besprechen wir:

Das Reagieren auf Benutzereingaben, wird wie folgt dargestellt, behandelt:

Die Benutzereingabe erzeugt ein Ereignis. Ist ein Eventhandler dafür definiert, so wird er aktiv, ansonsten wird mit der Standardaktion des Browsers reagiert (z.B. wenn ein Link angeklickt wird).

Die folgende Tabelle zeigt die unterstützten Eventhandler (Ausschnitt von Netscape, nicht jedes Event wird in allen Browsern unterstützt):

Ereignis anwendbar auf Tritt ein, wenn Eventhandler
Abort Bilder Benutzer bricht das Laden eines Bildes ab onAbort
Blur Fenster und Formularelemente der Fokus wird von einem Fenster oder Formelement weg genommen onBlur
Change Textfelder, Textbereiche, Auswahllisten Wert des Elements wird geändert onChange
Click Schaltflächen, Checkboxen auf Element wird per Klick zugegriffen onClick
DragDrop Fenster Benutzer zieht ein Element (z.B. eine Datei) in ein Browser Fenster (per Drag and Drop) onDragDrop
Error Bilder, Fenster Fehler beim Laden eines Dokumentes onError
Focus Fenster und Formularelemente der Fokus wird auf ein Fenster oder Formelement gesetzt onFocus
KeyDown Dokument, Bilder, Links, Textbereiche Benutzer drückt Taste onKeyDown
KeyPress Dokument, Bilder, Links, Textbereiche Benutzer drückt Taste  und hält sie fest onKeyPress
KeyUp Dokument, Bilder, Links, Textbereiche Benutzer läst gedrückte wieder Taste  los onKeyUp
Load Dokumenten Körper (body) eine Seite wird in den Browser geladen onLoad
MouseDown Dokument, Schaltflächen, Links Benutzer drückt eine Maustaste onMouseDown
MouseMove   Cursor wird bewegt onMouseMove
MouseOut Bereiche, Links Imagemap oder Link wird verlassen onMouseOut
MouseOver Links Maus wird über Link gehalten onMouseOver
MouseUp Dokument, Schaltflächen, Links gehaltene Maustaste wird los gelassen onMouseUp
Move Fenster Fenster wird bewegt onMove
Reset Formular Resert Button wird gedrückt onReset
Resize Fenster ein Fenster wird in der Größe geändert onResize
Select Textfelder, Textbereiche das Textelement wird ausgewält onSelect
Submit Formular Submit Button wird gedrückt onSubmit
Unload Dokument Körper Benutzer verlässt die Seite onUpload

Definition eines Eventhandler

Ein Eventhandler ist eine JavaScript Funktion (oder eine Sequenz von JavaScript Anweisungen), die ausgeführt wird, wenn das zugehörige Ereignis bezüglich eines HTML Tags eintritt.

Man erzeugt einen Eventhandler für ein HTML Tag indem man dem Attribut mit dem Namen des Eventhandlers als Wert die Eventhandler Funktion zuordnet.

Allgemein:

    <TAG eventHandler="JavaScript Code">

wobei TAG ein HTML Tag ist, eventHandler einer der o.a. Eventhandler ist.

Zunächst ein eher für die Praxis untaugliches Beispiel:

Beispiel 7.2-1

Achtung:

In JavaScript <= 1.1 müssen die Namen der Eventhandler in Kleinbuchstaben geschrieben werden, also z.B. "onmouseover".

Betrachten wir folgendes Beispiel:

    <INPUT TYPE="button" VALUE="Calculate" onClick="compute(this.form)">

Dann ist in der Funktion compute this.form das aktuelle Formular, in dem sich die Schaltfläche befindet (this alleine würde das Objekt "button" referenzieren).

Wenn nun ein Eventhandler erzeugt wird, so bekommt das Objekt (im Beispiel oben die Schaltfläche) eine Eigenschaft, die den Namen des Eventhandlers hat (im Beispiel "onClick"); diese Eigenschaft hat als Wert den angegebenen JavaScript Kode.

Ein etwas größeres Beispiel ist nachfolgend aufgeführt:

Beispiel 7.2-2

In diesem Beispiel ist ein Eventhandler "onClick" erzeugt, der die im Header definierte JavaScript Funktion "compute" aufruft.

In größeren Anwendungen kann es sinnvoll sein, Eventhandler für das selbe Objekt zu redefinieren. Dies wird dadurch zum Ausdruck gebracht, dass man der Eigenschaft (Eventhandler) explizite einen neuen Wert gibt.

Achtung:

Dies ist mit JavaScript1.0 nicht möglich.

Beispiel 7.2-3

Nun wird für die wichtigsten Eventhandler ein Beispiel demonstriert.

onFokus und onBlur im Zusammenhang mit Formularobjekten

Die Ereignisse onFocus und onBlur treten in Verbindung mit Formularobjekten auf. Wenn mehrere Formularobjekte auf einer Seite dargestellt werden, so eindeutig sein, auf welches Objekt sich eine Benutzereingabe bezieht.

Alle Ereignisse beziehen sich immer auf das Objekt, das den Fokus hat. Dies erkennt man bei Textfeldern, am blinkenden Cursor. Die anderen Objekte erhalten den Fokus, wenn man mit der Maus in ihren Einflussbereich kommt.

Das Ereignis onFocus tritt ein, wenn ein Objekt den Fokus erhält; onBlur tritt ein, wenn der Fokus von dem Objekt entfernt wird.

Das folgende Beispiel verwendet diese Eventhandler, um erklärenden Text in die Statuszeile zu schreiben.

Beispiel 7.2-4

Wenn man versucht, ein anstelle die Statuszeile ein Popup Fenster zur Ausgabe zu verwenden, so hat man eine Unendlichschleife (nicht in allen Browsern) programmiert!

Die Methode alert verursacht, dass das Formular für eine gewisse Zeit nicht mehr fokussiert wird. Das Popup sperrt all Aktivitäten in dem Browser Fenster, bis das Popup geschlossen wird. Das Schließen bewirkt, dass der Fokus zurückkehrt zur ursprünglichen Stelle - Schleife!!!

Beispiel 7.2-5 Unendlichschleife!

onChange, onSelect

Mit diesen beiden Eventhandlern kann man feststellen, ob sich an einer Benutzereingabe etwas geändert (onChange) oder ob ein Objekt selektiert wurde (onSelect) hat.

Beispiel 7.2-6

onSubmit, onReset

Die Ereignisse Submit und Reset spielen eine Rolle bei der Übertragung von Formulardaten vom Client zum Web Server. Submit tritt ein, wenn der Submit-Knopf gedrückt wird. D.h. man kann mit diesem Eventhandler prüfen, ob Daten im Formular korrekt sind, bevor die Daten Übertragen werden.

Reset tritt ein bei Auslösen des Reset Knopfes und dient normalerweise zum Zurücksetzen der vom Benutzer ausgefüllten Formulardaten.

Wir behandeln das in einem der nächsten Abschnitte.

onLoad, onUnload

Wenn eine Seite vom Web Server geladen wird, wird das Ereignis Load erzeugt. Wird die Seite verlassen, so tritt das Ereignis Unload ein. Beide Ereignisse beziehen sich auf das Window Objekt. Verwendet werdne sie im Tag <BODY>.

Das folgende Beispiel zeigt, wie man einfach Begrüßungen mittels Eventhandlern programmieren kann.

Beispiel 7.2-7

Man sollte Alerts natürlich zum Begrüßen nicht verwenden. Normalerweise wird onLoad verwendet, um Animationen beim Laden einer Seite zu starten.

onFocus und onBlur im Zusammenhang mit Fenstern

Die Ereignisse Focus und Blur treten auch im Zusammenhang mit Fenstern auf. Umfasst die Anwendung mehrere Fenster, so spielen diese Ereignisse eine Rolle, wenn man Fenster wechselt: das aktive Fenster, das Verlassen wird löst das Ereignis Blur aus, das neue aktive Fenster das Ereignis Focus.

Das folgende Beispiel verwendet den Eventhandler onBlur, um eine Fenster automatisch zu schließen, wenn es inaktiv wird.

Beispiel 7.2-8

Im nächsten Beispiel wird die Hintergrundfarbe geändert, wenn ein Fenster nicht mehr aktiv ist.

Beispiel 7.2-9

onError in Bezug auf das window Objekt

Der Eventhandler onError kann verwendet werden, um Fehler, die auftreten, zu unterdrücken. Unglücklicherweise wird dies nicht von allen Browsern unterstützt.

onError  kann nicht im Rahmen eines HTML Tag plaziert werden, man muss ihn durch JavaScript Kode erzeugen.

Beispiel 7.2-10

onMouseOver, onMouseOut

MouseOver und MousOut sind Ereignisse, die z.B. verwendet werden können, um anstelle des Standardtextes in der Statusleiste (URL) einen eigenen Text anzugeben.

Beispiel 7.2-11

Im JavaScript Kode des Eventhandlers steht

    return true;

Dies ist erforderlich, da ansonsten die Standard Statuszeile nicht unterdrückt wird.

Wir werden auf die Rückgabe von Eventhandlern später noch eingehen.

onAbort, onError, onLoad in Bezug auf Bilder

Das Laden von Bildern ist eine häufig mit Problemen behaftete Angelegenheit, weil oftmals die Bandbreite des Internet nicht ausreicht, um größere Bilder fehlerfrei zu laden.

Mit den Eventhändlern onAbort, onError und onLoad kann man das Laden von Bildern kontrollieren.

Wurde ein Bild erfolgreich geladen und dargestellt, so wird vom Browser das Ereignis Load erzeugt.

Achtung:

Load tritt erst ein, wenn das Bild tatsächlich dargestellt ist, d.h. wird das Bild nur geladen (Image Objekt), wird Load nicht ausgelöst.

Das Ereignis Abort tritt ein, wenn der Ladevorgang abgebrochen wurde; das Ereignis Error wird in Felerfällen, z.B. wenn die Bilddatei nicht gefunden wird, ausgelöst.

Beispiel 7.2-12

Achtung

Bei animierten Gif's wird das Ereignis Load bei jedem Durchlauf erzeugt!

Beispiel 7.2-13   Achtung: schwer abzubrechen! (Taskmanager)

Rückgabewerte in Eventhandlern

Der Eventhandler onSubmit dient zur Übermittlung von Formulardaten zum Web Server. Bevor die Daten gesendet werden, sollte stets geprüft werden, ob die Daten korrekt sind.  Das Ereignis Submit wird durch drücken der Submit Schaltfläche ausgelöst.

Benötigt wird also eine Möglichkeit, um zu Verhindern, dass Daten gesendet werden. Dazu liefern die Eventhandler einen Wahrheitswert zurück. Damit lassen sich die Standardaktionen des Browsers als Reaktion auf das eingetretene Ereignis ändern.

Durch

    onSubmit="return false;"

wird das Formular nie versendet.

Die normale Vorgehensweise zum Prüfen von Formularinhalten ist, eine Funktion (z.B. test()) zu schreiben, die das Ergebnis des Prüfens als Rückgabewert liefert. Damit ist der Eventhandler dann wie folgt aufzurufen:

    onSubmit="return test();"

Achtung:

In Formularen muss bei submit stets return ... stehen, es reicht nicht aus, die Funktion (test) alleine aufzurufen, auch wenn sie einen Wahrheitswert liefert.

Das folgende Beispiel zeigt, wie man verhindern kann, dass die Eingaben eines Benutzers gelöscht wird, wenn der Reset Knopf gedrückt wird.

Beispiel 7.2-14  

Mit Rückgabewerten kann man die Standartaktion des Browsers unterbinden.

Mit

    onMouseOver="return true;"

kann man verhindern, dass bei einem Link die URL im Status angezeigt wird.

Achtung:

In der Anfangsphase der Entwicklung von JavaScript konnte man sich nicht auf ein einheitliches Vorgehen einigen - bei einigen Eventhändlern muss man return true, bei anderen return false schreiben, um die Standardaktion zu unterbinden. Dies ist aus Kompatibilitätsgründen bis heute so geblieben. Die folgende Tabelle definiert das Verhalten:

Eventhandler Abbruch durch
onClick return false
onError return true
onMouseOver return true
onReset return false
onSubmit return false

Übung 7.2.1

Verdeutlichen Sie sich die einzelnen gezeigten Programm. Ändern Sie das Verhalten bei Eintreten eines Ereignisses ab, indem Sie jeweils eigene Funktionen definieren, die als Reaktion verwendet werden.


Ereignisse durch Aufruf von Methoden auslösen

Normalerweise werden Ereignisse als Folge von Benutzeraktionen ausgelöst. Man kann aber auch Ereignisse auch erzeugen, in dem man die Methode des Eventhandlers aufruft.

Methode click()

Eine Checkbox

Text

kennt die Methode click(), mit der man einen Mausklick auf das Objekt simulieren kann. Ein Aufruf dieser Methode aus einem Programm kann also den Wert des Kontrollfeldes ändern.

Beispiel 7.2-15  

Methoden focus(), select() und blur()

Diese Methoden sind geeignet, um Benutzeroberflächen auf Basis von Formularen zu erzeugen, bei denen auf Fehleingaben in Feldern hingewiesen wird und das fehlerhafte Feld fokussiert wird.

Die Verwendung von focus() und select() zeigt folgendes Beispiel.

Beispiel 7.2-16  

Die Methode blur() entfernt den Fokus von einem Objekt.

Im Zusammenhang mit Fenstern ist die Methode focus()verwendbar, um z.B. ein Fenster in den Vordergrund zu bringen, wenn ein wichtiges Ereignis statt findet. In JavaScrpt 1.0 und 1.1 existiert hierzu keine eigene Methode. In vielen Umgebungen kommt das aktive Fenster automatisch in den Vordergrund (funktioniert nicht in Unix). Das kann man sich zu Nutze machen, um ein Hinweisfenster zu realisieren.

Beispiel 7.2-17  

Die Methoden submit() und reset()

Diese  Methoden eines Formularobjektes dienen zum Senden und Zurücksetzen eines Formulars. Mit submit kann man ein Formular versenden, ohne dass der Benutzer einen Button drückt. reset kann in Programmen verwendet werden, um Formulare zurück zu setzen.

Die bisher betrachteten Ereignisse und Eventhandler sind in den Versionen JavaScript 1.0 und 1.1 verfügbar. Nun wird auf spezielle Erweiterungen innerhalb des Netscape Communicator >= 4.x und des Microsoft Internet Explorer >=4.x eingegangen.

Ereignisse in Netscape Communicator >= 4.x

Neben zusätzlichen Events wurden im Communicator ab Version 4.x ein Event Objekt eingeführt, das sich leider vom Event Objekt des Explorers unterscheidet.

Neue Eventhandler sind z.B.

  1. onDragDrop,
  2. onResize und
  3. onMove

Das Eventmodell des Communicators

Neben der Tatsache, dass ein Ereignis eingetreten ist, interessiert oft auch mehr Information zum Ereignis, wie die Stelle innerhalb eines Bildes, auf die geklickt wurde. Dazu existiert das Objekt event.

Achtung:

Die Objektmodelle von Netscape, Microsoft und vom W3C Standard unterscheiden sich. Wir werden die Unterschiede später betrachten.

Die nachfolgende Tabelle beschreibt die wichtigsten Eigenschaften des Event Objektes.

Eigenschaft Bedeutung
layerX x-Koordinate des Ereignisses relativ zum layer Objekt, in dem das Ereignis eingetreten ist.
layerY y-Koordinate des Ereignisses relativ zum layer Objekt, in dem das Ereignis eingetreten ist.
pageX x-Koordinate des Ereignisses relativ zur linken oberen Ecke des Dokumentes, in dem das Ereignis eingetreten ist.
pageY y-Koordinate des Ereignisses relativ zur linken oberen Ecke des Dokumentes, in dem das Ereignis eingetreten ist.
screenX x-Koordinate des Ereignisses relativ zum Bidschirm.
screenX y-Koordinate des Ereignisses relativ zum Bidschirm.
target Das Objekt, auf dem das Ereignis ausgelöst wurde
type Ereignistyp
which Maustaste oder Tastenkode, der Ereignis ausgelöst hat.

Das folgende Beispiel gibt die Mauskoordinaten eines Mausklicks an.

Beispiel 7.2-18  

Im o.a. Beispiel bezeichnet event  in test(event) das Ereignis, das durch den Eventhandler definiert ist.

Event Capturing im Communicator

Eine der wichtigsten Neuerungen in JavaScript1.2 ist das so genannte Event-Capturing. Damit lassen sich Ereignisse "einfangen", bevor das Zielobjekt erreicht wird.

Wenn z.B. Mausbewegungen auf einer HTML Seite registrieren will, so müsste man in allen Eventhandlern der HTML Objekte, über die die Maus bewegt wird, die Koordinaten abfragen. Dies wäre sehr umständlich. Einfacher ist es, wenn das Window Objekt alle mouseOver Ereignisse abfängt.

Dazu wird dem Window Objekt mitgeteilt, welche Ereignisse es wie abfangen soll.

Beispiel 7.2-19  

Die Groß- bzw. Kleinschreiung ist im o.a. Beispiel wichtig:

event.MOUSEMOVE ist eine vordefinierte Konstante, die den Typ des Ereignisses angibt.

So wie man mit captureEvents Ereignisse "fangen" kann, kann man dies mit releaseEvents wieder rückgängig machen.

Das nachfolgende Beispiel demonstriert, wie man das Einfangen ein- und ausschalten kann.

Beispiel 7.2-20  

In den Aufrufen von captueEvents() und releaseEvents() kann man mehrere Ereignistypen mit "ODER" ("|") getrennt angeben.

Ereignisse im Microsoft Internet Explorer >= 4.x

Auch in der MS Welt wurde in Ereignismodell eingeführt; es passt aber nicht zu Netscape, ebenso wenig wie die Eventhandler.

Zusätzliche Eventhandler in IE

Die meisten HTML Objekte können (zu den bereits bekannten) die folgenden Eventhandler verarbeiten:

Die genaue Spezifikation findet man im Referenzteil auf der Microsoft Site.

Das folgende Beispiel zeigt den Typ eines Formularelementes in der Statuszeile.

Beispiel 7.2-21  

Das event Objekt im IE

Im IE wurde das Event Objekt wie folgt definiert:

Eigenschaft Bedeutung
button gibt die gedrückte Maustaste an
cancelBubble gibt an, dass das event Objekt an übergeordnete Objekte weitergereicht werden soll
clientX x-Koordinate von Mausereignissen relativ zum Browser Fenster (ohne Menüleiste und Scrollbar)
clientY y-Koordinate von Mausereignissen relativ zum Browser Fenster (ohne Menüleiste und Scrollbar)
keyCode Unicode der gedrückten Taste
offsetX x-Koordinate von Mausereignissen relativ zu dem Objekt, das das Ereignis ausglöst hat
offsetY Y-Koordinate von Mausereignissen relativ zu dem Objekt, das das Ereignis ausglöst hat
returnValue Rückgabewert des Eventhandlers
scrElement Objekt, das Ereignis ausgelöst hat
type Ereignistyp
x x-Koordinate relativ zum übergeordneten Objekt
y y-Koordinate relativ zum übergeordneten Objekt

Im folgenden werden die Mauskoordinaten bzgl. des Bildes in der Statusleiste angezeigt.

Beispiel 7.2-22  

Hier sieht man den Unterschied zwischen dem Communicator und IE:

Im IE ist das event Objekt im window Objekt enthalten (window.event....); im Communicator wird das event Objekt an den Eventhandler übergeben (onClick=test(event)..).

Event Bubbling im IE

Event Bubbling bezeichnet die Weitergabe von der Behandlung von Ereignissen an übergeordnete Objekte - die Ereignisse steigen in der Objekthierarchie auf wie Luftblasenblasen im Wasser.

Wenn z.B. für einen Link kein Eventhandler für das Ereignis onMouseOver definiert wurde, wird das Ereignis an das Objekt document (dies sei das direkt übergeordnete Objekt) weitergeleitet und von ihm behandelt.

Das nachfolgende Beispiel verändert die Textfarbe von Links, wenn der Mauszeiger über dem Link bewegt wird, obwohl im entsprechenden Tag (<a...>) kein Eventhandler für onMouseOver definiert ist. Verwendet werden die Eventhandler des Dokumentes durch die init Funktion, die durch onLoad="init()" geladen wird.

Beispiel 7.2-23  

Wie im o.a. Beispiel, ist es sinnvoll, allgemeine Eventhandler zu verwenden, anstelle Eventhandler für jedes Objekt zu definieren. Soll aber das Weiterreichen unterdrückt werden, so kann die Methode cancelBubble des event Objektes verwendet werden. Wird cancelBubble auf true  gesetzt, so wird das Weiterreichen verhindert.

Vergleich Netscape Capturing vs. Microsoft Bubbling

Event Bubbling arbeitet button up in der Objekthierarchie: zuerst erfährt das Zielobjekt, dass ein Ereignis aufgetreten ist, dann ggf. das übergeordnete Objekt.

Capturing arbeitet op down: zuerst erfährt das oberste Objekt (window), dass ein Ereignis aufgetreten ist, dann das Zielobjekt.

Ereignisse im W3C Standard

Ein standardisiertes Objekt und Ereignismodell würde die JavaScript Programmierung vereinfachen - man müsste nicht unterschiedlichen Kode für die unterschiedlichen Browser schreiben. Der im Folgenden gezeigte W3C Standard wird z.Z. von Microsoft noch nicht unterstützt, ansatzweise aber von Netscape (V6).

Die im folgenden betrachteten Beispiele zeigen den Standard. Sie sind nicht in aktuellen Browsern lauffähig.

Event Listener

Der W3C Standard führt eine neue Systematik zur Definition von Eventhandlern ein. Durch die Methode addEventListener() kann man sogenannte Event Listener erzeugen, die auf Ereignisse beliebige Objekte in der Objekthierarchie reagieren können.

Im u.a. Beispiel wird ein Button Objekt mit einem Event Listener versehen.

Beispiel 7.2-24  (nicht Lauffähig)  

Die Methode addEventListener() hat drei Argumente:

  1. das Ereignis, auf das reagiert werden soll (auf was wird reagiert)
  2. die Funktion, die ausgeführt werden soll (wie wird reagiert)
  3. die Steuerung des Ereignisflusses  (true="Capturing", false="Bubbling")

Einmal erzeugte Event Listener können mit removeEventListener() wieder entfernt werden.

 Das Ereignis Objekt

Auch W3C definiert ein eigenes Ereignis Objekt (Event). Es automatisch an die im Listener angegebene Funktion übergeben, wenn ein Ereignis eintritt (ähnlich wie im Communicator).

Folgende Tabellen beschreiben das Event Objekt.

Eigenschaft Bedeutung
bubbles gibt an, ob das Event Objekt in der Objekthirarchie nach oben weitergereicht werden soll (Bubbling)
cancelable gibt an, ob die Standardaktion auf das Eintreten eines Ereignisses unterbunden werden kann
currentTarget gibt das aktuelle Objekt an, das das Event Objekt behandelt
eventPhase gibt an, in welcher Phase sich die Ereignisbehandlung befindet:

1 = Capturing
2 = Zielobjekt
3 = Bubbling

target gibt das Zielobjekt an
timeStamp Zeitpunkt (date) des Ereignisses
type Ereignistyp

 

Methode Bedeutung
initEvent(typ,bubble,canelable) Erzeugung Event Objekt
preventDefault() unterbindet Standardaktionen des Browsers
stopPropagation() verhindert, dass das Event Objekt an andere Objekte weiter gereicht wird

Der W3C Standard sieht vor, dass auch per Programm selbst Events erzeugt werden können. Dies ist jedoch noch nicht implementiert.

Formulare

Formulare haben wir bereits in einigen Beispielen verwendet. Hier werden weitere Möglichkeiten, Formulare im Rahmen der JavaScript Programmierung zu verwenden, besprochen.

HTML Kode eines Formulars

Der Kode für ein Formular ist durch das HTML Tag <form> geklammert. Darin eingeschlossen sind die einzelnen Formularelemente, die durch das Tag <input> mit zugehörenden Attributen spezifiziert werden.

Beispiel 7.3-1

Zugriff auf Formularelemente

Der Zugriff auf Formulareist möglicht durch

Auf die Elemente eines Formulars kann über

zugegriffen werden. Dabei ist die Reihenfolge der Elemente im HTML Kode für die Nummerierung in den Arrays verantwortlich.

Das Element zur Texteingabe in unseres Formular aus dem letzten Beispiel kann über

document.forms[0].elements[1]
document.beispielForm.elements[1]
document.forms[0].text1
document.beispielForm.text1

adressiert werden.

Zu empfehlen ist, die Adressierung über zugeordnete Namen zu verwenden, da ansonsten durch Änderungen am HTML Dokument (Einfügen oder Löschen von HTML Elementen) der JavaScript Kode angepasst werden muss.

Die relative Adressierung erlaubt es, die Objekte zu adrssieren, die relativ zu einem Objekt angegeben werden:

<form>
    <input type="button" value="button"
           onClick="alert(this.form.Eingabe.value')">

    <input type=text" name="Eingabe">
</form>

Formularelemente

Die Elemente mit Typ "button" und  "text" sind bereits ausgiebig verdeutlicht worden.

Textarea

Zur Darstellung  Mehrzeiliger Textfelder existiert das textarea-Objekt. Die Attribute cols und rows definieren die Grösse, der Text kann initialisiert werden die Platzierung innerhalb der Tagklammerung (also nicht durch Verwemdung des Atrributes "value". Die Art des Textumbruches wird durch das Attribut "wrap" mit Werten "off", "virtual" (kein Zeilenumbruchzeichen) und "physical" (Zeilenumbruchzeichen wird erzeugt).

<html>
<head>
<script>
function zaehl(str) {
    alert("Anz. Zeichen: "+str.length);
}
</script>
</head>
<body>

<form name="beispielForm">
    <textarea name="ta"
        cols="30"
        rows="4"
        wrap="virtual">
        Text mit 2 Zeilen
        2. Zeile
    </textarea> <br>
    <input type="button"
        value="Zaehl"
        onClick="zaehl(this.form.ta.value)">
</form>

</body>
</html>

Hidden

Durch das hidden-Objekt können Objekte nicht sichtbar auf Seiten platziert werden. Diese Objekte werden beim Versenden des Formulars mit an den Web Server übertragen. Deshalb verwendet man sie, um das Ergebnis einer Berechnung einer JavaScript Funktion an den Server zu senden.

<form name="beispielForm">
    .....   

    <input type="hidden"
            name="h1"
            value="this.form.text1.value">

</form>
 

Password

Eine weiters Textobjekt ist das password-Objekt. Der einzige Unterschied zum text-Objekt ist, dass die eingegebenen Zeichen nicht in Klarschrift angezeigt werden, es wird pro Eingabezeichen ein Stern "*" angezeigt.

Vorsicht:

Es findet keine Verschlüsslung der Eingabedaten statt, die Zeichen werden in Klarschrift an den Webserver übertragen.

Checkbox

Mit Checkboxen sind Optionen aktivierbar und deaktivierbar. Die Eigenschaft "checked" (true, false) gibt an, ob die Option ausgewählt wurde.

Beispiel 7.3-2

Radio

Ein Radiobutton ist einfach eine Gruppe von Buttons, bei denen nur einer auswählbar ist.

Die Gruppierung wird erreicht, indem man für unterschiedlichen input-Tags den selben Namen verwendet:

<form name="beispielForm">
   
    <input type="radio" name="r1" value="opt1" checked> Option 1 <br>
    <input type="radio" name="r1" value="opt2" > Option 2 <br>
    <input type="radio" name="r1" value="opt3" > Option 3 <br>

</form>

Da alle radio-Objekte der selben Gruppe den selben Namen haben, kann der Zugriff nur durch Arrayadressierung verwirklichen lassen:

    document.beispielForm.r1[0].checked==true
    document.beispielForm.r1[1].checked==false
    document.beispielForm.r1[2].checked==false

Da es keine Methode für den Objekttyp gibt mit dem die Auswahl, die "gesetzt" ist ermittelbar ist, muss man explizit dazu eine Schleife verwenden.

Beispiel 7.3-3

Radio-Buttons werden sehr oft min HTML Seiten verwendet. Deshalb ist es sinnvoll, eine Funktion zu realisieren, mit der man beliebige Radio-Buttons prüfen kann.

Beispiel 7.3-4

Die Funktion "checkRadio" liefert als Ergebnis, den Radio-Button, bei dem die Eigenschaft "checked" gesetzt ist.

In Programmen (zur dynamischen Erzeugung von HTML Seiten)  kann man die Option setzen, in dem man die Eigenschaft "checked" auf "true" setzt.

Select

Auswahllisten sind über das select-Objekt realisierbar. Die Tags sind <select> und <option>. Durch Attribute "multiple" des select-Objektes kann man zum Ausdruck bringen, dass Mehrfachauswahlen erlaubt sind. Das Attribut "size" bestimmt die auf dem Bildschirm angezeigten Elemente; die restlichen müssen über einen Scrollbar sichtbar gemacht werden, bevor sie ausgewählt werden können.

<select name="sl" size="3" multiple>
    <option> Element 0
    <option> Element 1
    <option> Element 2
    <option> Element 3
    <option> Element 4
</select>
 

Bei Auswahlboxen mit Einfachauswahl kann man durch die Eigenschadt "selectedIndex" abfragen, welches Element ausgewählt wurde.

Beispiel 7.3-5

Bei Mehrfachauswahlen zeigt selectedIndex auf das erste ausgewählte Element. Die restlichen müssen durch eine Schleife über das Auswahl-Array und die Eigenschaft "selected" gefunden werden.

Beispiel 7.3-6

Die neuen Versionen der bekannten Browser erlauben auch dynamisch Einträge von Optionen zu ändern und neue Elemente einzufügen. Dazu kann man mit "new Option()" einen neuen Eintrag erzeugen, ein Eintrag löschen wird umgesetzt, indem man das entsprechende Element auf "null" setzt.

Das folgende Beispiel ändert den Text des ersten Elements, erzeugt ein neues Element am Ende und entfernt das dritte Element.

Beispiel 7.3-7

Submit, Reset

Das submit-Objekt und das reset-Objekt sind Auslöser für die Übertragung von Informationen zum Web-Server. "submit" versendet die Formulardaten gemäss der angegebenen Methode(GET, POST) an das im Attribut "target" angegebene Ziel.

"Reset" setzt die Benutzereingaben zurück, so dass neue Eingaben eingebbar sind.

Das folgende Formular sendet eine eMail an mich.

Beispiel 7.3-8

FileUpload

Mit dem fileUpload-Objekt können Daten, die im Dateisystem des Client abgelegt sind, versendet werden. Von JavaScript aus ist der Fileupload fast nicht beeinflussbar; stets ist die Benutzerinteraktion erforderlich. Diese Designentscheidung war erforderlich, um zu verhindern, dass ohne Zustimmung des Benutzers Daten seines Rechners versendet werden können.

Das folgende Beispiel verwendet das fileUpload-Objekt, um Dateien, die eine bestimmte Endung haben, an den Webserver zu übermitteln.

Beispiel 7.3-9

Zur Erinnerung (HTML Kurs)

In der Form muss man "enctype="multipart/form-data"" angeben, ansonsten wird nur der Name der Datei gesendet.

Windows und Frames

Ein Fenster ist in mehrere Rahmen (frames) einteilbar. Ein Frame ist ein rechteckiger Bereich, der ein eigenes HTML Dokument beinhalten kann. Somit kann man mehrere HTML Dokumente in einem Fenster darstellen.

Als Einsatzgebiet kommen im Web oft Frames zum Einsatz, um Menüs zu realisieren. Das Skript selbst ist ein Beispiel dafür.

Die Menüleiste des Skriptes wird nicht neu geladen, wenn ein Kapitel ausgewählt wird. Im "Hauptfenster" wird nur das ausgewählte Dokument angezeigt. Ein weiterer Rahmen ist im obern untergebracht; die ist die Uhr realisiert und einige Navigations-Schaltflächen.

Erzeugung von Frames

Frames werden als Menge von Rahmen durch das Tag "<frameset>" erzeugt. Damit wird sowohl die Anzahl als auch die Ausrichtung der Rahmen definiert. Jeder enthaltene Rahmen wird durch das Tag "<frame>" angegeben.

Durch

<frameset rows="60%,40%">
    <frame name="frame1" src="frame1.htm">
    <frame name="frame2" src="frame2.htm">
</frameset>

werden zwei übereinanderliegende Rahmen zu einem Frameset zusammengefasst, wobei die Größen relativ zur Seite angegeben sind. Alternativ kann man die Größe in Pixel angeben (rows="100,150"), oder nebeneinander liegend (cols="50%,50%").

Framesets könne geschachtelt werden. Damit sind beliebige Rahmenstrukturen abbildbar.

Beispiel (start.htm):

<frameset rows="60%,40%">
    <frameset cols="60%,40%">
        <frame name="frame1" src="frame1.htm">
        <frame name="frame2" src="frame2.htm">
    </frameset>
    <frame name="frame3" src="frame3.htm">
</frameset>
 

Das Tag "<noframes>" wird verwendet, um Informationen weitergeben zu können, wenn ein Browser keine Frames unterstützt.

<noframes>
<body>
  Diese Seite verwendet Frames. Frames werden von Ihrem
  Browser aber nicht unterstützt.</p>
</body>
</noframes>
 

Die JavaScript Objekte, die in einem Dokument, das in Frames als Quelle verwendet wird, kann in anderen Frames adressiert werden. Dabei sind ist die Hierarchie der Frames zu berücksichtigen.

In letzen Beispiel etwa ist die Framehierarchie:

Die Pfeile zeigen die Abhängigkeiten der Frames an. start.htm lädt die Seiten der Frames.

In den HTML Dateien (frame1.htm, frame2.htm und frame3.htm) sind JavaScript Variablen definiert. Sie sind wie folgt angegeben:

<html><head><script language="JavaScript">
var x=1.1
</script>
</head>
<body>
Datei: frame1.thm<br>
FRAME1<br>
<script language="JavaScript">

document.write("local: "+ x + "<br>");
document.write("parent: "+ parent.x + "<br>");

</script></body></html>

<html><head>
<script language="JavaScript">
var x=1.2
</script></head><body>
Datei: frame2.htm<br>
FRAME2<br>
<script language="JavaScript">

document.write("local: "+ x + "<br>");
document.write("parent: "+ parent.x + "<br>");
document.write("frame1: "+ parent.frame1.x);

</script></body></html>

<html><head><script language="JavaScript">
var x=1.3
</script></head><body>
Datei: frame3.thm<br>
FRAME3<br>

<script language="JavaScript">

document.write("local: "+ x + "<br>");
document.write("parent: "+ parent.x + "<br>");
document.write("frame1: "+ parent.frame1.x + "<br>");
document.write("frame2: "+ parent.frame2.x);

</script></body></html>

Der Zugriff auf einzelne Objekte folgt der Framehierarchie: direkt kann nur vom Vater auf die Kinder zugegriffen werden; direkter Zugriff von einem Kind auf Objekte der Geschwister ist nicht möglich. Dies muss über den Vater durchgeführt werden.

Entfernen von Frames

Frames kann man löschen, in dem man vom Vater einfach das Ziel (target) neu definiert, etwa durch einen Link:

<a href="#" target="_parent">

start.htm.

Arbeiten mit mehreren Fenstern

Frames sind innerhalb eines Dokumentes hierarchisch angeordnet. Fenster werden über einen dem Fenster zugeordneten Namen angesprochen. Dabei spielt es keine Rolle, wie das Fenster erzeugt wurde.

In JavaScript gibt es keine direkte Möglichkeit, auf ein beliebiges Fenster zuzugreifen. Es ist nur möglich, von einem Fenster auf das von ihm erzeugte Fenster zuzugreifen und umgekehrt.

Ein Fenster wird erzeugt durch:

    neuesFenster = open("", "FensterName", "");

 Nach der Erzeugung kann man dann in dieses Fenster schreiben durch:

    neuesFenster.document.write("...");

Der Name ist "FensterName", "neuesFenster" ist ein Objekt vom Typ Fenster.

Will man z.B. eine neue Seite in das erzeugte Fenster laden, kann man mit dem HTML Tag "<a>" und dem Attribut "target" arbeiten:

    <a href="www.fbi.fh.darmstadt.de" target="FensterName"> FB Informatik </a>

Vom erzeugten Fenster aus kann man auf den "Erzeuger" zugreifen indem man die Eigenschaft "opener" des window-Objektes verwendet: Somit kann man z.B. ein neues Dokument in das Erzeuger-Fenster laden durch:

    opener.location.href="http://...."

Mit diesen Möglichkeiten lassen sich Navigations-Pannel im eigenen Fenster realisieren. Problematisch ist dabei, dass das Navigationsfenster in den Hintergrund verschwinden kann, obwohl es aktiv ist (in Unix z.B.).

<html>
<head>
<title>Pannel</title>
</head>
<script language="JavaScript">
function createWindow() {
    var path="http://www.fbi.h-da.de/~a.schuette/Vorlesungen/JavaScript/"
    var win = open(path+"NavigationsPannel/pannel.htm",
    "navigation", "width=160, height=180");
}
</script>
<body>
<form>
    <input type="button" value="Start"
        onClick="createWindow()">
</form>
</body>
</html>

Dabei sieht die Datei "pannel.htm" wie folgt aus:

<html>

<head>
<title>Pannel</title>
</head>
<script language="JavaScript">
function goTo(URL) {
    window.opener.location.href = URL;
}
</script>
<body>
<form>
<input type="button" value="Inhalt"
onClick="goTo('http://www.fbi.h-da.de/~a.schuette/Vorlesungen/JavaScript/Inhalt.htm')"> <br>
<input type="button" value="Grundlagen"
onClick="goTo('http://www.fbi.h-da.de/~a.schuette/Vorlesungen/JavaScript/Grundlagen.htm')"> <br>
<input type="button" value="Funktionen"
onClick="goTo('http://www.fbi.h-da.de/~a.schuette/Vorlesungen/JavaScript/Funktionen.htm')"> <br>

</form>
</body>

</html>

Ausführen