JavaScript - Einführung 1. Ein Wort zuvor Leider muss ich gestehen
Transcription
JavaScript - Einführung 1. Ein Wort zuvor Leider muss ich gestehen
JavaScript - Einführung 1. Ein Wort zuvor Leider muss ich gestehen, dass sich mein Know-How in Punkto JavaScript lange, lange Zeit in Grenzen hielt. Das Ganze beruhte auf einer Art Trauma, das ich um 1999 erlitten haben muss. Damals gab es noch keine PopUp-Blocker. Ich besuchte eine Seite (nicht mal Schweinkram!), wollte sie schließen und 5000 neue Fenster gingen auf, immer und immer wieder. Das führte dazu, das sich mein Internet Explorer total verabschiedete und ich Windows (damals noch 98) komplett neu installieren musste. Danach habe ich JavaScript deaktiviert, und mich jahrelang nicht mehr darum gekümmert. Ab Mitte 2003 fing ich an, mich ein wenig mit diesem Thema zu beschäftigen, und das auch fast nur in Kombination mit der Manipulation von CSS-Anweisungen. Erst seit dem AJAXHype habe ich mich wirklich intensiv damit beschäftigt. Das werdet ihr hier im Theorieteil nicht sonderlich merken, aber bei den Tutorials werde ich euch peu à peu mit meinem erworbenen Wissen quälen. Auch wenn ich selber zugegebenermaßen des Öfteren immer noch nicht ganz begreife, was es mit dieser Sprache auf sich hat. 2. Einführung JavaScript ist nicht Java! Entwickelt wurde die Sprache im Jahre 1995 von der Firma Netscape (kennt die noch einer?), um den hauseigenen Browser namens Navigator (kennt den noch einer?) um zusätzliche Funktionalitäten zu erweitern. Die ursprüngliche Bezeichnung war LiveScript, wurde aber im Zuge des Java-Hypes Anfang 1996 in JavaScript umbenannt. Trotz des ähnliche klingenden Namens hat diese Sprach NICHTS mit Java gemeinsam, außer der sehr ähnlichen Syntax. Java ist eine plattformunabhängige Hochsprache, die in einen so genannten nativen Bytecode umgewandelt und dann von einer Virtual Machine ausgeführt wird. JavaScript dagegen ist, wie der Name schon sagt, eine Scriptsprache, die im Browser interpretiert wird. Aus Sicherheitsgründen werden die Scripte in einer so genannten "Sandbox" ausgeführt, die verhindert, dass man direkten Zugriff auf das lokale Dateisystem hat. 3. Schreibweise Auch hier wird auf die Java- C++-Syntax zurückgegriffen. Semikolon am Ende jeder Zeile, geschweifte Klammern, bis die rechte Hand schmerzt, und Kommentare werden durch /* ... */ oder // gekennzeichnet. Ein Beispiel könnte so aussehen. function tuWas () { // einzeiliger Kommentar setze Variable a = 1; /**************************/ /* mehrzeiliger Kommentar */ /**************************/ machIrgendwas (hiermit); } Gut, tut es in der Realität zwar nicht, aber hier geht's nur um einen ersten Einblick. Darum auch "könnte". 4. AJAX Dieser Begriff taucht immer wieder im Zusammenhang mit dem derzeit so heiß geliebten Buzzword Web 2.0 auf. Dabei handelt sich um eine Technik, die seit der Einführung der Internet Explorers 5.0 verfügbar ist. Das ist auch einer der wenigen Augenblicke, wo man Microsoft für eine wirklich gute Idee danken muss. Ja, nicht ungläubig den Kopf schütteln, das Ajax-Prinzip wurde wirklich von denen zum ersten Mal umgesetzt. Letztendlich geht es dabei darum, Daten im Hintergrund zu verarbeiten, ohne eine Seite komplett neu laden zu müssen. Ob aus diesem Hype sich ein Standard entwickelt, bleibt abzuwarten. Ich denke dabei vor allem an die oben beschriebene Java-Hysterie Mitte der 90er Jahre. Davon ist im Internet auch nur ein laues Lüftchen geblieben. Zumindest gemessen an den Erwartungen, die damals viele hatten. Ajax selber bietet trotz diverser Nachteile Möglichkeiten, die sehr interessant sind. Daher habe ich auch bei den Tutorials ein kleines Beispiel für euch parat, das euch einen ersten Einblick in die Materie liefert. JavaScript - Einführung - DOM 1. Erläuterung Was jetzt kommt, hatten wir doch schon einmal. Genau bei den Prinzipien der Kaskadierung von Cascading Style Sheets. Da habt ihr (hoffentlich) gelernt, dass HTML-Dokumente eine hierarchische Struktur haben. Es gibt Eltern- und Kindelemente, die in einem bestimmten Verhältnis zueinander stehen. Das Ganze nennt sich Document Object Model. Zur Erinnerung zeige ich euch noch mal das Beispiel: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Mein Titel</title> <link rel="stylesheet" href="styles.css" type="text/css"> </head> <body> <h1>Hier kommt eine Überschrift</h1> <p>Es folgt ein Absatz mit ein wenig Text</p> <table> <tr> <td>Text Spalte 1</td> <td>Text Spalte 2</td> <td>Text Spalte 3</td> </tr> </table> <!--Hier folgt noch eine Liste--> <ul> <li>Krä</li> <li>Bla</li> <li>Schwall</li> <li>Blubb</li> <li>Blubber</li> </ul> </body> </html> 2. Grafische Darstellung Durch diesen Aufbau ergibt sich eine Baumstruktur, die sich durch folgende Punkte auszeichnet: • Aus den so genannten Wurzelknoten (zum Beispiel <table> und <ul>) ergeben sich Verwandtschaftsbeziehungen • Die Wurzelknoten sind die Elternelemente (parents) • Die anderen Knotenpunkte sind die Kindelemente (childs) • Gleichwertige Knoten werden als Geschwister (siblings) bezeichnet, also zum Beispiel die <li>- und <td>-Elemente • Ausgehend vom obersten Wurzelknoten kann man jedes weitere Element ansprechen 3. Knotenarten • Dokumentknoten (er stellt die gesamte Baumstruktur dar) • Dokumentfragmentknoten (stellt einen Ausschnitt der Baumstruktur dar) • Elementknoten (repräsentiert ein HTML-Element) • Attributknoten (repräsentiert ein Attribut eines HTML-Element) • Textknoten (Textinhalt eines HTML-Elements oder Attributs) Eine Besonderheit sind die Attributknoten. Sie "hängen" nicht in der Baumsstruktur, sondern sind Eigenschaften der Elementknoten. JavaScript - Einführung - Einbindung JavaScript-Code kann an praktisch jeder Stelle innerhalb eines HTML-Dokumentes eingefügt werden. Dazu gibt es ähnlich wie bei CSS drei Möglichkeiten. 1. In HTML-Tags Hier können so genannte Event-Handler platziert werden. Das sind Routinen, die auf bestimmte Aktionen des Benutzers reagieren. Dabei können zum Beispiel Funktionen oder Methoden aufgerufen werden. Ich bringe hier nur ein kleines Beispiel, die Details kommen später. <img src="button.gif" onclick="alert('Hallo');"> 2. Innerhalb eines HTML-Dokuments Hier wird der JavaScript-Code innerhalb des <script>-Tags eingebunden. Allerdings solltet ihr nicht die alte Schreibweise benutzen <script language="javascript"> ...Hier kommt der Code ... </script> sondern die neue <script type="text/javascript"> ...Hier kommt der Code ... </script> Für die Hardcore-Programmierer gibt es noch eine dritte Variante: <script type="text/javascript" language="javascript"> ...Hier kommt der Code ... </script> Üblicherweise solltet ihr analog zu den CSS-Anweisungen alles im Kopf der jeweiligen Datei zusammenfassen, also zum Beispiel: <html> <head> <title>JavaScript</title> <script type="text/javascript"> function openWindow (uri) { window.open (uri,'News','width=500,height=350'); } </script> </head> <body> ... </body> </html> 3. In einer externen Datei Funktioniert genau so wie bei den CSS-Dateien, nur die Syntax ist ein klein wenig anders: <script src="menue.js" type="text/javascript"></script> 4. Wann was Auch hier gelten mal wieder (fast) dieselben Grundsätze, die ich schon bei den Cascading Style Sheets erläutert habe. • JavaScript-Code, der auf allen (oder den meisten) Seiten Gültigkeit hat, lagere ich in eine externe Datei aus. • Scripte, die nur in einer Seite benötigt werden, definiere ich im Kopf der jeweiligen Datei. • Event-Handler können (sollten aber nicht mehr) in HTML-Tags eingebunden werden. 5. Pfade Im Gegensatz zu CSS muss man in JavaScript die Pfade, zum Beispiel zu Bildern RELATIV zum HTML-Dokument setzen, in denen die externen JavaScript-Dateien eingebunden sind. JavaScript - Grundlagen - Einführung 1. Ein Wort zuvor Wie ich schon unter dem Menüpunkt Einführung sagte, sollte man sich lieber erst mit PHP beschäftigen und sich dann erst auf JavaScript stürzen. Daher findet ihr einen gute Einstieg zur Theorie der Programmierung bei PHP - Grundlagen. Alles, was ihr dort zum den Themen "Variablen", "Typisierung", "Operatoren" und "Funktionen" erfahrt, gilt auch für JavaScript. Das Prinzip ist das Selbe, die Unterschiede werde ich hier herausstellen. 2. Variablen Im Gegensatz zu PHP beginnen Variablen in JavaScript NICHT mit einem $-Zeichen. Ansonsten gelten die Regeln wie bei PHP, mit einer Ausnahme. Es dürfen keine so genannten reservierten Wörter benutzt werden. Deklaration von Variablen In JavaScript gibt es das Schlüsselwort var, dessen Sinn ich eigentlich nie ganz begriffen habe. Manchmal braucht man es, manchmal nicht, und keine Sau weiß, warum. var meine_variable = 1; Na ja, so ganz stimmt die Aussage nicht. var benötigt man zum Beispiel, um Variablen als global zu definieren. Das bedeutet, dass sie innerhalb eines Scriptes überall verfügbar sind. "Variable" Variablen ... werden bei JavaScript in eckige Klammern gesetzt. Will man zum Beispiel dynamisch auf ein Formularelement zugreifen, so muss man das so machen: formfeld = 'vorname'; formularname[formfeld].value = '' // entspricht formularname.vorname.value 2. Typisierung, Operatoren, Funktionen Typisierung Alles derselbe Quark bei schwach typisierten Sprachen. Also nachsehen bei PHP Grundlagen - Typisierung. Operatoren Alles derselbe Quark, also PHP - Grundlagen - Operatoren. Einen Unterschied gibt es aber. Der Verknüpfungsoperator ist in JavaScript nicht der Punkt (den braucht man hier für andere Dinge) sondern das Plus-Zeichen. var verknuepfi = 'Peter ' + 'Kropff'; Funktionen Dito, also PHP - Grundlagen - Funktionen 3. Bedingungen, Schleifen Auch hier sind die Prinzipien bei den Bedingungen und Schleifen die Selben. Es gibt nur zwei Ausnahmen, die foreach-Schleife existiert in JavaScript nicht und die Verarbeitung von Arrays funktioniert anders. Zu letzterem komme ich später, aber zu Ersterem gibt es eine Alternative. for in Dies ist das Pendant zu foreach in PHP und funktioniert fast genau so. Spielt mal ein wenig damit herum, dann werdet ihr die Feinheiten schon kennen lernen. var blubb = new Array (); blubb['bla'] = 'Laber'; blubb['schwall'] = 'Sülz'; blubb['kräh'] = 'Jodelbla'; for (bla in blubb) { alert (bla + '-' + blubb[bla]); } 4. Reservierter Wörter Da in JavaScript Variablen kein $ vor dem Namen haben, kann das zu Kollisionen führen. Nehmen wir mal folgendes Beispiel. Wir vergeben in PHP und JavaScript eine Variable mit demselben Namen: <?php $var = 'irgendwas'; ?> <script type="text/javascript"> var = 'irgendwas'; </script> Nun, die erste Variante ist erlaubt, die zweite nicht. Warum? Ganz einfach, var ist in JavaScript ein so genanntes Schlüsselwort, das zur Initialisierung einer Variable dient. Und dann kracht es. Daher darf man bestimmte Worte bei der Vergabe von Variablen- oder Funktionsnamen nicht verwenden. Eine komplette Liste findet ihr bei SelfHTML. JavaScript - Grundlagen - Objekte 1. Objekte Dieser Begriff stammt aus der Objekt Orientierten Programmierung (OOP). So, und jetzt gehen wahrscheinlich wieder die Streitigkeiten los, ob JavaScript nun objektorientiert oder objektbasiert ist. Mir ist das wurscht, also halte ich mich da raus. Was genau sind nun Objekte und was bedeuten sie? Also, ein Objekt ist ein Ding, mit dem man etwas machen kann oder das etwas hat. Toll, und nun? Nehmen wir mal als Beispiel ein Auto. Das ist dann unser Objekt. Nach welchen Kriterien wählen wir es aus? Farbe, Marke, Sicherheit und was weiß ich nicht. Das sind die Eigenschaften. Dann machen wir etwas damit. Wir fahren, putzen, reparieren es, stehen damit im Stau, führen liebevolle Gespräche, verfluchen es oder setzen es gegen einen Baum. Das sind die Methoden. Jedes Objekt kann ein oder mehrere Unterobjekte besitzen. Ein Auto hat zusätzlich einen Motor, Sitze, Radio, Räder, und so weiter. Und auch die verfügen über Eigenschaften und Methoden. 2. Eigenschaften Wie schon oben beschrieben, hat ein Objekt Eigenschaften. Diese kann man auslesen oder unter Umständen verändern. Man muss sich das in etwa so vorstellen. Unser Objekt Auto hat die Farbe rot. Die kann ich in Erfahrung bringen, indem ich mir die Kiste anschaue. Man hat aber auch die Möglichkeit, sie zu ändern, also wenn man seine Rostlaube in eine Lackiererei bringe und sage: "Mach mich mal de Karre in blau." [Quelle: Dieter Koslowski aus Herne] Leute aus anderen Gegenden benutzen natürlich ein anderes Idiom. 3. Methoden Habe ich auch schon beschrieben. Dabei handelt es sich um alles, was wir mit unserem Gefährt anstellen. 4. Die Sache mit den Pünktchen Durch die starke Anlehnung an Java und das DOM mit seiner Baumstruktur werden die einzelnen Objekte mit ihren Eigenschaften und Methoden durch einen Punkt zu einer Einheit verbunden. Vom Prinzip her müsst ihr euch das so vorstellen: objekt.unterobjekt.eigenschaft; objekt.unterobjekt.methode; Um mal bei unserem Beispiel mit dem Auto zu bleiben, könnte die Verarbeitung von Eigenschaften so aussehen: // Eigenschaft abfragen sag_farbe = auto.farbe; // Eigenschaft eines Unterobjektes ändern auto.radio.hersteller = 'irgendein Koreaner'; Bei den Methoden könnte man folgendes machen auto.radio.aufdreh(); auto.fahrOmaUm(); auto.verschrott(); auto.sitze.schmeissweg(); JavaScript - Grundlagen - Event-Handler 1. Begriffsbestimmung Ein EVENT ist ein Ereignis und ein HANDLER ist etwas, das dieses Ereignis kontrolliert. Bei jedweder Software versteht man darunter Aktionen des Benutzers. Und wie kann der den Ablauf eines Programms beeinflussen? Genau, mit so genannten Eingabegeräten. Da haben wir zum Beispiel die Maus oder auch Tastatur. 2. Maus-Ereignisse Was glaubt ihr, wie viele Möglichkeiten ihr habt, um mit der Maus ein wie auch immer geartetes Programm zu steuern? Es sind etliche. JavaScript stellt uns aber nicht alle zur Verfügung, die möglich sind, sondern nur Einige. Dabei handelt es sich um Folgende: • onmouseover = Maus in ein Element bewegen • onmouseout = Maus aus einen Element heraus bewegen • onmousemove = Maus bewegen • onmousedown = Maustaste drücken • onmouseup = Maustaste rauf • onclick = Maustaste klicken • ondblclick = Maustaste doppelklicken 3. Tastatur-Ereignisse Bei der Eingabe per Tastatur haben wir deutlich weniger Möglichkeiten. Es sind dero dreien: • onkeydown = Taste drücken • onkeyup = Taste loslassen • onkeypress = Taste gedrückt halten 3. Weitere Ereignisse Neben den oben beschriebenen stellt uns JavaScript noch Internet-spezifische Ereignisse zur Verfügung. Die beziehen sich zum einen auf Standard- und zum anderen auf spezielle Formularereignisse. Standardereignisse • onload = HTML-Seite laden • onunload = HTML-Seite verlassen • onabort = laden der HTML-Seite abbrechen • onfocus = wenn ein Element aktiviert wird Formularereignisse • onsubmit = Formular abschicken • onreset = Formular zurücksetzen • onselect = Inhalt eines Formularelements mit der Maus markieren • onchange = Ändern des Inhaltes eines select-Feldes JavaScript - Grundlagen - Arrays 1. Hinweis In meiner PHP-Einführung zum Thema Arrays habe ich die grundsätzliche Arbeitsweise mit Arrays schon ausführlich erläutert. Also lest euch das bitte zuerst durch, damit ihr wisst, um was es sich eigentlich handelt. Hier geht es nur noch um die Besonderheiten bei JavaScript. 2. Das Objekt Bei den Grundlagen zu den Arrays in PHP habe ich euch schon die Wirkungsweise und Vorteile zu vermitteln versucht. Kommen wir nun zum großen Unterschied. Wie ich eingangs bereits erwähnte, sind Arrays in JavaScript keine "verketteten" Listen wie in PHP (leider), sondern Objekte. Das macht das Arbeiten damit nicht besonders komfortabel, aber da müssen wir durch. 3. Erzeugen eines Array-Objektes Hier stellt uns JavaScript drei grundsätzliche Möglichkeiten zur Verfügung, mit denen man im Gegensatz zu PHP IMMER anfangen muss. var mein_array = new Object (); var mein_array = Array (); var mein_array = new Array (); Fragt mich bitte nicht nach dem Unterschied zwischen Array und new Array, das habe ich bis heute noch nicht begriffen. Was die Initialisierung mittels Object angeht, so kann ich euch sagen, dass in diesem Fall zum Beispiel eine Abfrage der Anzahl über mein_array.length nicht funktioniert. Solche Arrays müssen immer mit einer for ... in Schleife ausgelesen werden. Um auf Nummer sicher zu gehen, sollte man immer die Standardmethode new Array nehmen. Mehrdimensionale Arrays Sobald in JavaScript ein Array ein weiteres enthalten soll, muss man wieder so vorgehen wie oben. Es ist leider nicht möglich, einfach mit eckigen Klammern zu arbeiten, so wie man das aus PHP gewohnt ist: var mein_array = new Array (); mein_array [0] = new Array (); 4. Vergabe eines Indizes Solange man ein Array nicht so mit Inhalten befüllt bla = new Array ('blubb','blubber'), muss man immer explizit einen Index angeben, völlig egal ob der nun numerisch oder alphanumerisch ist: var mein_array = new Array (); mein_array[0] = 'blubb'; meine_array['bla'] = 'blubber'; So etwas wie in PHP ist leider nicht möglich: <?php $name[] = 'Hinz'; $name[] = 'Kunz'; ?> 5. Assoziative Arrays ... gibt es in JavaScript NICHT! Man kann dem Kind zwar einen Namen geben (mein_array['bla']), muss aber auf eines achten. Sollte es sich um Zahlen handeln, auch wenn sie von der Schreibweise her Strings sind, so wird die Reihenfolge des Arrays entsprechend geändert. Leider machen das sowohl der Internet Explorer als auch der Firefox genau genommen falsch. Testet mal folgenden Code im Opera, dann werdet ihr sehen, was ich meine: index = new Array ('172','181','168'); mein_array = new Array (); for (i in index) { mein_array[index[i]] = i; } for (i in mein_array) { alert (i); } Wichtig! Eine weitere Krankheit von JavaScript ist, dass man die Anzahl der Array-Einträge nur bei numerischen Arrays über length abfragen kann. Und auch dann nur, wenn die Indizes bei 0 beginnen und dann fortlaufend durchnummeriert sind! Probiert das folgende Beispiel mal aus und wundert euch: index = new Array ('172','181','168'); mein_array = new Array (); for (i in index) { mein_array[index[i]] = i; } alert (mein_array.length); JavaScript - Objekte Teil 1 - Einführung 1. DOM-Objekte In diesem Kapitel dreht sich alles um die Objekte, die direkt in das DOM "eingehängt" sind. Dabei handelt es sich um alle Elemente, mit denen man direkt Einfluss auf ein Browserfenster und dessen Inhalt nehmen kann. Die anderen Objekte erläutere ich im zweiten Teil. Allerdings müsst ihr die folgenden Abschnitte nicht komplett durchlesen. Werft einen Blick drauf, damit ihr später wisst, was es so gibt. 2. Auswahl Ihr bekommt hier keinen kompletten Überblick, sondern nur eine gezielte Auswahl. Ich werde also zum Beispiel das frame-Objekt komplett ignorieren, (da wir ja nicht mehr mit Frames arbeiten wollen), oder diese dämliche Statuszeile links unten im Browserfenster, die eh keine Sau mehr interessiert. Auch ignoriere ich alles, was ich im praktischen Einsatz bisher noch nie benutzt habe oder sich mit HTML-Attributen beschäftigt, die das Aussehen beeinflussen. Eine vollständige Übersicht findet ihr bei SelfHTML 3. Der Internet Explorer ... kocht auch hier mal wieder seine eigenes Süppchen. Daher habe ich eine Extra-Seite (IE only) eingerichtet, die auf diese Besonderheiten eingeht. 4. Kompatibilität Wann welcher Browser was wie versteht, könnt ihr an den kleinen Bildchen erkennen, die ich hinter allem Wichtigen platziere. Das sieht dann so aus: Objekt, Methode, Eigenschaft Dabei beziehe ich mich auf die aktuellen Versionen, soll heißen Firefox 1.0.x, 1.5.x, 2.0.x, Opera 8.x, Netscape 8.x, Safari 1.x und Internet Explorer 6.0, 7.0. 5. Die DOM-Elemente Ebene 1 An oberster Stelle steht das Objekt window. Es ist praktisch der Stammvater aller Weiteren, die da folgen werden. Ebene 2 Unterhalb des window-Objektes gibt es vier Dokumentfragmentknoten. Dabei handelt es sich um event, history, location und document. Eine Besonderheit stellt dabei document dar, da es das einzige Objekt dieser Ebene ist, das über weitere Unterobjekte verfügt. Ebene 3 Hierbei handelt es sich wie oben schon gesagt um alle Unterobjekte von document. Wir haben node, images, links und forms. Letzteres ist das einzige Objekt, das wiederum über Unterobjekte verfügt. Ebene 4 und 5 Mit elements kann man auf alle Elemente eines Formulars zugreifen, options als Unterobjekt bezieht sich auf die einzelnen Angaben in einem select-Feld. Die Details findet ihr der Übersichtlichkeit halber unter dem Abschnitt forms. JavaScript - Objekte Teil 1 - window 1. Das Objekt Das window-Objekt steht in der Hierarchie des DOM an oberster Stelle. Daneben gibt es keine weiteren. Damit steuern wir ein Fenster als Ganzes. Dieses Objekt verfügt über Eigenschaften und Methoden. 2. Eigenschaften innerHeight, innerWidth Hiermit kann die innere Höhe und Breite eines Fensters abgefragt und gesetzt werden, also alles im eigentlichen Fenster ohne Menüleiste, Favoriten, Statuszeile, und so weiter. breite = window.innerWidth; window.innerWidth = 400px; outerHeight, outerWidth Hiermit kann die Gesamthöhe und -breite eines Fensters abgefragt und gesetzt werden. hoehe = window.outerHeight; window.outerHeight = 400px; pageYOffset, pageXOffset Fragt die aktuelle horizontale, bzw. vertikale Position innerhalb einer Seite ab. Diese Eigenschaft kann wunderbar mit der Methode scrollTo kombiniert werden. left_posi = window.pageXOffset; name Speichert und ändert den Namen eines Fensters. Ist besonders sinnvoll im Zusammenhang mit der Methode open. 3. Methoden alert Gibt eine Fehlermeldung aus. Eignet sich hervoragend, um nach Fehlern zu suchen oder auf fehlerhafte Benutzereingaben des Users zu reagieren. breite = window.innerWidth; if (breite < 740) { alert ('Bitte die Fensterbreite vergrößern'); } open Öffnet ein neues Fenster. Im Gegensatz zur HTML-Attribut target="_blank" hat man deutlich mehr Einflussmöglichkeiten. Diese Methode erwartet mindestens zwei Parameter, optional drei. Der erste ist der Name der Datei, der zweite der Name des Fensters und im dritten definieren wir das Aussehen, also Größe, Darstellung, Scrollleisten und so weiter. Der dritte Parameter • height, width (px) = Breite und Höhe des Fensters • left, top (px) = Position des Fensters in Pixeln • rezisable (yes|no) = verhindert bzw. erlaubt, dass die Fenstergröße verändert werden kann • scrollbars (yes|no) = mit oder ohne Scrolleiste window.open('bla.htm', 'Blabla', 'width=300, height=400, scrollbars=no'); openener Damit könnt ihr von neu geöffneten Fenstern auf alle Eigenschaften und Methoden des Ursprungsfensters zugreifen. window.opener.close(); window.opener.location.href= 'bla.htm'; window.opener.style.color = '#f00'; moveBy, moveTo Verschiebt das Fenster um den angegebenen Wert. Der Unterschied liegt darin, dass man bei moveBy sagt, um wie viele Pixel es verschoben wird, während man mit moveTo sagt, wohin man es platzieren möchte. Erwartet werden zwei Werte, für die x- und y-Position, moveBy gestattet auch negative Zahlen. blubber = window.open('blubb.htm', 'blubb', 'width=300, height=400'); blubber.moveBy (50,50); blubber.moveTo (100,200); resizeBy, resizeTo Verändert die Größe eines Fensters um den angegebenen Wert. Auch gilt derselbe Unterschied wie in obigem Beispiel. resizeBy verändert die Größe relative zum Ursprungswert, resizeTo dagegen absolut. Erwartet werden zwei Werte, für die x- und yPosition, resizeBy gestattet auch negative Zahlen. window.resizeBy(-50,50); window.resizeBy(250,400); scrollBy, scrollTo Scrollt zu einem bestimmten Punkt. Bei scrollBy die Anzahl von Pixeln, bei scrollTo zu einer Position. Erwartet werden zwei Werte, für die x- und y-Position, scrollBy gestattet auch negative Zahlen. window.scrollBy(-20, -10); window.scrollTo(100, 100); prompt Öffnet ein Dialogfenster mit einem Textfeld, einem Ok- und Abbrechen-Button. eingabe = prompt('Tippp was ein!', ''); print Öffnet den "Drucken"-Dialog. Entspricht der Vorgehensweise "Datei" -> "Drucken". Es gibt keine Parameter. setTimeout Führt eine Anweisung mit einer bestimmten Verzögerung aus. Es werden zwei Parameter erwartet, erstens die Anweisung oder Funktion und zweitens die Verzögerung in Millisekunden. Diese Methode eignet sich besonders zu Animationen, wenn sie in einer Schleife abgearbeitet werden. Diese Sache ist so interessant, dass es ein kleines Tutorial dazu gibt. function tuWas () { } window.setTimeout("tuWas()", 5000); JavaScript - Objekte Teil 1 - event 1. Das Objekt Mit event können Maus- oder Tastatureingaben abgefangen werden. Damit lässt sich eine komplette Ereignisüberwachung programmieren, die sich aber von den eigentlichen EventHandlern unterscheidet. Dieses Objekt kennt nur Eigenschaften. Leider ist Implementierung in den verschiedenen Browsern mal wieder völlig unterschiedlich. Wie könnt es auch anders sein. So benötigt der Internet Explorer (wer auch sonst) einen Verweis auf das Ereignis. Daher benötigt der immer eine entsprechende Anweisung wie variable = event.Eventart 2. Eigenschaften clientX, clientY Speichert die horizontale und vertikale Position des Mauszeigers relativ zur linken oberen Ecke des aktuellen Fensters. function getHorz(evt) { // Internet Explorer if (document.all) { leftposi = event.clientX; } else { leftposi = evt.clientX; } alert (leftposi); } document.onclick = getHorz; offsetX, offsetY Speichert die horizontale und vertikale Position des Mauszeigers relativ zur linken oberen Ecke des auslösenden Elements. Diese Syntax ist zwar Microsoft-spezifisch, wird aber auch von anderen Browsern verstanden. alert (window.event.offsetX) pageX, pageY Speichert die horizontale und vertikale Position des Mauszeigers relativ zur linken oberen Ecke des auslösenden Elements. Diese Syntax ist Netscape-/Mozilla-spezifisch. function getHorz(evt) { leftposi = evt.clientX; alert (leftposi); } document.onclick = getHorz; screenX, screenY Speichert die horizontale und vertikale Position des Mauszeigers absolut zum Bildschirm. function getHorz (evt) { // Anpassung für Internet Explorer if (!evt) evt = window.event; alert(evt.screenX); } document.onclick = getHorz; type Gibt die Art eines Ereignisses ohne on zurück, also zum Beispiel bei onmousedown ein "mousedown". function getType (evt) { // Anpassung für Internet Explorer if (!evt) evt = type.event; alert(evt.type); } document.onmouseup = getType; document.onkeyup = getType; JavaScript - Objekte Teil 1 - location, history 1. Die Objekte Damit steuert ihr die Navigation. location bezieht sich auf neue Links, während man über history auf die bereits besuchten Seiten des Users Zugriff hat. 2. Eigenschaften location href Damit kann man eine URL direkt ansteuern, ist also die JavaScript-Version des HTML-Tags <a href..>. Wirklich sinnvoll ist die aber nur bei automatisierten Weiterleitungen oder wenn man gleichzeitig mehrere Fenster mit einem Link ansteuern will. Letzteres gilt aber nur beim Einsatz von Frames, also "igittigitt pfui bäh". Ansonsten sind die Methoden und Eigenschaften dieses Objektes meiner Meinung nach ziemlich nutzlos. Daher gehe ich auch nicht weiter darauf ein. window.location.href = 'neue_url.htm'; 3. Eigenschaften history length Hier wird die Anzahl der Einträge in der History-Liste ausgegeben. Diesen Wert kann man selber nicht verändern. alert(history.length); 4. Methoden history back Springt zur Seite, die vorher aufgerufen worden ist. <a href="#" onclick="history.back();">zurück</a> forward Springt zur nächsten Seite in der History-Liste, wenn zuvor ein "back"-Vorgang stattgefunden hat. <a href="#" onclick="history.forward();">zurück</a> go Springt um die angegebene Anzahl von Seiten vor- oder zurück. Ein negativer Wert bedeutet dabei zurück. <a href="#" onclick="history.go(-5);">5 Seiten zurück</a> <a href="#" onclick="history.go(3);">3 Seiten vor</a> JavaScript - Objekte Teil 1 - document 1. Das Objekte Mit diesem Objekt könnt ihr auf den Inhalt einer Internetseite zugreifen. Die Eigenschaften, über die man verfügt, sind meiner Meinung nach hanebüchener Unsinn, also lass ich sie weg. Die kann man auch größtenteils durch stinknormales HTML ersetzen, bzw. mit CSS formatieren. Bei den Methoden wird es allerdings sehr interessant. 2. Methoden createAttribute Erzeugt ein HTML-Attribut, dass man später über das "node"-Objekt auf HTML-Elemente anwenden kann. var breite = document.createAttribute('width'); createElement Erzeugt ein HTML-Element, dass man später über das "node"-Objekt mit irgendwas (z.B. Text) füllen kann. var absatz = document.createElement('p'); createTextNode Erzeugt einen Textknoten, den später über das "node"-Objekt in ein HTML-Element einbinden kann. var bla = document.createTextNode('Blubb blubber'); getSelection Ermittelt den Text, den der Anwender mit der Maus markiert (selektiert) hat. var markiert = document.getSelection(); write, writeln Gibt beliebigen Text in einem Document aus. "writeln" fügt automatisch noch einen Zeilenumbruch am Ende ein. document.write('Kräh bla schwall'); getElementById Kann sich noch einer an die verschiedenen Definitionsmöglichkeiten bei CSS erinnern? Da habe ich darauf hingewiesen, dass eine id nur einmal pro Seite verwendet werden darf. Und endlich erfahrt ihr auch warum. HTML-Elemente mit einer ID lassen sich wunderbar manipulieren, und besonders mit CSS. Ein paar Beispiele: document.getElementById('blubb').style.display = 'none'; document.getElementById('blubb').style.left = 50 + 'px'; document.getElementById(variablenname).style.border = 1 + 'px'; getElementByName Funktioniert genau wie obiges Beispiel, greift aber auf HTML-Tags zu, die den entsprechenden Wert im name-Attribut haben. document.getElementByName('blubb').style.display = 'none'; getElementByTagName Funktioniert genau wie die vorherigen Beispiele, bezieht sich aber auf das HTML-Tag an sich. document.getElementByTagName('p')... getElementByClassName Wird immer wieder nachgefragt, gibt es aber leider nicht! Vielleicht erbarmt sich das W3C ja und baut es in den nächsten Standard ein. Allerdings existieren mittlerweile einige Workarounds zu diesem Thema. 3. style Bei den getElement-Methoden gibt es eine wirklich nützliche Zusatzfunktion, mit der man die CSS-Eigenschaften eines HTML-Elements auslesen und ändern kann. Meiner Meinung nach das Beste, was uns JavaScript bietet. Wer sich mit Cascading Style Sheets auskennt, hat hiermit kein Problem. // Gibt die Vordergrundfarbe aus var farbe = document.getElementById.style.color; // Ändert die Farbe document.getElementByClassName.style.color = '#f00'; Die Sache sieht ganz einfach aus und ist sie auch. Es gibt nur eine Ausnahme. Bei allen CSS-Eigenschaften mit einem Bindestrich ändert sich die Schreibweise. Der Strich fällt weg und der erste Buchstabe dahinter wird groß geschrieben. document.getElementById.style.backgroundColor; Da uns style ungeahnte Möglichkeiten bietet, werde ich euch bei den Tutorials eine Einführung zu diesem Thema liefern. JavaScript - Objekte Teil 1 - document - node 1. Das Objekte node ist das zentrale Objekt, um auf die einzelnen Knoten eines HTML-Dokuments zuzugreifen (vgl. DOM). Um auf die Eigenschaften und Methoden zugreifen zu können, benötigt man die Methoden des document-Objektes. Da es sich bei diesem Thema um ein sehr komplexes handelt, zeige ich euch erst mal nur eine Auswahl. Die komplette Liste findet ihr bei SelfHTML. 2. Eigenschaften childNodes Speichert alle verfügbaren Kindknoten und deren Inhalt in einem Array. <div id="blubb"> Kräh <strong>bla</strong> schwall <span>blubb</span> blubber </div> ... // Gibt die Anzahl der Kindknoten aus alert (document.getElementById('blubb').childNodes.length); data Gibt den Inhalt eines Knotens aus, wenn es sich dabei um Text handelt. <div id="blubb"> Kräh bla schwall blubb blubber </div> ... alert(document.getElementById('blubb').firstChild.data); firstChild, lastChild Liefert das Objekt des ersten bzw. letzten Kindknotens eines Knotens. <ul> <li>blubb</li> <li>blubber</li> </ul> ... alert (document.getElementsByTagName("ul")[0].lastChild.data); nodeName, nodeValue, nodeType nodeName liefert den Namen des Knotens, nodeValue den Inhalt und nodeType eine Ziffer für die Art des Knotens. Was nun jetzt welche Zahl bedeutet, erfahrt ihr zum Beispiel hier. <p id="blubb" align="center">bla bla</p> document.getElementsByTagName("body")[0].firstChild.nodeName; document.getElementById("blubb").firstChild.nodeValue); 3. Methoden appendChild, removeChild Erzeugt einen neuen, bzw. löscht einen alten Kindknoten. <ul id="listing"> <li>Punkt 1</li> </ul> ... bla = document.getElementById('listing'); bla.removeChild(bla).firstChild); bla.appendChild(document.createElement('li')); appendData, deleteData Fügen einem Textknoten Daten hinzu oder löschen sie. <p id="schwafel">Kräh bla schwall</p> ... bla = document.getElementById('schwafel'); zufueg = document.createTextNode(' blubb blubber'); bla.firstChild.appendData(zufueg.nodeValue); ... zeichen = bla.firstChild.nodeValue.length; bla.firstChild.deleteData(0, zeichen); hasChildNodes Überprüft, ob ein Knoten weitere Kindknoten hat. Gibt im Erfolgsfall true zurück. <p id="schwafel">Kräh bla schwall</p> ... if (document.getElementById('schwafel').hasChildNodes()) ... JavaScript - Objekte Teil 1 - document - images 1. Das Objekte Mit images habt ihr direkten Zugriff auf alle Bilder einer Seite, die mit dem <img>-Tag eingebunden sind. Es gibt dabei drei Möglichkeiten, diese Grafiken anzusprechen. • über einen numerischen Index • über den Namen der Grafik • über den Namen der Grafik als Index Numerischer Index JavaScript nummeriert alle Bilder einfach durch, angefangen bei Null. Hütet euch aber davor, diese Möglichkeit zu nutzen. Da verliert man sehr schnell die Übersicht. Es sei denn, ihr wollt alle auf einmal ansteuern. document.images[0] ... document.images[10] Namen document.images.bildname Namen als Index Ist mein persönlicher Favorit, da ich fanatischer Array-Fan bin. document.images['bildname'] 2. Eigenschaften width, height Gibt die Breite und Höhe des Bildes zurück, die im img-Tag notiert wurde. Gibt es dort keine Angaben, liefern einige Browser nur eine Null. <img src="pics/blubb.gif" name="bla" width="100" height="50"> ... alert (document.images['bla'].width); length Liefert die Anzahl der Bilder in einer Seite. <img src="pics/blubb.gif"> <img src="pics/blubber.gif"> <img src="pics/bla.gif"> ... alert (document.images.length); src Wenn ihr mich fragt, die einzig wirklich sinnvolle Eigenschaft dieses Objektes, denn damit kann man Bilder austauschen, also zum Beispiel die berühmten RollOver-Effekte bei Buttons, die Bilder sind. var rein = new Array(); var raus = new Array(); raus['blubb'] = new raus['blubb'].src = rein['blubb'] = new rein['blubb'].src = Image(); "pics/blubb_b.gif"; Image(); "pics/blubb_o.gif"; function Raus(button) { document.images[button].src = raus[button].src } function Rein(button) { document.images[button].src = rein[button].src } ... <a href="irgendwas.htm" onMouseOver = "Rein('blubb');" onMouseOut = "Raus('blubb');"> <img src="pics/blubb_b.gif" name="blubb"> </a> JavaScript - Objekte Teil 1 - document - forms 1. Das Objekte Damit könnt ihr Formulare und deren Elemente ansteuern. Der Zugriff erfolgt ähnlich wie bei images, nur gibt es eine Möglichkeit mehr. • über einen numerischen Index • über den Namen des Formulars • über den Namen des Formulars mittels des forms-Objektes • über den Namen der Formulars als Index document.forms[0] document.formularname document.forms.Formularname document.forms['Formularname'] 2. Methoden reset, submit reset löscht die Eingaben innerhalb eines Formulars und entspricht dem HTMLFormularelement <input type="reset">. submit sendet die Eingaben und entspricht <input type="submit">. 3. elements element ist eigentlich ein Unterobjekt von forms, da sie aber direkt zusammenhängen, liste ich es hier auf. 4. Das Objekt Damit greifen wir auf die einzelnen Elemente eines Formulars zu, können Felder überprüfen oder deren Inhalt ändern. Eigenschaften Ich werde die nur mal ganz kurz auflisten, da Beispiele hier wenig Sinn ergeben. Mehr über die Verarbeitung von Formularen mit JavaScript zeige ich euch in einem kommenden Tutorial. • checked • defaultChecked • defaultValue • disabled • type Methoden Siehe Eigenschaften • blur • click • focus • select JavaScript - Objekte Teil 2 - Einführung Neben den Objekten, die in das DOM "eingehängt" sind, gibt es noch weitere. Vorab möchte ich an dieser Stelle aber auf zwei "universelle" Eigenschaften hinweisen, die bis jetzt unterschlagen habe. Man kann sie bei fast allen Objekten nutzen, um an Informationen zu gelangen. 1. length Gibt eine Länge wieder. Dabei existieren einfach gesagt, drei Möglichkeiten: Strings In diesem Fall wir die Anzahl der Zeichen zurückgegeben. var zeichenkette = 'Blubb Blubber'; // gibt 13 zurück alert (zeichenkette.length); Objekte Ermittelt die Anzahl von Elementen eines Objektes und gibt sie der Reihe nach in einem numerischen Array zurück. Klassische Beispiele sind Bilder oder Formularelemente. <form name="blabla" action="irgendwas"> <input type="text" name="blubb"> <input type="text" name="bluber"> <textarea name="suelz"> kräh bla schwall </textarea> </form> ... // gibt 3 zurück alert (document.blabla.elements.length); Selbst definierte Arrays var dumdidum = new Array ('a','b','c','d'); // gibt 4 zurück alert (dumdidum.length); 2. value Ermittelt einen Wert. Eignet sich vor allem bei der clientseitigen Überprüfung oder Änderung von Formularelementen. <form name="blabla" action="irgendwas"> <input type="text" name="blubb" value="täräää"> <input type="text" name="bluber" value="heititei"> </form> // gibt täräää zurück alert (document.blabla.elements.blubb.value); // ändert den Wert des Elements "blubber" document.blabla.elements.blubber.value = 'hollahihudeldöö'; alert (document.blabla.elements.blubber.value); JavaScript - Objekte Teil 2 - navigator 1. Das Objekt Über navigator kann man alles über den Browser des Users erfahren. Damit hat man die Möglichkeit, eventuelle Inkompatibilitäten abzufangen und darauf entsprechend zu reagieren. Leider gibt es eine kleine Einschränkung (wundert euch das). Opera kann sich sowohl als Internet Explorer ausgeben als auch als das, was er wirklich ist. 2. Eigenschaften appName Gibt den Namen des Browsers zurück alert (navigator.appName); appVersion Gibt die Versionsnummer des Browsers zurück alert (navigator.appVersion); cookieEnabled Überprüft, ob Cookies gesetzt werden dürfen. Ist heutzutage eigentlich nicht mehr nötig, da man serverseitig mit so genannten Sessions arbeiten kann. if (navigator.cookieEnabled == true) language Gibt die Sprachversion des Browsers(!) zurück. Das Ergebnis wird in einem länderüblichen Kürzel zurückgegeben. Hat jemand auf einem deutschen Betriebssystem einen englischsprachigen Browser installiert, so sagt das nichts über dessen "Muttersprache" aus. Ist also ziemlich unzuverlässig. alert (navigator.language); platform Liefert das Betriebssystem des Users. alert (navigator.platform); userAgent Gibt detaillierte Informationen über den Browser zurück. Eigentlich die einzig halbwegs zuverlässige Methode, um an Systeminformationen des Users zu kommen. alert (navigator.userAgent); JavaScript - Objekte Teil 2 - screen 1. Das Objekt screen liefert alle Informationen über den Bildschirm des Anwenders. Leider Gottes sind die entsprechenden Angaben ziemlich unzuverlässig (wie könnte es auch anders sein), daher sollte man dieses Objekt mit Vorsicht genießen. 2. Eigenschaften availHeight, availWidth Gibt die maximale Breite und Höhe zurück, die einer Anwendung im Vollbildmodus zur Verfügung steht. alert (availWidth + 'x' + availHeight); colorDepth Gibt den zur Basis 2 exponentiellen Wert der Farbtiefe zurück, Klingt furchtbar kompliziert, ist es aber nicht. Unter euren Bildschirmeinstellungen könnt ihr bei der Farbqualität (WinXP) zwischen Werten wie 16, 24 oder 32 Bit wählen. Und das ist die Zahl, die zurückliefert wird. alert ('Farbtiefe = 2 hoch ' + colorDepth); height, width Gibt die Breite und Höhe der Bildschirmalösung an. alert 'Bildschirmauflösung: ' + width + 'x' + height); JavaScript - Objekte Teil 2 - Array 1. Das Objekt ... habe ich schon bei den Grundlagen beschrieben. Bei den Methoden erwähne ich hier nur einige, die komplette Liste gibt es wie gehabt bei SelfHTML. 2. Methoden concat Fügt zwei Arrays zusammen. blubb = new Array ('bla','schwall'); blubber = new Array ('kräh','dumdidum'); suelz = blubb.concat(blubber); join Macht aus einem Array eine Zeichenkette. Diese Methode erwartet als Parameter mindestens ein Trennzeichen: blubb = new Array ('kräh','bla','schwall'); zusammen = blubb.join(' '); pop, shift Nein, ersteres ist kein Schweinkram, sondern entfernt lediglich den letzen Eintrag aus einem Array. shift dagegen macht das mit dem ersten Wert. Der Rückgabewert ist der Inhalt des gelöschten Elementes. blubb = new Array ('kräh','bla','schwall'); hauwech = blubb.pop(); auchwech = blubb.shift(); push, unshift Wenn man etwas wegballert, kann man auch wieder was dranhängen. push hängt die neuen Einträge hinten dran, unshift macht das am Anfang. blubb = new Array ('kräh','bla','schwall'); blubber = blubb.push('dumdidum','tralala'); blubber = blubb.unshift('dumdidum','tralala'); reverse, sort Sortieren ein Array neu. reverse geht nach dem numerischen Index vor und kehrt den um, also was am Anfang stand, befindet sich nun hinten. sort dagegen arbeitet alphabetisch von vorne nach hinten anhand der Inhalte der einzelnen Punkte. Über Parameter kann man das noch zusätzlich beeinflussen. blubb = new Array ('kräh','bla','schwall'); blubber = blubb.reverse(); blubber = blubb.sort(); JavaScript - Objekte Teil 2 - String 1. Das Objekt Damit habt ihr Zugriff auf jedwede Form von wie auch immer gearteten Zeichenketten. Da viele Methoden mit veralteten HTML-Attributen zu tun haben, lasse ich die weg. 2. Eigenschaften charAt Gibt das Zeichen zurück, das sich an einer bestimmten Position befindet. var zeichen = 'hollahihü hihüdeldö'; alert (zeichen.charAt(5)); concat Hängt eine Zeichenkette an eine andere hinten an. var anfang = 'hollahihü hihüdeldö '; var ende = 'diridiridudeldi'; var jodeldiplom = anfang.concat(ende); indexOf, lastIndexOf Ermitteln das erste, bzw. letzte Vorkommen eines Buchstabens oder Strings innerhalb einer Zeichenkette und geben die Position zurück. var jodeldiplom = 'hollahihü hihüdeldö diridiridudeldi'; var erster = jodeldiplom.indexOf('diri'); var letzter = jodeldiplom.lastIndexOf('diri'); match Durchsucht eine Zeichenkette anhand eines regulären Ausdrucks und liefert alles zurück, was gefunden wurde. var jodeldiplom = 'hollahihü hihüdeldö diridiridudeldi'; jodeldiplom.match(/diriS{2}/); replace Ersetzt Abschnitte innerhalb einer Zeichenkette, auf die ein regulärer Ausdruck zutrifft. WICHTIG! Normalerweise wird nur der ERSTE Treffer ersetzt, wenn das bei allen geschehen soll, muss der Parameter g angegeben werden. var jodeldiplom = 'hollahihü hihüdeldö diridiridudeldi'; // Ersetzt nur ERSTES "diri" jodeldiplom.replace(/diri/, 'dödel'); // Ersetzt Alle "diri" jodeldiplom.replace(/diri/g, 'dödel'); slice, substr Gibt einen Ausschnitt aus einer Zeichenkette zurück. Erwartet zwei Parameter, einen für die Anfangs- und einen für die Endposition. var jodeldiplom = 'hollahihü hihüdeldö diridiridudeldi'; var ausschnitt = jodeldiplom.slice(6, 11); var ausschnitt = jodeldiplom.substr(6, 11); split Teil einen String anhand eines Trenners auf. Das Ergebnis wird als Array mit den einzelnen Elementen zurückgegeben. var jodeldiplom = 'hollahihü,hihüdeldö,diridiridudeldi'; var einzeljodel = jodeldiplom.split(','); JavaScript - IE only 1. Einführung Wahrscheinlich handelt es sich bei den Abweichungen, die der IE aufweist, um Relikte aus der Zeit des großen Browserkrieges in den späten 90ern. Besonders beim window- und document-Objekt gibt es gravierende Unterschiede zu den anderen Browsern. Ich liste zuerst die "richtigen" Befehle (sorry, Eigenschaften und Methoden) auf, und zeige dann die M$-Versionen. 2. innerHeight, innerWidth document.body.clientHeight, document.body.clientWidth document.documentElement.clientHeight, document.documentElement.clientWidth Au Mann, da gibt es sogar zwei Varianten. Und was genau ist nun der Unterschied? Ich hoffe, ich rede jetzt keinen Müll. document.body.clientHeight/Width funktionieren, wenn der Internet Explorer sich in den Quirks.Modus schaltet. Und wann macht er das? Genau, wenn wir bei der Doctype-Definition HTML 4 Transitional wählen. Bei allen anderen Varianten müsst ihr die zweite Version nehmen. Die funktioniert aber nur, wenn beim Aufruf das <html>- und <body>-Tag vorhanden sind. Idealerweise empfiehlt sich der EventHandler onload im <body>-Tag. 3. outerHeight, outerWidth document.all.Body.offsetHeight, document.all.Body.offsetWidth Auch hier gibt es eine Unterscheidung, abhängig von der DTD. Leider kenne ich die Variante für strict nicht. 4. pageYOffset, pageXOffset document.body.scrollTop, document.body.scrollLeft document.documentElement.scrollTop, document.documentElement.scrollLeft Hier gelten dieselben Regeln wie bei obigen Beispielen. document.body.scrollTop/Left funktionieren nur bei der Doctype-Definition HTML 4 Transitional, ansonsten nehmt die letztere Version. Die funktioniert aber wieder mal nur dann, wenn beim Aufruf das <html>und <body>-Tag vorhanden sind, also mit onload aufrufen. 5. Anwendungsweise Wie geht man nun an das Problem der unterschiedlichen "Befehle" heran? Nun es gibt eine eindeutige Unterscheidung zwischen den jeweiligen Browsern. Dabei handelt es sich um eine Methode des document-Objektes, die all lautet, eine alte Variante von getElementById ist und nur vom Internet Explorer verstanden wird. Aber Obacht! Achtet bei der Definition von Bedingungen auf die Reihenfolge. if (document.all) { // IE-only } else { // Der Rest } Man kann das auch noch weiter steigern, indem man die jeweiligen Methoden dezidiert auflistet, und so die zusätzlichen Unterschiede innerhalb des Internet Explorers umgeht. if (document.body.clientHeight) { // IE im Quirks-Modus } else if (document.documentElement.clientHeight) { // IE im Standard-Modus } else if (window.innerWidth) { // Der Rest } else { // Nanü, hier stimmt was nicht } So jetzt haben wir den theoretischen Bereich von JavaScript abgeschlossen und können nun erstmal das erworbene Wissen konkret umsetzen. Also auf zum ersten Tutorial.