Galileo Computing <openbook>
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


JavaScript von Christian Wenz
Browserübergreifende Lösungen
JavaScript - Zum Katalog
gp Kapitel 10 Fenster III
  gp 10.1 Ein neues Fenster öffnen
  gp 10.2 10.2 Fernsteuerung
  gp 10.3 Fenster schließen
  gp 10.4 Fenster in den Vordergrund holen
  gp 10.5 Fenster bewegen mit JavaScript
  gp 10.6 Fragen & Aufgaben

Kapitel 10 Fenster III

Sie hätte keinen anderen bei sich nicht fensterln und kammerln lassen, und überhaupt sei der Loisl ihr erster gewesen.
– Mostar, Unschuldig

Man kann nicht nur den Inhalt bestehender Fenster verändern, man kann auch gleich neue Fenster erstellen. Das kann sowohl zum Nutzen als auch sehr zum Ärger des Benutzers sein. In diesem Kapitel sehen Sie beides.

Früher war es noch fast unbezahlbar, eine .de-Domain zu registrieren, so dass man schon erwägen musste, eine vergleichsweise günstige .com-Domain zu erwerben. Heutzutage hat sich das umgekehrt: Mehrere Firmen buhlen um Kundschaft und unterbieten sich gegenseitig mit den Preisen. Für den geringen Preis gibt es jedoch oft auch nur geringe Leistungen. Manche Anbieter sind auf die Idee gekommen, als Gegenleistung für den Kampfpreis ein Werbebanner auf den Seiten einzublenden. Damit man das Banner auch besonders gut sieht, wird es in einem eigenen, neuen Fenster angezeigt. Bei Seiten mit besonders zwielichtigem Inhalt wird das auf die Spitze getrieben und es werden sogar mehrere neue Fenster geöffnet, was ich natürlich nur vom Hörensagen weiß.


Galileo Computing

10.1 Ein neues Fenster öffnen  downtop

Die Methode zum Öffnen eines neuen Fensters heißt window.open(). Dieser Methode werden bis zu drei Parameter übergeben, mindestens jedoch einer.


Galileo Computing

10.1.1 Ein Fenster öffnen und füllen  downtop

var fenster = window.open(URL, Fenstername, Optionen)

Der erste Parameter, URL, enthält die URL der Seite, die in das neue Fenster geladen werden soll. Ist URL eine leere Zeichenkette, so wird das Fenster zwar geöffnet, aber es wird keine Seite hineingeladen.

Die Position des neuen Fensters lässt sich nur ab Netscape Navigator 4 bestimmen; ansonsten hängt sie vom Browser ab. Die Größe hängt auch vom Browser ab, kann jedoch auch eingestellt werden (siehe weiter unten).

Mit dem folgenden Code wird die Homepage des Galileo Verlags in ein neues Fenster geladen:

var fenster = window.open("http://www.galileo-press.de/")
gp  Verwenden Sie stets window.open(), nicht bloß open().

Die Variable fenster ist eine Referenz auf das neue Fenster. Somit kann auf Eigenschaften des Fensters zugegriffen werden, beispielsweise auf das Objekt location oder auf das Objekt document. Letzteres ist besonders interessant, kann man doch so (mittels write()) den Inhalt des Fensters komplett mit JavaScript erzeugen. Die folgende Funktion öffnet ein neues Fenster und erzeugt in diesem eine HTML-Seite, die den übergebenen Parameter ausgibt.

function tag(s){ return "<"+s+">" }
function neuesfenster(text){
   var fenster = window.open("")
   if (fenster!=null){ //Hat das Öffnen des Fensters geklappt?
      fenster.document.open() //Öffnen für Schreibzugriff, notwendig!
      fenster.document.write(tag("HTML")+tag("BODY"))
      fenster.document.write(tag("H1") + text + tag("/H1"))
      fenster.document.write(tag("/BODY")+tag("/HTML"))
      fenster.document.close() //Schreibzugriff beenden, notwendig!
   }
}

Wie Sie sehen, können Sie mit document.open(), write() und close() rein theoretisch in jedem Fenster jeden beliebigen HTML-Code erzeugen; Anhängen geht nicht, aber Überschreiben ist möglich. Einige Leute haben das recht trickreich ausgenutzt und beispielsweise die Login-Masken mancher Webmail-Dienste mit dieser Methode überschrieben, wodurch sie die Passwörter von ahnungslosen Benutzern ausspionieren konnten. Aus diesem Grund erlauben die neueren Versionen aller Browser nur noch das Überschreiben von Fenstern, deren aktuelle URL von derselben Domain stammt wie das Fenster mit dem Skript.

gp  Einzige Ausnahme: Wird ein Fenster mit window.open("") geöffnet, so kann es vom selben Skript aus mit document.write() beschrieben werden. Die 16-Bit-Version Version 3.03 SP1 des Microsoft Internet Explorer jedoch enthält ein besonderes »Sicherheitsfeature«: Sie können mit window.open("") erzeugte Fenster so nicht mehr verändern; es erscheint dann eine Fehlermeldung! Sie müssen sich hier mit einem kleinen Trick behelfen: Verwenden Sie window.open("http://www.ihrserver.de/leer. html"), und fahren Sie dann wie oben beschrieben fort. Die Datei leer.html kann beliebigen Inhalt haben – der wird ja sowieso überschrieben – aber Sie sollten sich auf ein Standard-HTML-Gerüst beschränken:
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
</BODY>
<HTML>

Galileo Computing

10.1.2 Ein Fenster öffnen und verlinken  downtop

Der zweite Parameter von window.open() gibt den Namen des neuen Fensters an. Man kann diesen Namen – genauso wie bei Frames – als Wert des TARGET-Attributs eines HTML-Links angeben, und das Ziel des Links wird in dem neuen Fenster geöffnet und nicht im aktuellen Fenster. Wenn Sie window.open() zweimal verwenden und dabei einen identischen zweiten Parameter angeben, wird nur ein Fenster geöffnet.

Die folgende Seite öffnet beim Laden ein neues Fenster mit der Homepage des Galileo Verlags. Die anderen Links auf der HTML-Seite öffnen die Homepages einiger Browser-Hersteller – in dem neuen Fenster.

<HTML>
<HEAD>
<TITLE>Neue Fenster</TITLE>
<SCRIPT LANGUAGE="JavaScript"><!--
function neuesfenster(){
  var fenster = window.open("http://www.galileo-press.de", "neu")
}
//--></SCRIPT>
</HEAD>
<BODY onLoad="neuesfenster()">
<H3>Hier einige Links...</H3>
<UL>
<LI><A HREF="http://www.microsoft.com" TARGET="neu">Microsoft</A>
<LI><A HREF="http://www.netscape.com" TARGET="neu">Netscape</A>
<LI><A HREF="http://www.opera.com" TARGET="neu">Opera</A>
</UL>
</BODY>
</HTML>
Abbildung 10.1  Alle Links werden im neuen Fenster geöffnet.
Abbildung


Galileo Computing

10.1.3 Ein Fenster öffnen und anpassen  downtop

Der letzte Parameter ist gleichzeitig der interessanteste. Hier kann man das Aussehen des neuen Browser-Fensters etwas genauer anpassen. Neben der Höhe und Breite des Fensters kann man auch die meisten Leisten ein- und ausschalten. Es gibt hier zwei Arten von Parametern:

gp  Numerische Werte: Beispielsweise Höhe oder Breite; diese haben das Format height=400.
gp  Ja/Nein-Werte: Beispielsweise Statuszeile einblenden ja/nein. Die Werte yes und 1 oder die bloße Erwähnung der Option bedeuten ja, no und 0 bedeuten nein. Beispiel: status=yes,toolbar=no,menubar.

Sie können natürlich mehrere Parameter zusammen verwenden. Sie müssen diese dazu durch Kommata voneinander trennen, und Sie dürfen keine Leerzeichen verwenden! Der folgende Befehl öffnet ein Fenster, das 400 Pixel breit ist und eine Statuszeile hat:

var fenster = window.open("", "neu", "width=400,status=1")

In Tabelle 10.1 finden Sie die wichtigsten möglichen Parameter. Eine vollständige Auflistung befindet sich in der Referenz.

Tabelle 10.1  Eine Auswahl der Fensteroptionen
Option Typ Beschreibung
dependent Ja/Nein Das neue Fenster wird vom aufrufenden Fenster »abhängig«, d. h., beim Schließen des aufrufenden Fensters wird das neue Fenster auch geschlossen.
directories Ja/Nein Nur Netscape: Die Schaltflächen What’s new, What’s cool werden ein- oder ausgeblendet.
height numerisch Höhe des Fensters in Pixeln
innerHeight numerisch NN4: Höhe des Fensterinhalts in Pixeln (aktiver Bereich, vgl. height)
innerWidth numerisch NN4: Breite des Fensterinhalts in Pixeln (aktiver Bereich, vgl. width)
left numerisch IE4: Abstand vom linken Bildschirmrand in Pixeln
menubar Ja/Nein Menüleiste wird ein- bzw. ausgeblendet.
outerHeight numerisch NN4: Gesamthöhe des Fensters (inkl. Titelleiste, Scrollbalken, Rahmen etc.) in Pixeln
outerWidth numerisch NN4: Gesamtbreite des Fensters (inkl. Titelleiste, Scrollbalken, Rahmen etc.) in Pixeln
screenX numerisch NN4: Abstand vom linken Bildschirmrand in _Pixeln
screenY numerisch NN4: Abstand vom oberen Bildschirmrand in _Pixeln
scrollbars Ja/Nein Scrollbalken am rechten und/oder unteren Rand des Browser-Fensters werden angezeigt/unterbunden.
status Ja/Nein Die Statuszeile wird ein- oder ausgeblendet.
toolbar Ja/Nein Die Navigationsleiste (mit den Schaltflächen für Vor/Zurück/Neu laden etc.) wird ein- oder ausgeblendet.
top numerisch IE4: Abstand vom oberen Bildschirmrand in Pixeln
width numerisch Breite des Fensters in Pixeln

Wenn einer dieser Parameter nicht angegeben wird, nimmt der JavaScript-Interpreter an, er wäre auf no bzw. 0 gesetzt worden. Der folgende Aufruf erzeugt also ein ganz mageres Fenster:

var fenster = window.open("", "neu", "")

Wie Sie bei den vorherigen Beispielen gesehen haben, fehlt der dritte Parameter komplett, so sieht das neue Fenster gemäß den Standardwerten des Browsers aus. Beim Netscape Navigator beispielsweise entsprechen die Ausmaße und angezeigten Leisten denen des zuletzt aktiven Browser-Fensters.

Kommen wir zu einer der eingangs erwähnten Anwendungsmöglichkeiten zurück: zur Anzeige eines nervigen Werbebanners. Wenn Ihr Werbebanner eine Breite von 200 x 100 Pixeln hat, könnte Ihr Aufruf folgendermaßen aussehen:

<HTML>
<HEAD>
<TITLE>Werbebanner</TITLE>
<SCRIPT LANGUAGE="JavaScript"><!--
function werbebanner(){
   var fenster = window.open("banner.html", "neu", "width=210,
     height=110")
}
//--></SCRIPT>
</HEAD>
<BODY onLoad="werbebanner">
<H1>Werbebanner wird geladen...</H1>
</BODY>
</HTML>
gp  Unter UNIX kann die Größe eines Fensters über X-Ressourcen bestimmt werden, die immer Priorität haben.

Die Datei banner.html kann folgendermaßen aussehen:

<HTML>
<HEAD>
<TITLE>Banner</TITLE>
</HEAD>
<BODY TOPMARGIN=0 LEFTMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0>
<!-- kein Abstand zum Fensterrand -->
<A HREF="http://www.ihranzeigenkunde.de" TARGET="_blank">
<IMG SRC="banner.gif" WIDTH=200 HEIGHT=100 BORDER=0>
</A>
</BODY>
</HTML>
gp  Aus Sicherheitsgründen muss ein mit JavaScript geöffnetes Fenster mindestens 100 Pixel hoch und 100 Pixel breit sein. Wenn Sie also für Höhe oder Breite einen Wert kleiner hundert angeben, wird das Fenster trotzdem 100 Pixel breit oder hoch dargestellt. Mit dem Netscape Navigator 4 lässt sich das umgehen, indem man signierte Skripten nutzt. Ebenso können Sie (mit screenX/screenY) ein Fenster nicht aus dem sichtbaren Bereich hinaus verschieben, wenn Sie kein signiertes Skript verwenden.

Mit der folgenden HTML-Seite können Sie einige Parameter für das Aussehen des neuen Fensters anpassen:

<HTML>
<HEAD>
<TITLE>Fenster-Test</TITLE>
<SCRIPT LANGUAGE="JavaScript"><!--
function neuesfenster(formular){
   var optionen="width=400,height=300"
   for (var i=0; i<formular.elements.length; i++){
      if (formular.elements[i].checked) 
         optionen += "," + formular.elements[i].name
   }
   var fenster = window.open("", "neu", optionen)
   if (fenster != null){
      with (fenster.document){
         open()
         write("<"+"HTML"+">"+"<"+"BODY"+">")
         write("Neues Fenster mit folgenden Optionen: "+optionen)
         write("<"+"HR"+">")
         write("<"+"A HREF='javascript:window.close()'"+">")
         write("Fenster schließen"+"<"+"/A"+">")
         write("<"+"/BODY"+">"+"<"+"/HTML"+">")
         close()
      }
   }
}
//--></SCRIPT>
</HEAD>
<BODY>
<H1>Fenster-Optionen auswählen</H1>
<FORM>
<INPUT TYPE="CHECKBOX" NAME="dependent"> dependent<BR>
<INPUT TYPE="CHECKBOX" NAME="directories"> directories<BR>
<INPUT TYPE="CHECKBOX" NAME="hotkeys"> hotkeys<BR>
<INPUT TYPE="CHECKBOX" NAME="location"> location<BR>
<INPUT TYPE="CHECKBOX" NAME="menubar"> menubar<BR>
<INPUT TYPE="CHECKBOX" NAME="scrollbars"> scrollbars<BR>
<INPUT TYPE="CHECKBOX" NAME="status"> status<BR>
<INPUT TYPE="CHECKBOX" NAME="toolbar"> toolbar<BR>
</FORM>
<A HREF="javascript:neuesfenster(document.forms[0])">Fenster
  erzeugen</A>
</BODY>
</HTML>
Abbildung 10.2  Die verschiedenen Fenstereigenschaften können direkt ausprobiert werden.
Abbildung

Beachten Sie bei dem Listing, dass in das neue Fenster neben den Optionen auch ein Link zum Schließen des Fensters geschrieben wird:

<A HREF="javascript:window.close()">Fenster schließen</A>

Das Fenster kann natürlich auch vom aufrufenden Skript aus geschlossen werden; verwenden Sie dazu die Referenz auf das neue Fenster, die von window.open() zurückgegeben wird, in unserem Beispiel also fenster. close().

Ein kurzes Wort noch zu der Zeile if (fenster != null): Es kann sein, dass das Öffnen des neuen Fensters nicht funktioniert hat; insbesondere der Internet Explorer gibt bei wenig Speicher gern eine Fehlermeldung aus und öffnet das Fenster dann nicht.

Anwendungen für die neuen JavaScript-Fenster gibt es viele: Beispielsweise könnten Sie auf Ihren Webseiten eine Hilfefunktion anbieten. Der Hilfetext kann dann in einem neuen Fenster (ohne platzraubende Symbolleisten) dargestellt werden; dies ist insofern praktisch, da der Benutzer nicht auf die Zurück-Schaltfläche seines Browsers klicken muss, um wieder zu der Seite zurückzukehren, auf der er die Hilfe in Anspruch nehmen wollte.


Galileo Computing

10.1.4 Modale Fenster  downtop

Ein sogenanntes modales Fenster ist die gierige Variante von neuen Fenstern. Das aufrufende Fenster ist praktisch inaktiv, Sie können darauf erst wieder zugreifen, wenn das neue, modale Fenster wieder geschlossen worden ist. Sie haben diese Art von Fenstern schon kennen gelernt, sie werden beispielsweise durch window.alert(), window.confirm() und window.prompt() erzeugt. Die Gestaltungsmöglichkeit dieser Fenster war ja relativ gering, aber ab Browsern der Versionsnummer 4 gibt es Alternativen.

Für den Netscape Navigator gibt es die Fenstereigenschaft alwaysRaised, aber die funktioniert nur in Zusammenarbeit mit so genannten Signierten Skripten (siehe dazu auch das gleich lautende Kapitel). Ab dem Internet Explorer 4 gibt es für Benutzer des Microsoft-Browsers die Möglichkeiten, ein modales Fenster zu erzeugen. Die dazugehörige Methode des Fenster-Objekts heißt showModalDialog(), und in Tabelle 10.2 sehen Sie die dazugehörigen Fenstereigenschaften:

Tabelle 10.2  Fensteroptionen für modale Fenster
Option Typ Beschreibung
Center Ja/Nein Das neue Fenster wird zentriert dargestellt (Standard).
dialogHeight numerisch Höhe des Fensters in Pixeln
dialogLeft numerisch Abstand vom linken Bildschirmrand in Pixeln
dialogTop numerisch Abstand vom oberen Bildschirmrand in Pixeln
dialogWidth numerisch Breite des Fensters in Pixeln
help Ja/Nein Hilfesymbol (Fragezeichen) wird angezeigt (Standard)/nicht angezeigt.
status Ja/Nein Die Statuszeile wird ein- (Standard) oder ausgeblendet.
resizeable Ja/Nein Die Größe des Fensters kann vom Benutzer geändert/nicht geändert (Standard) werden.

Der folgende Code öffnet also ein modales Fenster im Internet Explorer. Sie können dort beispielsweise einen Hilfetext anzeigen. Wie immer der Warnhinweis: Da dieser Code nur mit dem Internet Explorer funktioniert, sollten Sie darauf achten, dass Ihre Seiten auch ohne die modalen Fenster navigierbar bleiben – außer natürlich, Sie operieren in einem Intranet, und die Firmenpolitik verbietet Netscape-Browser (solche Firmen gibt es tatsächlich).

<SCRIPT LANGUAGE="JavaScript"><!--
var fenster = window.showModalDialog("", "Modal", "dialogHeight=300,
  dialogWidth=400,status=no,resizeable")
//--></SCRIPT>

In Abschnitt 10.4 finden Sie übrigens ein paar Tipps, wie Sie auch unter anderen Browsern eine Art von modalem Fenster erzeugen können.


Galileo Computing

10.2 10.2 Fernsteuerung  downtop

gp  Wie Sie vom ausrufenden Fenster aus auf das neue Fenster zugreifen können, wissen Sie jetzt. In die andere Richtung ist das leider nicht so einfach, insbesondere, wenn man auch ältere Browser unterstützen will.

Mit JavaScript 1.1 wurde die Fenster-Eigenschaft opener eingeführt, die eine Referenz auf das öffnende Fenster darstellt; auch der Internet Explorer 3 hat diese Eigenschaft übernommen. Mit JavaScript 1.0 kann man sie jedoch relativ einfach nachbilden. In diesem Falle ist die Eigenschaft opener des neuen Fensters gleich null, und man kann sie auf das aktuelle Fenster (also self) setzen:

<SCRIPT LANGUAGE="JavaScript"><!--
var fenster = window.open("seite.htm", "neu")
if (fenster.opener==null)
   fenster.opener = self
//--></SCRIPT>

Galileo Computing

10.2.1 Links mit JavaScript  downtop

Über die Methode opener ist es möglich, auf das ursprüngliche Fenster zuzugreifen. Im Folgenden soll eine Fernsteuerung entwickelt werden. Ausgangspunkt ist folgendes Frameset:

<HTML>
<HEAD>
<TITLE>Fernsteuerung</TITLE>
<SCRIPT LANGUAGE="JavaScript"><!--
function inhalt(){ return "<"+"HTML"+">"+"<"+"/HTML"+">" }
//--></SCRIPT>
</HEAD>
<FRAMESET ROWS="100,*">
   <FRAME SRC="navi.html" NAME="navigation">
   <FRAME SRC="javascript:top.inhalt()">
</FRAMESET>
<NOFRAMES>
<BODY>Ihr Browser kann mit Frames nicht anfangen!</BODY>
</NOFRAMES>
</HTML>

Die Datei navi.html sieht folgendermaßen aus:

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript"><!--
function fernsteuerung(){
   var fenster = window.open("remote.html", "fern", "height=200,
     width=400,status=1")
   if (fenster.opener == null)
      fenster.opener = self
}
//--></SCRIPT>
<BODY>
<A HREF="javascript:fernsteuerung()">Fernsteuerung öffnen</A>
</BODY>
</HTML>

Es passiert also nichts Weltbewegendes: Durch den Klick auf den Link wird ein neues Fenster mit der Datei remote.html geladen. Diese sieht folgendermaßen aus:

<HTML>
<HEAD>
<TITLE>Fernsteuerung</TITLE>
<SCRIPT LANGUAGE="JavaScript"><!--
function lade(seite){
   //kommt noch...
}
//--></SCRIPT>
</HEAD>
<BODY>
<H3>Meine Lieblingslinks</H3>
<UL>
<LI><A HREF="javascript:lade('http://www.microsoft.com')">Microsoft</A>
<LI><A HREF="javascript:lade('http://www.netscape.com')">
  Netscape</A>
<LI><A HREF="javascript:lade('http://www.opera.com')">Opera</A>
</UL>
<A HREF="javascript:window.close()">Fenster schließen</A>
</BODY>
</HTML>

In der Funktion lade() muss die übergebene URL in den unteren Frame der Beispielsseite geladen werden. Mit der Eigenschaft window.opener hat man eine Referenz auf den oberen Frame, und – wie im Kapitel »Fenster II« gezeigt – kann man dann auf den unteren Frame zugreifen:

function lade(seite){
   if (window.opener!=null)
      window.opener.parent.frames[1].location.href = seite
}

Galileo Computing

10.2.2 Links ohne JavaScript  downtop

Eigentlich ist dieses Vorgehen zu umständlich. Man kann auch mit ordinären HTML-Links arbeiten. Als TARGET-Attribut gibt man den Namen des Frames bzw. des Fensters an, in den bzw. das die neue Seite geladen werden soll.

Im obigen Beispiel wurde jedoch aus Versehen kein Name für den Frame angegeben; bei Fenstern haben Sie ja ohnehin standardmäßig keinen Namen. Mit JavaScript lässt sich dieser Name jedoch ganz einfach vergeben; die entsprechende Eigenschaft heißt name.

Ändern Sie also die Funktion fernsteuerung() folgendermaßen ab:

function fernsteuerung(){
   var fenster = window.open("remote.html", "fern", "height=200,
     width=400,status=1")
   self.name = "Ziel"
   if (fenster.opener == null)       fenster.opener = self }

Die Fernsteuerung besteht dann aus (beinahe) reinem HTML-Code:

<HTML>
<HEAD>
<TITLE>Fernsteuerung</TITLE>
</HEAD>
<BODY>
<H3>Meine Lieblingslinks</H3>
<UL>
<LI><A HREF="http://www.microsoft.com" TARGET="Ziel">Microsoft</A>
<LI><A HREF="http://www.netscape.com" TARGET="Ziel">Netscape</A>
<LI><A HREF="http://www.opera.com" TARGET="Ziel">Opera</A>
</UL>
<A HREF="javascript:window.close()">Fenster schließen</A>
</BODY>
</HTML>

Galileo Computing

10.3 Fenster schließen  downtop

Wie Sie bereits gesehen haben, kann ein Fenster mit Fensterreferenz.close() geschlossen werden. Es gibt jedoch eine Einschränkung: Laden Sie doch einmal folgende HTML-Seite in Ihren Browser:

<HTML>
<HEAD>
<TITLE>window.close()</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript"><!--
window.close()
</SCRIPT>
</BODY>
</HTML>
gp  Sie sollten eine Warnung erhalten (zumindest ab Netscape Navigator 3 bzw. Internet Explorer 4). Das wäre ja auch noch schöner, wenn man mit JavaScript jedes beliebige Fenster schließen könnte. Fenster, die mit JavaScript geöffnet wurden, können jedoch problemlos geschlossen werden, wie Sie im vorherigen Abschnitt ja schon gesehen haben.
Abbildung 10.3  Warnmeldung beim Schließen eines Fensters,
das nicht mit JavaScript geöffnet worden ist
Abbildung


Galileo Computing

10.3.1 Andere Fenster schließen  downtop

Etwas komplizierter ist es jedoch, wenn ein anderes Fenster geschlossen werden soll. Angenommen, der Benutzer schließt das Fenster mit der systemspezifischen Tastenkombination (unter Windows beispielsweise mit (Alt)+(F4)). Die Variable, in der eine Referenz auf das Fenster abgespeichert ist, verschwindet dadurch ja nicht. Ist das Fenster also schon geschlossen, würde Fensterreferenz.close() eine Fehlermeldung ausspucken.

gp  Die Fernsteuerung soll so abgeändert werden, dass sie von der Hauptseite aus wieder geschlossen werden kann. Ab Netscape Navigator 3 gibt es die Fenstereigenschaft closed, einen Booleschen Wert, der angibt, ob das Fenster noch offen ist oder nicht. Somit kann die Datei navi.html folgendermaßen geändert werden, damit die gewünschte Funktionalität sichergestellt wird:
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript"><!--
var fenster //Variable muss global sein!
function fernsteuerung(){    fenster = window.open("remote.html", "fern", "height=200,
     width=400,status=1")
   self.name = "Ziel"    if (fenster.opener == null)       fenster.opener = self } function schliessen(){
   if (fenster && !fenster.closed)
      fenster.close()
}
//--></SCRIPT> <BODY> <A HREF="javascript:fernsteuerung()">Fernsteuerung öffnen</A><BR>
<A HREF="javascript:schliessen()">Fernsteuerung schließen</A>
</BODY> </HTML>

Das Kernstück ist die Abfrage if (fenster && !fenster.closed). Wie Sie bereits wissen, werden Boolesche Ausdrücke in JavaScript von links nach rechts ausgewertet. Wurde also noch kein Fenster geöffnet, wird der rechte Teil der Bedingung gar nicht mehr überprüft, und es kommt auch keine Fehlermeldung. Falls schon einmal ein Fenster geöffnet wurde, wird der rechte Teil überprüft. Ist die Eigenschaft fenster.closed gleich false, muss das Fenster noch offen sein, also wird es geschlossen.


Galileo Computing

10.3.2 Lösung für ältere Browser  downtop

gp  Für Internet Explorer 3 und Netscape Navigator 2 muss man sich etwas besonderes einfallen lassen. Eine zuverlässige Lösung ist folgende: Bevor versucht wird, das Fenster zu schließen, wird es noch einmal geöffnet, und zwar mit demselben zweiten Parameter (Fensternamen) wie zuvor. Wie Sie bereits wissen, wird genau dann kein neues Fenster geöffnet, wenn das alte noch offen ist. Das Ergebnis dieser Aktion ist aber klar: Es existiert auf jeden Fall ein (offenes) Fenster, das dann geschlossen werden kann.
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript"><!--
var fenster //Variable muss global sein!
function fernsteuerung(){
   fenster = window.open("remote.html", "fern", "height=200,
     width=400,status=1")
   self.name = "Ziel"
   if (fenster.opener == null)
      fenster.opener = self
}
function schliessen(){
   fenster = window.open("", "remote", "height=200,width=400")
   if (fenster)
      fenster.close()
}
//--></SCRIPT> <BODY> <A HREF="javascript:fernsteuerung()">Fernsteuerung öffnen</A><BR> <A HREF="javascript:schliessen()">Fernsteuerung schließen</A> </BODY> </HTML>

Einen kleinen Preis muss man jedoch zahlen: Man sieht ein kurzes Flackern des Fensters. Es wäre also effizienter, nur beim Netscape Navigator 2 und beim Internet Explorer 3 das Fenster (evtl. erneut) zu öffnen. Der Code wird dadurch zwar ein wenig hässlicher, aber bei einer Großzahl von Nutzern wird das Fenster ohne Störungen geschlossen.

function schliessen(){
   NN2 = (navigator.userAgent.indexOf("mozilla")!=
-1&&parseInt(navigator.appVersion)==2)
   IE3 = (navigator.userAgent.indexOf("msie")!=
-1&&parseInt(navigator.appVersion)<4)
   if (NN2||IE3)
      fenster = window.open("", "remote", "height=200,width=400")
   if (fenster && !fenster.closed)
      fenster.close()
}

Galileo Computing

10.4 Fenster in den Vordergrund holen  downtop

Mit der Fensteroption alwaysRaised kann man im Netscape Navigator ab Version 4 einstellen, dass das neue Fenster immer vor allen anderen Browser-Fenstern erscheinen soll – aber das geht wie gesagt nur beim Netscape Navigator, und außerdem braucht man ein signiertes Skript. Man kann diesen Effekt jedoch relativ leicht nachbilden. Sie erinnern sich vielleicht an das Kapitel über Formularfelder (»Formulare I«). Dort stand folgender Code in einem Texteingabefeld, das schreibgeschützt werden sollte: onFocus="this.blur()". In unserem Fall wird genau das Gegenteil benötigt: Wenn das Fenster den Focus verliert, soll es ihn wieder erhalten!

Es reicht natürlich beinahe, einfach die beiden Begriffe auszutauschen:

<BODY onBlur="if (window.focus) window.focus()">

Die Abfrage hat folgenden Hintergrund: window.focus() gibt es erst ab Netscape Navigator 3 und Internet Explorer 4. Bei älteren Browsern kann man die Fehlermeldung aber ganz einfach abfangen: window.focus (ohne Klammern!) gibt dann false zurück.

Bevor Sie dieses Skript jedoch exzessiv einsetzen, denken Sie zweimal nach. Wenn sich ein Fenster stets in den Vordergrund drängt, wird es ganz schnell abgeschossen (sprich: geschlossen). Es gibt kaum eine Anwendung, in der so ein Fensterverhalten angebracht wäre.

Der Sinn des ganzen Exkurses: Ihnen ist vielleicht aufgefallen, dass die Fernsteuerung natürlich nicht mehrmals geöffnet wird, wenn Sie mehrmals auf den Fernsteuerungslink klicken (warum?); aber sie verschwindet beim zweiten Öffnen in den Hintergrund bzw. kommt nicht in den Vordergrund wie beim ersten Öffnen. In diesem Fall kann window.focus() wirklich sinnvoll eingesetzt werden. Ändern Sie die Funktion fernsteuerung() folgendermaßen ab:

function fernsteuerung(){
   (if !fenster && fenster.closed){
      fenster = window.open("remote.htm", "fern", "height=200,         width=400,status=1")       self.name = "Ziel"       if (fenster.opener == null)          fenster.opener = self } else {
   if (fenster.focus) fenster.focus()
}

Galileo Computing

10.5 Fenster bewegen mit JavaScript  downtop

Prinzipiell gibt es zwei Möglichkeiten, ein Fenster zu bewegen, und das ist reine Definitionssache. Entweder wollen Sie das gesamte Fenster irgendwo hinbewegen, oder Sie wollen den Inhalt des Fensters scrollen. Beides ist mit neueren Browsern möglich und wird an dieser Stelle kurz vorgestellt.


Galileo Computing

10.5.1 Fenster verschieben  downtop

Eine häufig gestellte Frage lautet: Wie kann ich das Browser-Fenster zentrieren? Andere Leute wiederum möchten, dass das Browser-Fenster maximiert oder minimiert wird (soviel vorweg, das ist nicht möglich), oder sich am oberen Bildschirmrand befindet. Dies ist kein aufwendiges Verfahren, es müssen einfach entsprechende Eigenschaften des window-Objekts gesetzt oder ausgelesen oder Methoden aufgerufen werden. Übertreiben Sie es jedoch nicht mit diesen Effekten. Viele Webbesucher reagieren ziemlich giftig, wenn man ihnen vorschreiben will, wo sich ein Fenster befindet.

Der Netscape Navigator (ab Version 4) kann ein Fenster verschieben, und zwar sowohl an eine bestimmte Position als auch um einen gewissen Wert. Dazu gibt es zwei Methoden:

gp  window.moveTo(x, y): Verschiebt das Fenster so, dass die linke obere Ecke die Koordinaten (x, y) hat. Es handelt sich hier um eine absolute Verschiebung. Sie können das Fenster damit nicht aus dem sichtbaren Bereich hinaus verschieben, außer Sie verwenden signierte Skripten (die werden gegen Ende des Buches vorgestellt).
gp  window.moveBy(x, y): Verschiebt das Fenster horizontal um x Pixel, vertikal um y Pixel, also eine relative Verschiebung. Auch hier kann das Fenster nicht aus dem sichtbaren Bereich hinaus verschoben werden.

Erinnern Sie sich noch an die Auflistung der Parameter für window. open()? All diese Parameter sind auch gleichzeitig Eigenschaften für das window-Objekt. Somit werden beispielsweise mit window.outerHeight und window.outerWidth die Ausmaße des Browser-Fensters angegeben.

Um nun die Maximierung eines Fensters zu simulieren (man führt damit nicht die API-Funktion für die Fenstermaximierung aus, sondern vergrößert das Fenster nur entsprechend), muss man noch die Ausmaße des Bildschirms bestimmen. Seit JavaScript 1.2 kann man diese Werte aus dem screen-Objekt erhalten:

gp  screen.availWidth enthält die Bildschirmbreite.
gp  screen.availHeight enthält die Bildschirmhöhe.

Eine Funktion zum Maximieren des Fensters sieht also folgendermaßen aus. Die linke obere Ecke des Fensters wird zunächst an die linke obere Ecke des Bildschirms gesetzt, und dann wird das Fenster entsprechend vergrößert.

function maximieren(){
   window.moveTo(0, 0)
   window.outerHeight = screen.availHeight
   window.outerWidth = screen.availWidth
}

Galileo Computing

10.5.2 Fensterinhalt scrollen  downtop

Schon mit JavaScript Version 1.1 wurden Methoden zum Scrollen des Fensterinhalts eingeführt. Die dazugehörige Methode heißt window. scroll(x, y). Sie scrollt den Fensterinhalt an die angegebenen Koordinaten. Es ist eigentlich unlogisch, dass das Scrollen eine Methode des window-Objekts ist, da ja nicht das Fenster gescrollt wird, sondern das Dokument, das sich darin befindet. Auch hier gilt: Übertreiben Sie es nicht. Der Benutzer ärgert sich immer, wenn er das Gefühl hat, nicht die Kontrolle über ein Fenster zu besitzen. Scrollen Sie also nur dann, wenn es wirklich Sinn macht.

Eine der möglichen Anwendungen besteht darin, nach oben zu scrollen. Auf vielen, längeren Webseiten finden Sie einen Link, der nach oben scrollt – Sie ersparen Ihren Benutzern so die Mühe, mit der Maus den Scrollbalken zu treffen. Dieser Effekt wird meistens so angeboten:

<A HREF="#top">nach oben</A>

Am Anfang des Dokuments befindet sich dann eine Textmarke namens "top", zu der dann gescrollt wird. Das ist ein netter Effekt, vor allem bei längeren Dokumenten. Zum einen jedoch ändert sich die URL – was Neulinge immer stark irritiert, man glaubt es kaum – und zum anderen ist es bei komplexeren Dokumenten nicht immer möglich, ganz oben eine Textmarke unterzubringen, Wenn beispielsweise direkt nach dem <BODY>-Tag ein Werbebanner eingefügt wird (das hat der Gratis-Hoster Hypermart früher so gemacht), kann man nie nach ganz oben scrollen.

Mit JavaScript 1.1 geht das Scrollen an den Dokumentenanfang ganz bequem. Es muss einfach zu den Koordinaten (0, 0) gescrollt werden. Damit es bei älteren Browsern keine Fehlermeldung gibt, kann man beispielsweise Folgendes versuchen:

<A HREF="javascript:if (window.scroll) 
window.scroll(0, 0)">nach oben</A>

Dann wäre der Link jedoch inaktiv, wenn der Benutzer einen älteren Browser (zum Beispiel Internet Explorer 3) verwendet. Aus diesem Grund sollte man hier den Link mit document.write() erzeugen.

<SCRIPT LANGUAGE="JavaScript1.1"><!--
function tag(s) { return "<"+s+">" }
document.write(tag("A HREF='javascript:window.scroll(0, 0)'")+
  "nach oben"+tag("/A"))
//--></SCRIPT>

Wie bereits erwähnt, verbietet sich das jedoch innerhalb einer Tabellenzelle. So ist die folgende Lösung wohl die optimale: Es existiert auch eine Textmarke, aber wenn der Browser die scroll-Methode unterstützt, wird diese verwendet:

<A HREF="#top" onClick="if (window.scroll) {window.scroll(0, 0);
  return false}">nach oben</A>

Netscape hat mit JavaScript 1.2 bzw. seiner Version 4 zwei neue Methoden eingeführt. Dabei verhält sich window.scrollTo(x, y) identisch zu window.scroll(x, y), während window.scrollBy(x, y) neu ist: Genau so wie bei window.moveBy(x, y) wird hier relativ gescrollt.

Die Methoden zum Scrollen werden im Zusammenhang mit der exakten Positionierung von HTML-Dokumenten bei DHTML noch interessant werden; fürs erste aber sollte dieser Einblick genügen.


Galileo Computing

10.6 Fragen & Aufgaben  toptop

1. Erstellen Sie eine HTML-Seite mit drei Textmarken. Mit einer Fernsteuerung in einem neuen Fenster soll jede dieser Marken angesprungen werden können.
2. Erstellen Sie (für Netscape Navigator 4) eine Funktion center(), die das aktuelle Fenster auf dem Bildschirm zentriert.
3. Wie könnte man an das Ende eines Dokuments scrollen?
4. Öffnen Sie ein neues Fenster, das sich in der linken oberen Bildschirmecke befindet. Achten Sie darauf, dass das sowohl mit dem Netscape Navigator als auch mit dem Internet Explorer funktioniert!
  

Webseiten

CSS-Praxis

Kompendium Informations-
technik

Der eigene Webserver

PC-Netzwerke




Copyright © Galileo Press GmbH 2001 - 2002
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken und speichern. Ansonsten unterliegt das <openbook> denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
Die Veröffentlichung der Inhalte oder Teilen davon bedarf der ausdrücklichen schriftlichen Genehmigung von Galileo Press. Falls Sie Interesse daran haben sollten, die Inhalte auf Ihrer Website oder einer CD anzubieten, melden Sie sich bitte bei: stefan.krumbiegel@galileo-press.de


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, fon: 0228.42150.0, fax 0228.42150.77, info@galileo-press.de