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 18 DHTML III: Netscape 6
  gp 18.1 Grundlagen
  gp 18.2 Beispiele
  gp 18.3 Fragen & Aufgaben

Kapitel 18 DHTML III: Netscape 6

Überhaupt hat der Fortschritt das an sich,
dass er viel größer ausschaut, als er ist.
– Johann Nepomuk Nestroy

Spätsommer 2000. Nach langem Hickhack veröffentlicht Netscape ziemlich überraschend Version 6 seines Browsers. Zunächst erschien eine Preview Release 1, dann eine Preview Release 2, und schließlich Version 6.0. Die Fachwelt war erstaunt, schließlich ließ das unter www.mozilla.org zur Verfügung stehende Open-Source-Pendant in Sachen Stabilität und Zuverlässigkeit nur Übles vermuten. Die Veröffentlichung wurde von einem großen Medien-Hype begleitet, denn der Internet Explorer hatte den Netscape Navigator in Sachen Verbreitung mittlerweile deutlich überholt, und viele Beobachter sahen in der Veröffentlichung des Netscape 6 eine Möglichkeit, die Microsoft-Bastion zu erstürmen (genauer gesagt handelt es sich um eine Netscape-Bastion, die mittlerweile von Microsoft gestürmt worden war). Und der Netscape 6 wäre dazu wohl auch in der Lage – wäre er stabil, doch das ist momentan leider noch nicht der Fall. In Zukunft wird sich da noch viel tun, so viel ist gewiss.

Das Problem liegt an einer anderen Stelle. Aufgrund des erwähnten Hype wurde der neue Netscape von vielen Benutzern installiert. DHTML-Seiten, die sich mittlerweile ja großer Beliebtheit erfreuen, sind jedoch auf Internet Explorer ab Version 4 sowie auf Netscape Navigator 4 ausgerichtet, der Netscape 6 bleibt hier außen vor. Aus mangelndem Wissen und/oder fehlender Literatur haben bis dato auch nur sehr wenige Websitebetreiber ihre Seiten umgestellt, sodass sie auch mit dem Netscape 6 funktionieren. Zumindest der Punkt fehlender Literatur sollte mit diesem Buch behoben sein. Es ist ja gar nicht einmal viel, was verändert werden muss, und Sie finden die notwendigen Informationen in diesem und im nächsten Kapitel.

Vom Kapitelaufbau orientieren wir uns an den beiden vorhergehenden Kapiteln. Zunächst legen wir die Grundlagen für den Zugriff dar, und dann exerzieren wir die bestehenden Beispiele noch einmal durch – diesmal aber für Netscape 6. Aus diesem Grund sind die Beschreibungen bei den Beispielen selbst eher kurz gefasst, denn Sie wissen ja bereits, wie der Hase prinzipiell läuft. Auf die Anpassung für Netscape 6 kommt es an, und hierauf wird jeweils explizit eingegangen.

Eines der Beispiele, das Drag&Drop-Beispiel, funktioniert unter dem Netscape 6 noch nicht so wie vorgesehen. Ein Bug würde eine komplett andere Implementierung erfordern, weshalb wir das Beispiel weglassen.


Galileo Computing

18.1 Grundlagen  downtop

Das DOM des Netscape 6 ähnelt dem des Internet Explorer 5.x sehr stark, was auch kein Wunder ist – orientieren sich beide Modelle ja mehr oder weniger stark an der W3C-Empfehlung. Demnach kann auf alles, was zwischen Tags eingeschlossen ist, per JavaScript zugegriffen werden, beispielsweise auf die Schriftfarbe eines Absatzes.


Galileo Computing

18.1.1 HTML-Tags  downtop

Auch beim Netscape 6 ist der ID-Parameter wichtig, um bequem auf einzelne Elemente zugreifen zu können:

<P ID="Galileo">Galileo Press</P>

Dieser Absatz ist jetzt mit der ID Galileo assoziiert und Sie können mit JavaScript darauf zugreifen. Wie das geht, erfahren Sie in Kürze.

So etwas wie Layer gibt es beim Netscape 6 auch. Sie verwenden den altbekannten Tag <DIV>. Der <LAYER>-Tag wird von Netscape 6 nicht mehr unterstützt. Er wird in der Praxis ignoriert, d. h., das alles, was innerhalb dieses Tags steht, zwar angezeigt wird, aber Sie können über die ID des Layers nicht auf dessen Inhalt zugreifen.

<DIV ID="DIV1">
<!-- HTML-Kommandos etc. -->
</DIV>

Dem <DIV>-Tag gibt man oft einen STYLE-Parameter mit, um beispielsweise dessen Inhalt unsichtbar zu machen.


Galileo Computing

18.1.2 Objektzugriff  downtop

Das document-Objekt hat unter Netscape 6 die praktische Methode getElementById(). Dieser wird als Parameter der Wert des ID-Attributs des entsprechenden Tags übergeben, und sie liefert dafür das entsprechende Element zurück. Über die style-Eigenschaft des Elements können Sie dann das Aussehen des Elements beeinflussen.

Mit dem folgenden Code macht man beispielsweise den Layer "DIV1" aus dem obigen Beispiel unsichtbar:

document.getElementById("DIV1").style.visibility = "hidden"

Diese Syntax ist natürlich insofern verlockend, als dass Sie als Wert für den ID-Parameter auch Leer- und Sonderzeichen verwenden können. Im Sinne der Kompatibilität zu den anderen Browsern sollten Sie dies aber tunlichst vermeiden!

Um festzustellen, ob ein bestimmter Browser die Methode getElementById überhaupt unterstützt, können Sie wie gehabt eine if-Abfrage verwenden:

if (document.getElementById){
   //Code für Netscape 6
}
gp  Auch der Internet Explorer ab Version 5 kennt document.getElementById. Wie Sie einen Netscape 6 von einem IE 5.x unterscheiden, erfahren Sie im nächsten Kapitel!

Galileo Computing

18.2 Beispiele  downtop

Im Folgenden finden Sie fast alle der bekannten Beispiele aus den beiden vorhergehenden Kapitel, diesmal für den Netscape 6 ausgerichtet. Hier noch einmal das Versprechen: Im nächsten Kapitel werden wir tatsächlich browserübergreifend.


Galileo Computing

18.2.1 Animiertes Logo  downtop

Das animierte Logo ist das erste Beispiel, das wir auf den neuesten Netscape-Browser portieren möchten. Hier zunächst der HTML-Code, natürlich mit einem <DIV>-Element:

<HTML>
<HEAD>
<TITLE>Animiertes Logo</TITLE>
</HEAD>
<BODY onLoad="init()">
<H3>Animiertes Logo</H3>
<DIV ID="logo" STYLE="position:relative"><IMG SRC="logo.gif"></DIV>
</BODY>
</HTML>

Obwohl dies das erste Beispiel ist, gibt es hier schon ein wenig babylonische Verwirrung. Der Zugriff auf die Objekteigenschaften geschieht wie beim Internet Explorer: style.eigenschaft. Der große Pferdefuß: Erhält man die Koordinaten der linken oberen Ecke des <DIV>-Elements mit posLeft und posTop, so verwendet Netscape 6 hier die Eigenschaftennamen, die Sie schon aus Kapitel 16 kennen: left und top. Damit geht der Netscape 6 übrigens mit der W3C-Empfehlung konform, der Internet Explorer kocht hier ein eigenes Süppchen.

Es sind also die folgenden Schritte zu tun:

1. Ausgangsbasis ist das für den Internet Explorer angepasste Skript.
2. Der Zugriff auf die Objekte geschieht jetzt mit document.getElementById.
3. Die x- und y-Koordinate der linken oberen Ecke des <DIV>-Elements wird wie beim Netscape Navigator bestimmt.

Wenn Sie diese Änderungen nun vornehmen, werden Sie feststellen, dass das Skript nicht wie gewünscht läuft. Der Grund: Die Eigenschaften top und left sind keine nummerischen Werte, sondern Strings. Sie enthalten Werte wie beispielsweise "200px" für 200 Pixel. Es macht dem JavaScript-Interpreter nichts aus, wenn Sie nummerische Werte zuweisen – die Umwandlung geschieht automatisch –, aber wenn Sie wie im Beispiel mit den Werten rechnen möchten, müssen Sie sie zunächst in Integer-Werte umwandeln. Dies geht mit der Funktion parseInt.

Das Skript sieht dann folgendermaßen aus:

<HTML>
<HEAD>
<TITLE>Animiertes Logo</TITLE>
<SCRIPT LANGUAGE="JavaScript"><!--
function init(){
   if (document.getElementById)
      document.getElementById("logo").style.left = "-200px"
   //Animation starten
   animate()
}
function animate(){
   if (parseInt(document.getElementById("logo").style.left)>0)
      document.getElementById("logo").style.left = 0
   if (parseInt(document.getElementById("logo").style.left)<0){
      document.getElementById("logo").style.left = 
         parseInt(document.getElementById("logo").style.left) + 3
      setTimeout("animate()", 50)
   }
}
//--></SCRIPT>
</HEAD>
<BODY onLoad="init()">
<H3>Animiertes Logo</H3>
<DIV ID="logo" STYLE="position:relative"><IMG SRC="logo.gif"></DIV>
</BODY>
</HTML>
Abbildung 18.1  Das Logo im Anflug von links
Abbildung


Galileo Computing

18.2.2 Sichtbar und unsichtbar  downtop

Als nächstes wird das Beispiel mit den Registern angepasst. Im Vergleich zur Lösung für den Internet Explorer ändert sich kaum etwas. Wieder wird getElementById eingesetzt, der Rest bleibt im Prinzip gleich:

<HTML>
<HEAD>
<TITLE>Register</TITLE>
<STYLE TEXT="text/css"><!--
A {color:black; text-decoration:none}
--></STYLE>
<SCRIPT LANGUAGE="JavaScript"><!--
function init(){
   var layer_x = document.getElementById("register1").style.left
   var layer_y = document.getElementById("register1").style.top
   document.getElementById("register2").style.left = layer_x
   document.getElementById("register2").style.top = layer_y
   document.getElementById("register2").style.visibility = "hidden"
   document.getElementById("register3").style.left = layer_x
   document.getElementById("register3").style.top = layer_y
   document.getElementById("register3").style.visibility = "hidden"
}
function register(n){
   for (var i=1; i<=3; i++){
      var visi = (i==n) ? "visible" : "hidden"
      document.getElementById("register"+i).style.visibility = visi
   }
}
//--></SCRIPT>
</HEAD>
<BODY onLoad="init()">
<TABLE><TR>
<TD BGCOLOR="red">
   <A HREF="javascript:register(1)">Register 1</A>
</TD>
<TD BGCOLOR="green">
   <A HREF="javascript:register(2)">Register 2</A>
</TD>
<TD BGCOLOR="blue">
   <A HREF="javascript:register(3)">Register 3</A>
</TD>
</TR></TABLE>
<DIV ID="register1" STYLE="position:absolute">
   <H3>Register 1</H3>
</DIV>
<DIV ID="register2" STYLE="position:absolute">
   <H3>Register 2</H3>
</DIV>
<DIV ID="register3" STYLE="position:absolute">
   <H3>Register 3</H3>
</DIV>
</BODY>
</HTML>
Abbildung 18.2  Registerreiter mit DHTML
Abbildung

gp  Beachten Sie, dass die Positionierung der Layer absolut sein sollte, damit die einzelnen Register auch direkt unterhalb der drei Links angezeigt werden!

Galileo Computing

18.2.3 Neuer Mauszeiger  downtop

Das Beispiel wird ebenso schnell umgesetzt wie die beiden vorherigen DHTML-Effekte. Die Ereignisbehandlung lehnt sich an der des Netscape Navigator an (Parameter e für Ereignisbehandlungsmethoden), der prinzipielle Elementzugriff am Internet Explorer (über ID-Attribut, nur eben unter Verwendung von getElementById), und der Namen der einzelnen Koordinaten wiederum am Netscape Navigator (left/top). Das wirkt zwar zunächst ein wenig verwirrend, aber nach ein paar Beispielen kennt man die Unterschiede im Schlaf.

<HTML>
<HEAD>
<TITLE>Mauszeiger</TITLE>
<SCRIPT LANGUAGE="JavaScript"><!--
function init(){
   document.onmousemove=anim
}
function anim(e){
   document.getElementById("mauszeiger").style.left = e.pageX
   document.getElementById("mauszeiger").style.top = e.pageY
}
//--></SCRIPT>
</HEAD>
<BODY BGCOLOR="white" onLoad="init()">
<H1>Mauszeiger</H1>
<DIV ID="mauszeiger" STYLE="position:absolute"><IMG SRC="logo.gif"></DIV>
</BODY>
</HTML>
Abbildung 18.3  Das Galileo-Logo als Mauszeiger
Abbildung


Galileo Computing

18.2.4 Permanentes Werbebanner  downtop

Zum letzten Beispiel: auch hier gibt es prinzipiell nicht viel Neues. Da das Listing aber ein wenig länger ist, wollen wir hier – ähnlich wie im vorhergehenden Kapitel – schrittweise vorgehen. Zunächst muss in der Funktion init()der Layer sichtbar gemacht und anim() aufgerufen werden:

function init(){
   document.all.logo.style.visibility="visible"
   anim()
}

In der Funktion anim() wird wie zuvor die neue Position des Werbebanners berechnet, das Banner dorthin verschoben, und dann die Funktion via Timeout nach einer halben Sekunde erneut aufgerufen. Jedoch heißen die Eigenschaften, die beispielsweise die aktuelle Scrollposition des Browserfensters enthalten, beim Internet Explorer (und wohl auch beim Netscape 6) komplett anders als beim Netscape Navigator 4. Aus window.innerWidth (Breite des Browserfensters) wird document.body.clientWidth, und window.pageXOffset und window.pageYOffset finden in document.body. scrollLeft und document.body.scrollTop ihre Entsprechung. Der Rest bleibt beinahe gleich. Kleiner Unterschied am Rande: document.body. clientWidth arbeitet viel exakter als das Netscape-Pendant, man muss von diesem Wert also in der Tat nur die Breite der Grafik abziehen, und nicht etwas mehr, wie das noch beim Netscape Navigator 4 der Fall war.

function anim(){
   document.all.logo.style.posLeft = document.body.clientWidth +
     document.body.scrollLeft – 89
   document.all.logo.style.posTop = document.body.scrollTop}
   setTimeout("anim()", 500)
}
Abbildung 18.4  Das Galileo-Logo als immer sichtbares Werbebanner
Abbildung

Zum Abschluss dieses Beispiels (und dieses Kapitels) noch einmal das komplette Listing wie Sie es auf der Buch-CD finden.

<HTML>
<HEAD>
<TITLE>Werbebanner</TITLE>
<SCRIPT LANGUAGE="JavaScript"><!--
function init(){
   document.getElementById("logo").style.visibility="visible"
   anim()
}
function anim(){
   document.getElementById("logo").style.left = 
      window.innerWidth + window.pageXOffset – 100
   document.getElementById("logo").style.top = window.pageYOffset
   setTimeout("anim()", 500)
}
//--></SCRIPT>
</HEAD>
<BODY BGCOLOR="white" onLoad="init()">
<H1>Werbebanner</H1>
<DIV ID="logo" STYLE="visibility:hide;position:absolute">
<A HREF="http://www.galileo-press.de"><IMG SRC="logo.gif" BORDER="0"></A>
</DIV>
<SCRIPT LANGUAGE="JavaScript"><!--
for (var i=0; i<30; i++)
   document.write("F&uuml;lltext")
for (i=0; i<3; i++){
   for (var j=0; j<10; j++)
      document.write("<"+"BR"+">")
   document.write("F&uuml;lltext")
}
//--></SCRIPT>
</BODY>
</HTML>

Galileo Computing

18.3 Fragen & Aufgaben  toptop

1. Gehen Sie zu dem Beispiel mit den zwei verschachtelten Layern zurück. Wie könnte man von der Schaltfläche aus auf das Hauptdokument zugreifen?
2. Ändern Sie das Beispiel mit dem animierten Logo so, dass a) das Logo von rechts einschwebt, b) es diagonal von links oben kommt.
3. Ändern Sie das permanente Werbebanner so um, dass es auf Mausklick verschwindet.
  

Perl – Der Einstieg




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