+ All Categories
Home > Documents > Internettechnologien, LE 4: JavaScript, jQuery,...

Internettechnologien, LE 4: JavaScript, jQuery,...

Date post: 07-Sep-2019
Category:
Upload: others
View: 6 times
Download: 0 times
Share this document with a friend
100
Inhaltsverzeichnis Inhaltsverzeichnis Vorbemerkungen zu dieser Lerneinheit ...................................... JavaScript .......................................................... . Einleitende Beispiele ............................................ . Grundsätzliche Syntaxregeln ................................... . Dynamisch und implizite Typisierung ......................... . Prototypen ........................................................ . Mathematische Funktionen und Konstanten ................ . Kontrollstrukturen ............................................... . Wichtige Standardobjekte ...................................... . Funktionen und Callbacks ...................................... . DOM ............................................................... . XMLHttpRequest und AJAX ..................................... . Web Workers: Nebenläugkeit in JavaScript ................ . DOM Storage ..................................................... . Übungsaufgaben ................................................. jQuery.............................................................. . Entstehungsgeschichte, Lizenz, Dokumentation ............ . Einbindung der Bibliothek ...................................... . Syntax .............................................................. . DOM-Manipulation mit jQuery ................................ . CSS-Formatierungen ............................................. . AJAX mit jQuery .................................................. . jQuery Mobile .................................................... . Übungsaufgaben .................................................
Transcript
Page 1: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

Inhaltsverzeichnis

Inhaltsverzeichnis

Vorbemerkungen zu dieser Lerneinheit ..... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1 JavaScript...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.1 Einleitende Beispiele ..... .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.2 Grundsätzliche Syntaxregeln ...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

1.3 Dynamisch und implizite Typisierung ..... .. . . . . . . . . . . . . . . . . . . 9

1.4 Prototypen ..... ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

1.5 Mathematische Funktionen und Konstanten...... . . . . . . . . . . 13

1.6 Kontrollstrukturen ..... .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.7 Wichtige Standardobjekte ..... .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.8 Funktionen und Callbacks ..... .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

1.9 DOM ....... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

1.10 XMLHttpRequest und AJAX....... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

1.11 Web Workers: Nebenläufigkeit in JavaScript ..... .. . . . . . . . . . 39

1.12 DOM Storage ....... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

1.13 Übungsaufgaben ..... ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

2 jQuery...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

2.1 Entstehungsgeschichte, Lizenz, Dokumentation ..... .. . . . . . 46

2.2 Einbindung der Bibliothek ..... .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

2.3 Syntax ...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

2.4 DOM-Manipulation mit jQuery ...... . . . . . . . . . . . . . . . . . . . . . . . . . . 48

2.5 CSS-Formatierungen...... .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

2.6 AJAX mit jQuery ...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

2.7 jQuery Mobile ...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

2.8 Übungsaufgaben ...... .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

1

Page 2: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

Inhaltsverzeichnis

3 AngularJS ....... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

3.1 Grundlegende Konzepte ..... .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

3.2 Erste Beispiele: HTML wird (fast) eine Programmier-sprache ...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

3.3 Grundelemente von AngularJS..... .. . . . . . . . . . . . . . . . . . . . . . . . . . . 65

3.4 Erste Datenbankzugriffe mit AngularJS ...... . . . . . . . . . . . . . . . . . 66

3.5 Single Page Appmit Components und Datenbankzugrif-fen ..... .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

3.6 Bewertung und Ausblick ...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

3.7 Übungsaufgaben ....... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

4 Lösungen der Aufgaben ...... .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Literatur ....... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

2

Page 3: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

Inhaltsverzeichnis

Vorbemerkungen zu dieser Lerneinheit

Die vorliegende Lerneinheit bildet den Abschluss des Lehrbriefs überInternettechnologien und behandelt wichtige Aspekte der clientseiti-gen Programmierung. Im Zusammenhang mit dem Web bedeutet diesvor allem Programmierung mit JavaScript und die Verwendung weitverbreiteter, auf JavaScript basierender Bibliotheken und Frameworks,insbesondere jQuery und AngularJS.Die Programmierung mit JavaScript entstand sehr früh mit der mas-siven Verbreitung des Internets Mitte der 1990er Jahre, wurde aberim Verlaufe des darauf folgenden Jahrzehnts insbesondere aufgrund si-cherheitstechnischer Bedenken zunehmend unbeliebter. Erst mit dergezielten Förderung durch Google, sowohl durch Marketing als auchdurch technische Weiterentwicklung, gewann JavaScript wieder an Be-deutung. Zur Trendwende hat daneben auch ganz sicher das Buch vonDouglas Crockford, JavaScript: The Good Parts [1], beigetragen, das ei-ne „saubere“ Programmierung mit der Skriptsprache propagiert. DasBuch hat wesentlich die Entstehung dieser Lerneinheit beeinflusst unddessen Geist geprägt.

Hagen,im Dezember 2016 Andreas de Vries

3

Page 4: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

1 JavaScript

JavaScript ist eine wichtige Programmiersprache, da es die Sprache derBrowser ist. Nach C, mit dem alle wichtigen Betriebssystemkerne pro-grammiert sind, ist JavaScript damit die wohl am weitesten verbreitetehöhere Programmiersprache der Welt. JavaScript ist, ähnlich wie PHP,eine Skriptsprache, deren Anweisungen der Interpreter direkt in denArbeitsspeicher liest und ausführt. Üblicherweise versteht man unterdem Begriff JavaScript eine clientseitige Sprache, deren Interpreter einModul des Browsers ist.1 JavaScript ermöglicht es, durch Zugriff auf be-stimmte Funktionen des Browsers, also „lokal“ auf dem Rechner desWebclients, eine HTML-Seite dynamisch und interaktiv zu gestalten. Imwesentlichen lassen sich mit JavaScript Formulareingaben lokal (alsonoch vor Abschicken der Daten an den Server) überprüfen, Bilder ani-mieren, Mausereignisse verarbeiten, Pop-Up-Fenster öffnen, oder (ins-besondere im Rahmen von AJAX) asynchrone HTML-Requests für ein-zelne HTML-Elemente durchführen.

JavaScript wurde 1995 von Brendan Eich bei Netscape Communicati-ons entwickelt. Der Name suggeriert eine Verwandtschaft mit der Pro-grammiersprache Java, was aber bis auf gewisse Syntaxähnlichkeitenüberhaupt nicht der Fall ist. Als Reaktion auf den Erfolg von JavaScriptentwickelte Microsoft kurz darauf eine sehr ähnliche Sprache unterdem Namen JScript. Die europäische Industrievereinigung ECMA (Eu-ropean Computer Manufacturers Association) mit Sitz in Genf erarbei-tete 1997 den Standard ECMA-Script (ECMA-262, [JS]). ECMA-262 istseit 1998 internationaler Standard (ISO/IEC 16262). Aktuelles findetman unter [JS] insbesondere zu den verschiedenen Browserimplemen-tierungen auf der Unterseite About_JavaScript.

Insgesamt ist JavaScript eine im Kern sehr schöne und mächtige Pro-grammiersprache, die allerdings auch einige üble Eigenschaften hat.Zudem existieren im Web unzählige unsäglich schlechte Programmbei-spiele von Programmierlaien und – ja, auch Idioten. Glauben Sie nie-mals blind irgendeinem Beispiel aus dem Netz, prüfen Sie stets die Pro-gramme und Ausschnitte auf Nachvollziehbarkeit! Douglas Crockford,einer der Kämpfer für die Nutzung der guten Möglichkeiten von Java-Script [1], hat die Webseite JSLint [JSL] eingerichtet, auf der JavaScript-Quelltext auf seine Qualität geprüft werden kann. In einer umfangrei-chen Optionsliste kann man dabei die Toleranz des Prüfprogramms ein-stellen. Die Quelltexte dieses Skriptes sind mit den Einstellungen in 1.1geprüft (bis auf die Methode document.write).

1 Seit November 2009 existiert die vielbeachtete auf JavaScript basierende eigen-ständige Laufzeitumgebung Node.js, die Netzwerk- und Dateisystemfunktionen besitztund serverseitig laufen kann [9].

4

Page 5: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.1 Einleitende Beispiele

Abb. 1.1: Optionen der Toleranz von JSLint [JL]

1.1 Einleitende Beispiele

Nach alter Tradition soll unser erstes Programm eine kleine Begrü-ßungsformel ausgeben. Als Vorbemerkung halten wir zunächst fest,dass ein JavaScript-Programm stets in einem HTML-Dokument einge-bettet ist. Anders als bei PHP ist also der Quelltext von JavaScript ineiner Textdatei mit der Endung .html oder .htm.

Listing 1: Hello World mit document.write

1 <!DOCTYPE html>

2 <html>

3 <head><meta charset="UTF-8"/></head>

4 <body>

5 <script>

6 document.write("<h2>Grüße Dich, Welt!</h2>");

7 </script>

8 </body>

9 </html>

Achtet man auf die korrekte Textcodierung des HTML-Dokuments, sokann man problemlos Umlaute oder Sonderzeichen ausgeben.

1.1.1 Das <script>-Tag

Gehen wir das obige Programm kurz durch. Zunächst bemerken wir,dass das Programm ein HTML-Dokument ist: Die ersten vier Zeilen sindStandard-HTML. In der fünften Zeile beginnt mit dem Tag <script> dieDeklaration des JavaScript-Programms. Das HTML-Tag

<script> ... </script>

sagt dem Browser, dass nun JavaScript-Code folgt. Man kann JavaScript-Quellext auch in eine eigene Datei auslagern, was mit Hilfe des Attributs

5

Page 6: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

src geschieht:

<script src="./quelltext.js"></script>

Das Auslagern von Quelltext ist für kleine Programme zwar etwas auf-wendiger, dafür aber bei größeren Projekten übersichtlicher. Zudemkann so einmal erstellter JavaScript-Code in anderen Webseiten ver-wendet werden.

Wo kann ein <script> erscheinen?

In unserem ersten Programm wurde der Quelltext im body-Tag desHTML deklariert. Muss das immer so sein? Prinzipiell kann JavaScriptdurch ein script-Tag an jeder Stelle des HTML-Dokuments – also imhead-Element oder im body-Element – eingebunden werden, solange dieHTML-Syntax nicht verletzt wird. Insbesondere kann man beliebig vie-le script-Tags verwenden. Der Browser interpretiert sie alle der Reihenach durch.Als Faustregel sollte man jedoch beachten, dass Deklarationen vonFunktionen (s.u.) eher im head vorgenommen werden, das ist eine üb-liche und sinnvolle Konvention. JavaScript-Anweisungen, die vor oderwährend des Aufbaus der HTML-Seite geschehen sollen, müssen sogarim head deklariert werden.Aus Performanzgründen allerdings wird für große Programme oft ge-raten, die <script>-Elemente am Ende des <body>-Elements zu laden,da somit das Laden des JavaScript-Quelltextes und der HTML-Elementesich nicht gegenseitig blockieren können.2 Sicher sollte man diesenHinweis bei Ladezeitproblemen großer Programme auch beachten, je-doch werden in diesem Lehrbrief die <script>-Elemente bevorzugt im<head> erscheinen.

1.1.2 Anweisungen

Jede Anweisung sollte mit einem ; abgeschlossen werden. (Solange jedeAnweisung in einer eigenen Zeile steht, ist dies zwar nicht notwendig,aber es kann zu Mehrdeutigkeiten und somit zu unvorhergesehenen Ef-fekten führen.)

1.1.3 Ausgaben

Ausgabe mit document.write()

Der JavaScript-Befehl document.write übergibt direkt Text an den Brow-ser, den dieser gemäß HTML interpretiert und im Fenster darstellt.Der Browser empfängt zum Beispiel im Programm des Listings 1 ein-fach <h2>Hello World</h2> innerhalb des body-Tags. Eine Ausgabe mit

2 https://docs.angularjs.org/guide/bootstrap

6

Page 7: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.1 Einleitende Beispiele

document.write sollte also stets im body-Tag an der Stelle stehen, woauch der Text erscheinen soll.

Ausgabe in HTML-Elementen mit ID

Eine weitere Möglichkeit zur Ausgabe in JavaScript zeigt das folgen-de Beispiel. Es ist ein wenig komplizierter, verwendet aber bereits ei-ne sehr bedeutsame Möglichkeit von JavaScript, auf einzelne Elementeeines HTML-Dokuments zuzugreifen, wenn sie jeweils dokumentweiteindeutige ID’s erhalten haben. Dazu wird das Attribut id verwendet,das bereits im Zusammenhang mit CSS angesprochen wurde. Mit derFunktion getElementById kann dann aus JavaScript mit dieser ID auf dasElement referenziert werden. Das so erhaltene Element ist ein Objektin JavaScript, das als ein Attribut innerHTML besitzt, das wiederum aufden Textinhalt verweist. (Beachten Sie dabei die Groß- und Kleinschrei-bung!) Betrachten wir dazu das Beispielprogramm 1.2, in dem eine Aus-gabe nach Anklicken eines Buttons geschieht.

Abb. 1.2: Ausgabe per Element-ID

Hier hat das <p>-Element die ID "ausgabe" und wird so mit der Anwei-sung in Zeile 7 mit einem Text beschrieben. Zu beachten ist, dass dieFunktion getElementById zum Zeitpunkt ihrer Ausführung das Elementkennen muss. Da sie in unserem Programm im <head>-Element dekla-riert ist, das <p>-Element in Zeile 13 also noch nicht bekannt ist, wirdhier ein in JavaScript üblicher Mechanismus verwendet, der die Ausfüh-rung erst nach Anklicken des Buttons ausführt; zu diesem Zeitpunktist das <p>-Element also schon bekannt. (Diesen Mechanismus wer-den wir unter dem Stichwort Ereignisbehandlung bzw. Event Handlingnäher kennen lernen.): Mit dem Attribut onclick wird festgelegt, wasbei Anklicken der Schaltfläche passieren soll. Hier wird die Funktionausgeben ausgeführt, die den Inhalt innerHTML des <p>-Elements über-schreibt. Die Deklaration der Funktion ab Zeile 6 mit dem Schlüsselwortfunction ist JavaScript typisch und wird weiter unten erklärt.

7

Page 8: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

Debugging: Ausgabe auf der JavaScript-Konsole

Bei der Entwicklung von JavaScript-Programmen kann man zum De-buggen seiner Programme auch Text auf der JavaScript-Konsole ausge-ben, und zwar mit dem Befehl

console.log("Hallo Welt!");

Die Konsole ist bei den Browsern Firefox oder Chrome sehr einfach ein-zuschalten.

1.1.4 Eingabe von Daten in JavaScript

Eine Erweiterung des Programmbeispiels 1.2 ist das folgende Pro-gramm mit der Möglichkeit, Daten in ein JavaScript-Programm einzu-lesen. Bei dieser Erweiterung definiert man im <head>-Element eineFunktion einlesen, die beim Klicken des OK-Schaltknopfes aufgerufenwird und den eingegebenen Text verarbeitet. Hierzu müssen also zweiHTML-Elemente mit einer ID versehen werden, so dass sie aus Java-Script angesprochen werden können, ein <input>-Element für die Ein-gabe und ein <span>-Element für die Ausgabe:

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <script>

6 var einlesen = function() {

7 var text = document.getElementById("eingabe").value;

8 document.getElementById("ausgabe").innerHTML = text;

9 }

10 </script>

11 </head>

12 <body>

13 <input type="text" id="eingabe"/>

14 <input type="button" value="OK" onclick="einlesen();"/>

15 <p>Sie haben gerade <span id="ausgabe"></span> eingegeben.</p

>

16 </body>

17 </html>

Um auf den eingegeben Wert des Eingabefeldes eingabe zuzugreifen,muss man sein value-Attribut ansprechen, das auf aktuell den einge-gegeben Inhalt verweist.

8

Page 9: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.2 Grundsätzliche Syntaxregeln

1.2 Grundsätzliche Syntaxregeln

JavaScript ist schreibungssensitiv (case sensitive), d.h. es wird strikt un-terschieden zwischen Groß- und Kleinschreibung. Das reservierte Wortnull ist etwas völlig anderes als Null.Wie in Java beginnen Kommentare entweder mit einem // und endenmit dem Zeilenende, oder sind eingeschlossen zwischen /* und */.Eine Anweisung wird mit einem Semikolon beendet. Zwar besitzt Java-Script einen Mechanismus, der fehlende Semikolons einfügt, d.h. manmuss sie nicht notwendig selber setzen. Allerdings sollte man sich aufdiesen Mechanismus nicht verlassen, er kann zu logischen Programm-fehlern führen [1, S. 109f, 127f].Anweisungen werden durch Umschließen von geschweiften Klammern{...} zu Blöcken zusammengefasst. Empfohlen wird in JavaScript der1TBS-Stil,3 bei dem die öffnende geschweifte Klammer immer am Endeeiner Zeile steht, nie am Anfang [1, S. 103].

1.3 Dynamisch und implizite Typisierung

Eine Variable in JavaScript kann während ihrer Laufzeit verschiede-ne Datentypen annehmen. Programmiersprachen, die das ermöglichen,heißen dynamisch typisiert. Demgegenüber heißt eine Programmier-sprache statisch typisert, wenn jede Variable einen Datentyp hat, densie lebenslänglich behält. Konsequenterweise ist in JavaScript eine Va-riable stets implizit definiert, d.h. der Datentyp wird bei jeder Zuwei-sung während der Laufzeit automatisch bestimmt. Java ist demgegen-über statisch und explizit typisiert. In JavaScript kann eine Variable diefolgenden 7 möglichen Datentypen annehmen oder eine Funktion oderein Objekt sein.

• string: eine in Anführungszeichen "..." oder Apostrophs’...’eingerahmte Zeichenkette (mit Unicode-Zeichen), z.B. "¡Howdy!"oder ’Allô’; um Unicode zu ermöglichen, sollte das einbetten-de HTML-Dokument die Zeichenkodierung UTF-8 im <meta>-Tagvorsehen werden, wie in den obigen einleitenden Beispielen.

• number: eine Zahl gemäß IEEE754 (double in Java oder C), also 42

oder 3.14159. Spezielle Werte sind Infinity für den Wert Unend-lich (∞) und NaN für „not a number“. Einen expliziten Datentyp fürganze Zahlen (wie int in Java) kennt JavaScript nicht. Eine Zahl inJavaScript hat eine Objektmethode4 toString(radix) mit radix ∈{2, 3, . . . , 36}, die sie bezüglich der Basis radix darstellt, also bei-spielsweise

3 http://de.wikipedia.org/wiki/Einrückungsstil [2016-07-17]4 https://developer.mozilla.org/en/JavaScript/Reference/Global_

Objects/Number/toString [2016-07-17]

9

Page 10: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

1 document.write((71).toString(36)); // => 1z

2 document.write(Math.PI.toString(7)); // =>

3.066365143203613411

Eine weitere nützliche Standardmethode einer Zahl in JavaScriptist die Methode toFixed, die als Parameter die Anzahl n der dar-zustellenden Dezimalstellen erwartet, wobei 0 5 n 5 20.5

1 document.write((123.4567).toFixed(3)); // => 123.457

• boolean: einer der beiden logischen Werte true oder false. Wich-tige Boole’sche Operatoren sind === und !==, hierbei ergibt x ===

y den Wert true genau dann, wenn Datentyp und Wert der beidenOperanden x und y gleich sind, und umgekehrt liefert x !== y denWert true genau dann, wenn Typ oder Wert verschieden sind.6

Um den Unterschied zwischen === und == zu illustrieren, sei aufdie Webseite

http://haegar.fh-swf.de/Webtechnologie/equalities-js.html

verwiesen. Hier erkennt man, dass === die erwartete Gleichheitzeigt (nur die Diagonale ist besetzt). Auch die „falsy“ Werte, alsoWerte == false, sind einigermaßen übersichtlich (0, "0", NULL, lee-re Arrays oder Arrays mit Eintrag 0); Ähnliches gilt für „truthy“,also == true, nur mit 1 statt 0. (Vergleiche die Situation in PHP).

• function: Der Datentyp für eine Funktion.

• object: Der Datentyp für ein Objekt. Für den Operator typeof istauch ein Array vom Typ object [1, S. 18, 66].

• null: ein spezieller Wert für das Null-Objekt;

• undefined: ein spezieller Wert für „undefiniert“.

Der Datentyp eines gegebenen Wertes kann mit dem Operator typeof

ermittelt werden. Vorsicht ist dabei nur geboten, wenn man auf dasNullobjekt prüfen möchte, denn typeof null ergibt object.In JavaScript wird mit dem Schlüsselwort var eine Variable deklariert.

1 var x = 1;

2 var a = 2, b, c = "Hallo?";

3 document.write("a=" + a + ", b=" + b+ ", c=" + c); // a=2,

b=undefined, c=Hallo?

5 http://www.hunlock.com/blogs/The_Complete_Javascript_Number_

Reference#toFixed6 Die auch in JavaScript vorhandenen Operatoren == und != sind nicht zu empfeh-

len, sie erzwingen bei Typenungleichheit unerwartete Ergebnisse; insbesondere ist ==nicht transitiv [1, S. 117]: ""==0: true, 0=="0": true, ""=="0": false.

10

Page 11: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.4 Prototypen

Dabei können in einer var-Anweisung auch mehrere durch Kommas ge-trennte Variablen deklariert werden. Auch wenn eine Variablendekla-ration in JavaScript nicht notwendig und prinzipiell immer eine einfa-che Wertzuweisung wie x = 1 für eine neue Variable x möglich ist, wirdsie aus Gründen der Softwarequalität dringend empfohlen [1, S. 125,130], [JSL].

Zwar besitzt JavaScript eine „C-Syntax“ (wie Java), durch die insbeson-dere ein Programm durch geschweifte Klammern in Blöcke {...} un-terteilt wird. Anders als in Java oder C impliziert dies aber nicht auto-matisch, dass ein Block den Geltungsbereich (Scope) aller in ihm dekla-rierten Variablen begrenzt. JavaScript nutzt nicht Blöcke als Geltungs-bereich für Variablen, sondern Funktionen [1, S. 40, 109].

1.4 Prototypen

Im Unterschied zu einer klassenbasierten objektorientierten Sprachewie Java oder C++ gibt es in JavaScript keine Klassen, sondern nur Pro-totypen. Klassenbasierte Objektorientierung unterscheidet zwischenKlassen, die die Struktur seiner Attribute und Methoden festlegen, undden Objekten oder Instanzen, die daraus gebildet werden. Ein Objektkann niemals die Struktur seiner eigenen Klasse ändern.

In einer prototypenbasierten Programmiersprache wie JavaScript gibtes keine Klassen, sondern nur Objekte. Sie sind prototypisch in demSinne, dass ihre Struktur von anderen Objekten übernommen und ver-erbt werden kann und sie ihre eigene Struktur dynamisch erweiternkönnen. Ein Objekt in JavaScript ist eine Menge von Attribut-Wert-Paa-ren, ganz ähnlich wie HashMaps in Java oder assoziative Arrays in PHP.Die Attribute heißen in JavaScript auch Properties. JavaScript eröffnetgrundsätzlich zwei Möglichkeiten, ein Objekt zu erzeugen, eine Dekla-ration in einer pseudoklassische Notation [1, S. 52] einerseits, und alsObjektliteral andererseits. Ist man an eine klassenbasierte Program-miersprache wie Java gewöhnt, ist die pseudoklassische Notation zwareinsichtig, allerdings sind Objektliterale eleganter und werden allge-mein empfohlen [1, §3]. Bei einem Objektliteral werden mit einem Dop-pelpunkt jeweils ein Attribut-Wert-Paar bestimmt und diese verschie-denen Paare durch Kommas getrennt:

1 var gemüse = {

2 "name": "Möhre",

3 "details": {

4 "color": "orange",

5 "size": 12

6 },

7 "toString": function() {return this.name + ", " + this.

details.color;}

8 }

11

Page 12: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

9 document.write(gemüse.name + ", " + gemüse.details.color); //

=> Möhre, orange

10 document.write("<br>" + gemüse["name"] + ", " + gemüse["details

"]["color"]);

11 document.write("<br>" + gemüse); // => Möhre, orange

Diese Syntax liegt dem wichtigen Format JSON zugrunde, das mittler-weile zu einem De-Facto-Standard der Datenübertragung im Web ge-worden ist.7 In den write-Funktionen erkennt man die verschiedenenAbrufmöglichkeiten der Objekteigenschaften, nämlich mit der Punkt-notation objekt.property (wie in Java oder C++), mit der Array-Nota-tion mit eckigen Klammern, oder über definierte Objektmethoden wietoString. Die toString-Methode braucht dabei (als einzige Methode)nicht explizit genannt zu werden.Die zweite Möglichkeit der Objekterzeugung ist wie in Java mit demSchlüsselwort new; dazu muss ein Konstruktor als Funktion definiertwerden, die mit der Selbstreferenz this die Eigenschaften (properties)des Objekts festlegt, also dessen Attribute und Funktionen (Methoden):

1 var Angestellter = function(name, abteilung) {

2 this.name = name;

3 this.abteilung = abteilung;

4 this.toString = function() {return name + " in " + abteilung

;}

5 }

6 emil = new Angestellter("Emil", "IT"); // Objekterzeugung

7 document.write(emil.name + ", " + emil.abteilung); // => Emil,

IT

Der Konstruktor übernimmt somit in gewisser Hinsicht die Rolle derKlasse in einer klassenbasierten Sprache wie Java.Für Objekte gibt es den Operator in mit der Syntax "xyz" in obj , dertrue zurückgibt, wenn das Objekt obj die Eigenschaft xyz besitzt, an-sonsten false:

1 "details" in emil; // => false

2 "details" in gemüse; // => true

Der in-Operator kann auch für Arrays (s.u.) verwendet werden, im Falleeines numerischen Indizes müssen dabei allerdings die Anführungszei-chen weggelassen werden.

Notiz. JavaScript ermöglicht auch das Konzept der „prototypischenVererbung“, eine Möglichkeit zur dynamischen Veränderung undErweiterung der Property prototype bestehender Objekte. Allerdingsist das Konzept aus meiner Sicht unklar und nur begrenzt brauchbar(es ermöglicht z.B. kein Überschreiben bestehender Properties),daher wird es in diesem Skript, im Gegensatz zu früheren Versionen,

7 Für „lupenreines“ JSON kann es als Wert allerdings keine Funktionen geben.

12

Page 13: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.5 Mathematische Funktionen und Konstanten

nicht erläutert. Auch die ansonsten ja sehr guten Quellen https:

//developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_

Objects/Object/prototype oder http://www.w3schools.com/js/js_

object_prototype.asp brachten mir nicht viel. (Gerne nehme ich dasKonzept wieder auf, wenn mich jemand vom Gegenteil überzeugt!)

1.5 Mathematische Funktionen und Konstanten

Das für mathematische Funktionen und Operationen zentrale Standar-dobjekt in JavaScript ist Math [JS, §15.8]. Es besitzt als Attribute die Kon-stanten

Math.E // Euler’sche Zahl e =∞∑

k=0

1k!≈ 2,718281828 . . .

Math.LN2 // Natürlicher Logarithmus von 2:

ln 2 ≈ 0,6931471 . . .Math.LN10 // Natürlicher Logarithmus von 10:

ln 10 ≈ 2,302585092994 . . .Math.LOG2E // log2 e ≈ 1,44269504 . . .Math.LOG10E // log10 e ≈ 0,4342944819 . . .Math.PI // Kreiszahl π =

∞∑k=0

116k

(4

8k + 1–

28k + 4

–1

8k + 5–

18k + 6

)≈ 3,14159 . . .

Math.SQRT2 //√

2 ≈ 1,41421356237 . . .Math.SQRT1_2// 1/

√2 ≈ 0,707106781 . . .

und als Methoden die mathematischen Funktionen

Math.abs(x) // |x|Math.acos(x) // arccos xMath.asin(x) // arcsin xMath.atan(x) // arctan xMath.atan2(x,y) // arctan(x/y)Math.ceil(x) // dxeMath.cos(x) // cos xMath.exp(x) // ex (e hoch x)Math.floor(x) // bxcMath.log(x) // ln x (natürlicher Logarithmus)

Math.max(x,y) // Maximum von x und y; kann auch mehrere

Argumente bekommen

Math.min(x,y) // Minimum von x und y; kann auch mehrere

Argumente bekommen

Math.pow(x,y) // xy (x hoch y)Math.random() // Pseudozufallszahl z mit 0 ≤ z < 1Math.round(x) // kaufmännische Rundung von x auf die nächste

ganze Zahl

Math.sin(x) // sin x

13

Page 14: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

Math.sqrt(x) //√

xMath.tan(x) // tan x

1.6 Kontrollstrukturen

1.6.1 Die if-Anweisung

JavaScript hat dieselbe bedingten Verzweigung wie Java:

if(ausdruck) { code } [else { code2 }]

Hierbei bezeichnet ausdruck einen Boole’schen Wert und code eine An-weisung oder einen Block von Anweisungen, der else-Zweig ist optio-nal (und daher in eckigen Klammern). code wird genau dann ausge-führt, wenn der Ausdruck nicht die Werte true annimmt, ansonstenwird code2 ausgeführt, oder eben nichts, wenn der else-Zweig nichtexistiert.

Fallunterscheidungen mit switch-case

JavaScript verwendet zur Unterscheidung mehrerer alternativer Fälleden Befehl switch. Die Syntax und Funktionsweise ähnelt der switch-Anweisung in Java.

1 compute = function (operator, x, y) {

2 var z;

3 switch (operator) {

4 case "+": z = x + y; break;

5 case "-": z = x - y; break;

6 case "*": z = x * y; break;

7 case "/" | ":": x / y; break;

8 case "%": z = x % y; break;

9 default: z = NaN;

10 }

11 return z;

12 };

13 document.write(compute("+", 4, 3)); // => 7

14 document.write("<br/>" + compute("%", 4, Math.PI)); // =>

0.8584073464102069

1.6.2 Schleifen

Schleifen gehören als iterative Kontrollstrukturen in die Welt der im-perativen Sprachen, rein funktionale Sprachen ermöglichen die Wie-derholungen ausschließlich über Rekursionsaufrufe. JavaScript ist je-doch nicht rein funktional, es hat die vier Schleifenkonstrukte while,do/while, for und for-in wie in Java. Die Syntax ist bei den ersten drei

14

Page 15: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.6 Kontrollstrukturen

Schleifenkonstrukten identisch zu der in Java. Bei der for-Schleife istzu beachten, dass die Zählvariable mit var deklariert wird, so wie imfolgenden Beispiel, dass die Euler’sche Zahl iterativ berechnet:

1 var n = 5, y = 0;

2 for (var k = 0; k <= n; k++) {

3 y += 1/factorial(k);

4 document.write("<br/>" + k + ". Iteration für e: " + y);

5 }

Hier bezeichnet factorial die Fakultätsfunktion auf S. 22. Die Ausga-ben lauten dabei sukzessive 2, 2.5, 2.66666. . . , 2.70833. . . , 2.71666. . . .Mit der for-in-Schleife kann man auf die Eigenschaften eines Objektszugreifen, ähnlich wie die foreach-Schleife in PHP. Ihre Syntax lautet:

for(var key in obj) {

... obj[key] ...;

}

Hierbei sind for, var und in Schlüsselworte, während key die durch dieEigenschaften (properties) des Objekts obj laufende Variable bezeich-net. Auf beide Werte von key und obj kann dann in der Schleife zuge-griffen werden. Das Beispielprogramm

1 var gemüse = {

2 name: "Möhre",

3 for: "Max", // funktioniert nicht im IE 8! (aber in IE 9)

4 details: {

5 color: "orange",

6 size: 12

7 },

8 toString: function() {return this.name + ", " + this.details

.color;}

9 }

10 for(var schlüssel in gemüse) {

11 document.write("<br/> gemüse[" + schlüssel + "] = " + gemüse

[schlüssel]);

12 }

ergibt die Ausgabe

gemüse[name] = Möhre

gemüse[for] = Max

gemüse[details] = [object Object]

gemüse[toString] = function () {return this.name + ", " + this.

details.color;}

Man sieht, dass Werte von Attributen mit einfachem Datentyp angezeigtwerden, Objekte als Attribut jedoch nicht. Bei einer Funktion wird derQueltext angezeigt, d.h. im Programmablauf kann man auf den definie-renden Quelltext von Objektfunktionen lesend zugreifen.

15

Page 16: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

1.7 Wichtige Standardobjekte

Es gibt einige vorgegebene Objekte in JavaScript, so die drei ObjekteString, Number, Boolean zu den entsprechenden Datentypen, die ObjektMath, Date und RegExp, das Function-Objekt und einige Error-Objekte, so-wie die Datenstrukturen Array und JSON [JS, §15].

1.7.1 Arrays

Die einzige Datenstruktur oder Kollektion in JavaScript ist das Array.Ein Array ist in JavaScript ein Objekt mit dem Konstruktor Array undkann daher mit dem new-Operator erzeugt werden. Empfohlen ist je-doch stattdessen die Erzeugung mit [] (dem Literalausdruck):

1 var a = [];

2 a[0] = 10;

3 a[1] = 20;

4 a[5] = "Unterschied"; // Array mit unterschiedlichen Datentypen

5 document.write("Länge von a: " + a.length + "<br/>"); // => 6

6 document.write("a = "+a+"<br/>"); // => 10,20,,,,Unterschied

Arrays sind, wie in Skriptsprachen allgemein, dynamisch in ihrer Grö-ße. Daher muss die Größe nicht bei der Erzeugung angegeben werdenwie beispielsweise in Java. Standardmäßig sind Arrays in JavaScript nu-merisch. Der Array-Index wird von 0 an hochgezählt. Die Elemente ei-nes Array müssen nicht vom gleichen Typ sein. Das Attribut length gibtdie Länge des Arrays zurück, die sich bei numerischen Arrays aus demgrößten belegten Indexwert plus Eins ergibt. Ferner muss man das Ar-ray nicht sukzessive auffüllen, sondern kann durchaus nach Index 1 denIndex 3 belegen; der Eintrag mit Index 2 bleibt dann entsprechend un-definiert.Ein Array kann ohne newund den Konstruktor mit einer einzigen Anwei-sung erzeugt werden, indem die Einträge in eckigen Klammern einge-schlossen und durch Kommas getrennt dem Arraynamen zugewiesenwerden:

1 var b = [5,7,12];

2 document.write("Länge von b: " + b.length + "<br/>"); // => 3

3 document.write("b = " + b + "<br/>"); // => 5,7,12

Damit ist das Array automatisch indiziert. (Eine Einzelbelegung der Ar-rayplätze ohne einen Index mit leeren eckigen Klammern, wie in PHP,funktioniert in JavaScript jedoch nicht.)

Assoziative Arrays.

In JavaScript sind auch assoziative Arrays möglich. Als Schlüssel (keys)können dabei Strings verwendet werden, aber auch beliebige Objektewie ein Array.

16

Page 17: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.7 Wichtige Standardobjekte

1 var tel = new Array();

2 tel["Meier"] = "9330-723"; // Arrays können assoziativ sein

3 tel["Müller"] = "0815/4711";

4 tel[a] = 42; // a ist das Array von oben!

5 document.write("<br/>Länge: " + tel.length + "<br/>"); //

lenght=0!

6 for(var key in tel) {

7 document.write("tel[" + key + "] = " + tel[key] + "<br/>");

8 } // tel[Meier] = 9330-723, tel[Müller] = 0815/4711,

tel[10,20„„Unterschied] = 42

Allerdings kann man bei einem assoziativen Array nicht mehr das Attri-but length verwenden, es hat stets den Wert 0. Im Grunde sind Objektein JavaScript nichts anderes als assoziative Arrays, bis auf die Tatsache,dass für ein Objekt im allgemeinen das Attribut length undefiniert ist,während es für ein assoziatives den Wert 0 hat.Eine wichtige Funktion eines Arrays ist forEach,8 die als Argument ei-ne Funktion callback erhält, die sie auf jedes Array-Element anwendet.callback muss dabei drei Argumente (value, index, array) vorsehen,wobei value der beim Durchlaufen aktuell bearbeitete Elementwert ist,index der entsprechende Array-Index, und array das aktuelle Array.

1 var callback = function(value, index, array) {

2 document.write("a[" + index + "] = " + value + ", ");

3 }

4 [2, 3, 5].forEach(callback); // => a[0] = 2, a[1] = 3, a[2] =

5,

Falls der dritte Parameter array nicht benötigt wird (wie in diesem Bei-spiel), kann er auch einfach weggelassen werden.

1.7.2 JSON

Die Abkürzung JSON steht für JavaScript Object Notation und bezeich-net zunächst ein weitverbreitetes Format zum Datenaustausch, alsoinsbesondere eine allgemeine Syntax zur Serialisierung (Speicherung)und Übermittlung von Werten oder Objekten der sieben Datentypenauf S. 9, bis auf die Funktionen und undefined. Dabei ist zu beachten,dass in JSON nur Objekte erlaubt sind, deren Attribute Strings sind;es muss also heißen "name"="Müller" statt name="Müller". In JavaScriptist JSON ein spezielles globales Objekt, das die beiden entgegengesetztwirkenden („komplementären“) Methoden parse und stringify bereit-stellt. Mit dem Befehl JSON.parse("...")wird der JSON-String in ein Ob-jekt oder einen Wert in JavaScript umgewandelt. Ist der String nicht imJSON-Format, so wird das Programm mit einem Syntaxfehler beendet.

8 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_

Objects/Array/forEach

17

Page 18: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

Mit JSON.stringify(...) wird ein Objekt oder ein Wert in einen Stringin JSON-Format umgewandelt.

1 var gemüse = {

2 name: "Möhre",

3 details: {

4 color: "orange",

5 size: 12

6 },

7 toString: function() {return this.name + ", " + this.details

.color;}

8 }

9 document.write("<br>" + gemüse); // Möhre, orange

10 //var obj = JSON.parse(gemüse); // => Uncaught SyntaxError:

Unexpected token M

11 var jsn = JSON.stringify(gemüse);

12 document.write("<br>" + jsn); //

"name":"Möhre","details":"color":örange",ßize":12

13 var obj = JSON.parse(jsn);

14 document.write("<br>" + obj.name); // Möhre

15 var a = [2,3,5,7,11,13,17]; // Array von Primzahlen

16 jsn = JSON.stringify(a)

17 document.write("<br>" + jsn); // [2,3,5,7,11,13,17]

18 var b = JSON.parse("[2,3,5,7,11,13,17]");

19 document.write("<br>" + b); // 2,3,5,7,11,13,17

20 var c = JSON.parse("2357111317");

21 document.write("<br>" + c); // 2357111317

Man erkennt an dem Quelltextbeispiel, dass stringify alle Attribute inStrings verwandelt und Funktionen (wie hier die toString-Methode)einfach ignoriert. Weitere Details, insbesondere zur Syntax von JSON,findet man im MDN.9

1.7.3 Ereignisbehandlung (Events und Event-Handler)

JavaScript ermöglicht die Ausführung von Anweisungen, die durch Ein-gabeereignisse, sogenannte Events, ausgelöst werden und in speziel-len Methoden, den zuständigen Event-Handlern, implementiert sind.Events und Event-Handler stellen auf diese Weise ein wesentlichesBindeglied zwischen dem HTML-Dokument und JavaScript-Funktionendar. Grundsätzlich funkioniert die Ereignisbehandlung dabei wie folgt.Jede Anwenderaktion, also eine Mausbewegung, ein Mausklick, ein Tas-tendruck, löst ein Ereignis oder Event aus. Ist für das Element, in demdas Ereignis erzeugt wird, also beispielsweise eine Schaltfläche oderein Textfeld, ein Ereignisbehandler registriert, so ruft dieser diejenige,

9 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_

Objects/JSON; weitere Infos zu JSON: https://developer.mozilla.org/en-US/docs/JSON

18

Page 19: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.7 Wichtige Standardobjekte

auf die er referenziert, und führt sie aus.

Das Grundkonzept der Ereignisbehandlung in JavaScript ist klar undeinfach: Für ein HTML-Element kann ein Event-Handler als ein Attri-but festgelegt werden, das auf die JavaScript-Funktion oder die Anwei-sungfolge verweist, die bei Auslösen des entsprechenden Ereignissesauszuführen ist. Die Attribute der Ereignisbehandler sind daran zu er-kennen, dass sie mit on... beginnen. Beispielsweise ist der Ereignisbe-handler für einen Mausklick onclick oder für das Loslassen einer Tasteonkeyup. Im allgemeinen kann nicht jeder Ereignisbehandler in jedemHTML-Element registriert werden, eine Auflistung der Ereignisbehand-ler und der HTML-Elemente, für die sie definiert sind, findet man aufselfhtml.org10, eine umfangreiche Liste von Ereignissen in der MozillaEvent Reference11. Das folgende Beispielprogramm zeigt einige Ereig-nisbehandler für Maus- und Touchscreen-Ereignisse:

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <script>

6 var machma = function(event) {

7 alert(event + " ausgelöst!");

8 };

9 </script>

10 </head>

11 <body>

12 <p onclick="machma(’Klick’);">

13 Wer hier klickt, kann was erleben!

14 </p>

15 <p ondblclick="machma(’Doppelklick’);">

16 Wer hier doppelklickt, auch!

17 </p>

18 <p onwheel="machma(’Mausrad’);">

19 Hier müssen Sie das Mausrad drehen!

20 </p>

21 <p ontouchmove="machma(’Touchmove’);">

22 Hier müssen Sie wischen!

23 </p>

24 </body>

25 </html>

Das Programm ist für Ihr Endgerät abrufbar über http:

//haegar.fh-swf.de/JavaScript/event-handler.html.

10 http://de.selfhtml.org/javascript/sprache/eventhandler.htm11 https://developer.mozilla.org/en-US/docs/Mozilla_event_reference

19

Page 20: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

1.7.4 Date

Das Objekt Date regelt in JavaScript alle Berechnungen mit Datum undZeit. Grundlage ist die Unix-Zeit in Millisekunden mit dem Nullpunkt1.1.1970, 0:00 Uhr UTC (Universal Coordinated Time). Es gibt mehrereKonstruktoren für ein Date-Objekt

1 var today = new Date(); // liefert das aktuelle Datum und

Uhrzeit

2 var birthday = new Date("December 17, 1985 03:24:00");

3 var geburtstag = new Date(1985,11,17);

4 var anniversaire = new Date(1985,11,17,3,24,0);

Daneben gibt es noch einen Konstruktor, der als Argument die Unixzeitin Millisekunden erwartet. Zwar gibt es eine Reihe von Methoden fürdas Objekt, insbesondere zur Ausgabe von Datum und Uhrzeit, jedochsind die Ausgabeformate nur wenig spezifiziert und daher in ihrer Dar-stellung browserabhängig.12 Mit den folgenden Methoden kommt manin der Regel jedoch hin:

1 var tag = ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag

","Freitag","Samstag"];

2 var jetzt = new Date();

3 document.write("Heute ist " + tag[jetzt.getDay()] + ", der ");

4 document.write(jetzt.getDate() + "." + (jetzt.getMonth()+1) + "

." + jetzt.getFullYear());

5 var minuten = Math.floor(jetzt.getMinutes() / 10) + "" + jetzt.

getMinutes() % 10;

6 document.write(", " + jetzt.getHours() + "." + minuten + " Uhr"

);

7 document.write(", oder: " + jetzt.toISOString());

Eine Liste der möglichen Methoden für ein Date-Objekt findet man bei-spielsweise auf selfhtml.de.13

1.8 Funktionen und Callbacks

JavaScript ermöglicht funktionale Programmierung. In einer funktiona-len Programmiersprache können Funktionen definiert werden und esgibt keinen Unterschied zwischen Daten und Funktionen, Funktionenkönnen also auch in Variablen gespeichert und als Parameter überge-ben werden [8, S. 6]. Die funktionale Programmierung steht damit imGegensatz zur imperativen Programmierung, denn die Trennung vonDaten und Programmlogik wird aufgehoben und jede Variable kann nureinmal einen Wert bekommen (final in Java). Rein funktionale Spra-

12 Eine der Methoden, getYear(), ist sogar deutlich schlecht programmiert, sie gibtdie Differenz der Jahreszahl mit 1900 zurück!

13 http://de.selfhtml.org/javascript/objekte/date.htm [2016-07-17]

20

Page 21: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.8 Funktionen und Callbacks

chen haben sogar gar keine Variablen oder Schleifen, denn ein Algorith-mus wird hier durch eine Abfolge von Funktionsaufrufen ausgeführt;für Wiederholungen werden also keine Schleifen verwandt, sondernausschließlich Rekursionen. So werden mathematisch unsinnige Aus-drücke der imperativen Programmierung wie x=x+1 vermieden. Ande-rerseits widerspricht die funktionale Programmierung dem objektori-entierten Paradigma, gemäß dem Objekte im Laufe ihres Lebenszyklusverschiedene Zustände annehmen können, die Attribute also Veränder-liche sein müssen. JavaScript ist ein Kompromiss aus beiden Ansätzen,indem es beide Programmierparadigmen ermöglicht.

Funktionen gehören zu einem der elementaren Datentypen von Java-Script und bilden die modularen Einheiten der Sprache [1, S. 29]. Ei-ne Funktion wird definiert durch das Schlüsselwort function, ihren Na-men, eine von runden Klammern eingeschlossene Liste von durch Kom-mas getrennten Parametern, und den durch geschweifte Klammernumschlossenenen Funktionsrumpf, der die Anweisungen der Funktionenthält. Der Rückgabewert der Funktion wird mit dem Schlüsselwortreturn ausgegeben:

1 function f(x,y) {

2 return x*x - y*y;

3 }

4 document.write("f(5,3) = " + f(5,3)); // => 16

Als funktionale Programmiersprache ermöglicht JavaScript die Defini-tion anonymer Funktionen, auch „Lambda-Ausdrücke“ genannt:

1 var g = function(x,y) {return x*x + y*y}

2 document.write("<br>g(5,3) = " + g(5,3)); // => 34

Damit kann eine Funktion in einer Variablen gespeichert werden;oder genauer gesagt als Referenz auf eine anonyme Funktion. Sol-che Funktionsreferenzen werden Rückruffunktionen oder Callbacks ge-nannt, wenn sie in andere Funktionen als Argument eingesetzt und vondiesen aufgerufen werden.Rückruffunktionen sind ein wichtiges Programmierkonzept der funk-tionalen Programmierung. Die Programmierung mit Rückruffunktio-nen folgt dem Entwurfsmuster der Kontrollflussumkehr (Inversion ofControl, IoC), denn in ein bereits vorher definiertes Programmmodul(die aufrufende Funktion) bzw. eine gegebene Infrastruktur (z.B. dieAPI) kann „nachträglich“ auszuführender Quelltext definiert werden.Viele JavaScript-Bibliotheken und Frameworks basieren auf diesemPrinzip. Als ein einfaches Beispiel einer Rückruffunktion soll das fol-gende kurze Programm dienen:

var callback = function(x) {return x*x;};

var quadrate = [1, 2 , 3, 4, 5].map(callback);

document.write(quadrate); // => 1,4,9,16,25

21

Page 22: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

Hier wird die Funktion callback(x) = x2 von der API-Funktion map ei-nes Arrays aufgerufen und ausgeführt. Ihr „Rückruf“ ergibt am Ende

Abb. 1.3: Aufrufstruktur einer Rückruffunktion. (Modifiziert nach https:

//en.wikipedia.org/wiki/File:Callback-notitle.svg)

ein Array, das in jedem Eintrag den Quadratwert des originalen Arraysenthält. Die Aufrufstruktur ist in Abbildung 1.3 skizziert.Es gibt zwei Arten von Rückruffunktionen. Eine Rückruffunktion heißtblockierend, oder auch synchron, wenn sie mit ihrer Referenz aufgeru-fen wird und ihr Ausführungsergebnis abgewartet wird, um weiterver-arbeitet zu werden. Das obige Programmierbeispiel ist eine solche syn-chrone Rückruffunktion.Bei einer verzögerten (deferred) oder asynchronen Rückruffunktionwird die Rückruffunktion in einem anderen Prozess oder Thread aus-geführt, das Hauptprogramm wartet aber nicht auf das Ergebnis derRückruffunktion. Stattdessen wird das Ergebnis der Rückruffunktion„möglichst schnell“ verarbeitet, wenn es eingetroffen ist. Typische An-wendungsfälle solcher verzögerten Rückruffunktionen sind Ereignis-behandler, die nach einem gefeuerten Ereignis die Rückruffunktionausführen, oder Aufrufe serverseitiger Skripte im Web.In der nebenläufigen Programmierung spricht man bei asynchronenRückruffunktionen auch oft von Promises.14

Rekursionen.

In rein funktionalen Sprachen können Wiederholungen nicht durchSchleifen, sondern nur durch Rekursionen durchgeführt werden, alsodurch Selbstaufrufe von Funktionen. Als ein einfaches Beispiel sei dieBerechnung der Fakultät angegeben:

1 var factorial = function (n) {

2 if (n < 0) return NaN;

3 if (n === 0) return 1;

4 return n * factorial(n-1);

5 }

6 document.write("<br>factorial(5) = " + factorial(5)); // => 120

Hierbei ist NaN in JavaScript ein globales Objekt und wird in der Regel alsErgebnis von im Reellen nicht erlaubten mathematischen Operationen

14 https://docs.angularjs.org/api/ng/service/$q#the-promise-api

22

Page 23: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.8 Funktionen und Callbacks

wie Division durch 0 oder√

–1 zurückgegeben.15

In JavaScript wird häufig eine Rekursion mit einer definierten Verzöge-rung aufgerufen. Dazu muss die Funktion setTimeout verwendet wer-den,16 deren erstes Argument die aufzurufende Funktion und derenzweites die Verzögerungszeit in Millisekunden ist:

1 var rekurs = function(n) {

2 if (n <= 0) return;

3 setTimeout("rekurs("+(n-1)+")",1000);

4 console.log("Aufruf rekurs("+n+")");

5 }

6 rekurs(5);

Um eine Funktion mit Argumenten aufzurufen, muss sie als String mitdem gewünschten Argumentwert aufbereitet werden.17 Man erkenntbeim Ausführen des Skripts insbesondere in der Konsole des Firefox, inder die Uhrzeiten der Ausgaben protokolliert werden, dass setTimeout

zwar den Aufruf der angegebenen Funktion verzögert, den weiterenAblauf der aufrufenden Funktion jedoch nicht aufhält: Die Ausgabe er-scheint stets direkt nach Aufruf der Funktion, aber eine Sekunde vordem Rekursionsaufruf der nächsten Funktion.

Funktionen höherer Ordnung.

Eine Funktion höherer Ordnung ist eine Funktion, die als Argument eineFunktion erwartet oder deren Ergebnis eine Funktion ist. Beispielswei-se kann die Kepler’sche Fassregel (oder auch Simpson-Regel)

If (a, b) ≈ b – a6

(f (a) + 4f

(a+b

2

)+ f (b)

)(1.1)

als Näherungsformel für das Integral If (a, b) =∫ b

a f (x) dx einer inte-grierbaren Funktion f : [a, b] → R mit a, b ∈ R in JavaScript wie folgtimplementiert werden:

1 var I = function (f, a, b) {

2 return (b-a)/6 * (f(a) + 4*f((a+b)/2) + f(b));

3 }

4

5 var f = function(x,y) {return 3*x*x;}

6 var g = function(x,y) {return 1/x;}

7 var h = function(x,y) {return Math.sqrt(1 - x*x);}

8

9 document.write("I(f,0,1) = " + I(f, 0, 1)); // => 1

10 document.write("<br/>I(g,1,e) = " + I(g, 1, Math.E)); // =>

1.0078899408946134

15 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_

Objects/NaN [2016-07-17]16 http://developer.mozilla.org/en/DOM/window.setTimeout [2016-07-17]17 http://javascript.about.com/library/blrecursive.htm [2016-07-17]

23

Page 24: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

11 document.write("<br/>I(h,0,1) = " + I(h, 0, 1)); // =>

0.7440169358562924

Die tatsächlichen Werte sind∫ 1

03 x2 dx = x3

∣∣∣10

= 1,∫ e

1

dxx

= ln x∣∣∣ e

1= 1 (1.2)

und [12, S. 163]

∫ 1

0

√1 – x2 dx =

arcsin x + x√

1 – x2

2

∣∣∣∣∣1

0

4≈ 0,78539816339745.

(1.3)(Für die Herleitung dieser Gleichung mit Integration durch Substitutionsiehe z.B. [3, §19.15]; der Graph der Funktion

√1 – x2 beschreibt in dem

Intervall [0, 1] einen Viertelkreis mit Radius 1.)

Closures.

Im Gegensatz zu vielen Programmiersprachen wie Java können in Java-Script Funktionen auch innerhalb von Funktionen definiert werden. Ei-ne solche innere Funktion hat wie jede Funktion Zugriff auf ihre eigenenVariablen, aber auch auf die Variablen der Funktion, in der sie definiertist. Eine innere Funktion heißt Closure.18 Mit Closures kann man Funk-tionenscharen oder „Funktionenfabriken“ programmieren, also Funk-tionen, die parameterabhängig Funktionen zurückgeben:

1 var fabrik = function(name) {

2 return function(instrument) {

3 return name + " spielt " + instrument;

4 }

5 };

6 var a = fabrik("Anna");

7 var b = fabrik("Bert");

8

9 document.write(a("Geige") + ", " + b("Bass")); // Anna spielt

Geige, Bert spielt Bass

Die äußere Funktion definiert hier eine Variable name, auf die die inne-re anonyme Funktion auch Zugriff hat. Bei jedem Aufruf der äußerenFunktion wird der jeweilige Wert der Variablen in der inneren Funkti-on „eingefroren“ und mit ihr zurückgegeben. Daher gibt die Funktionanna() einen anderen Wert zurück als die Funktion bert().Wofür braucht man Closures? Ein wichtiger Anwendungsfall für Clos-ures ist das Verbergen von Hilfs- oder Arbeitsfunktionen, die nach au-ßen vor dem Anwender gekapselt werden sollen. (In Java bis Version7 war das nur mit private Objektmethoden möglich.) Als Beispiel seidie folgende effiziente Berechnung der Fibonacci-Zahlen f0 = 0, f1 = 1,

18 http://jibbering.com/faq/notes/closures/#clClose [2016-07-17]

24

Page 25: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.8 Funktionen und Callbacks

f2 = 1, f3 = 2, . . . , fn = fn–1 + fn–2 durch eine Rekursion innerhalb deraufzurufenden Funktion angegeben:

1 var f = function (n) {

2 var c = function (f1, f2, i) { // innere

"Arbeitsfunktion" (Closure)

3 if (i == n) return f2;

4 return c(f2, f1+f2, i+1);

5 }

6 if (n.toFixed(0) != n) return NaN; // nur für ganze Zahlen

definiert!

7 if (n <= 0) return 0;

8 return c(0,1,1);

9 }

Ruft man nun die Funktion f mit einer natürlichen Zahl n auf, so wirddie innere Arbeitsfunktion c in Zeile 8 mit den Startwerten f0 = 0 unff1 = 1 und dem Zähler i = 0 aufgerufen, die sich wiederum in Zeile 6selbst aufruft, falls keine der Abbruchkriterien erfüllt ist. Bei jedem Auf-ruf enthält der zweite Parameter von c die Summe der letzten beidenFibonacci-Zahlen, dieZudem finden Closures Einsatz bei dem Funktionalkalkül, also der Al-gebra mit Funktionen. Man kann beispielsweise die Summe f +g zweierFunktionen f , g : R→ R definieren, indem man (f + g)(x) = f (x) + g(x)definiert. In JavaScript könnte der Additionsoperator für zwei Funktio-nen beispielsweise so aussehen:

1 var add = function(f, g) {

2 return function(x) {return f(x) + g(x);};

3 };

4

5 var f = function(x) {return x*x - 1;};

6 var g = function(x) {return x*x + 1;};

7 var x = 2;

8 document.write(add(f,g)(x) + ", " + max(f,g)(x)); // => 8, 5

IIFE.

Ein von JavaScript-Entwicklern oft verwendetes Programmiermusterist ein „sofort aufgerufener Funktionsausdruck“ (immediately invokedfunction expression, IIFE) meist mit Closures. Hierbei wird eine anony-me Funktion deklariert und sofort aufgerufen [11]:

Listing 2: Ein einfaches IIFE

1 (function() {

2 var tuwas = function() {

3 document.write("a="+ a);

4 }

25

Page 26: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

5

6 var a = 1;

7 tuwas();

8 })(); // => ä=1"

Dieser Ausdruck tut zunächst nichts Besonderes, die Funktion tuwas

wird ausgeführt und verarbeitet die Variable a. Funktionsdeklarationund Anweisungen sind in eine anonyme Funktion (Zeile 1) gekapselt,die sofort ausgeführt wird (letzte Zeile), also schematisch dargestellt:

(function() {...}) ();

Die Funktion tuwas ist hier also eine Closure, die auf die Variable a zu-greifen kann, auch wenn die äußere anonyme Funktion bereits abge-laufen ist. Das Programm würde aber dasselbe ausgeben, wenn man dieerste und letzte Zeile einfach wegließe. Nur wären dann tuwas und dieVariable a global definiert, und genau das ist das Problem: Globale Va-riablen sollten in JavaScript in komplexen Systemen möglichst vermie-den werden. Durch IIFEs lässt sich deren Anzahl deutlich reduzieren.Denn in Listing 2 beispielsweise sind die Variable a und die Funktiontuwas außerhalb der anonymen Funktion unbekannt.

1.9 DOM

Das DOM (Document Object Model), ist eine Schnittstellenbeschreibungfür API’s, die Parser oder Browser zur Darstellung von HTML- oderXML-Dokumenten verwenden können. Für JavaScript (aber auch für je-de andere Programmiersprache) ist im DOM festgelegt, welche HTML-Elemente als Objekte in zur Verfügung stehen und wie man dynamischneue Elemente hinzufügen oder löschen kann, aber auch, welche Event-Handler für eine clientseitige Interaktion implementiert werden kön-nen. Obwohl das Grundkonzept des DOM als eine Baumstruktur vonKnoten einfach ist, sind die Bezeichnungen und Dokumentationen zu-nächst etwas verwirrend. Neben der Standardreferenz sei daher dieDOM-API von Gecko, dem HTML-Interpreter („Rendering Machine“)der Mozilla-Programme,

https://developer.mozilla.org/en-US/docs/Gecko_DOM_Reference

empfohlen. Bevor wir das DOM in seinen für uns wesentlichen Detailsuntersuchen sei noch seine Historie erwähnt. Das DOM erschien suk-zessive in mehreren Versionen, bis zur Version 3 Level genannt. Level 1wurde im Oktober 1998 veröffentlicht, Level 2 im November 2000 undLevel 3 im April 2004 .Das DOM trägt seinen Namen „Objektmodell“ vor allem, da es HTML-oder XML-Elemente als Objekte darstellt und in gegenseitige Beziehun-gen setzt, nämlich in eine Baumhierarchie wie in Abbildung 1.4 skiz-ziert. In jedem Browser ist eine Objekthierarchie mit dem Wurzelob-jekt window vorhanden (Abbildung 1.4). Eines seiner Kindelemente ist

26

Page 27: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.9 DOM

Abb. 1.4: Objekt-Hierarchie des Browsers mit wichtigen Objekten, insbesondere dasdocument-Objekt.

document und bestimmt den im Browserfenster sichtbaren Inhalt. DasObjekt navigator liefert Informationen über den aktuellen verwende-ten Browser, und history über die im aktuellen Tab oder Frame bisheraufgerufenen Webseiten.19

1.9.1 Grundlegende Objekte des DOM: document und element

Das zentrale Interface des DOM ist Node,20 das einen allgemeinenKnoten des DOM-Baumes beschreibt. Ein Node im DOM hat u.a.stets einen parentNode und eine Liste von childNodes als Attribu-te und Methoden zum Hinzufügen oder Löschen von Kindknoten(appendChild, removeChild). Die wichtigsten Implementierungen vonNode sind document und element. Ein element21 ist ein allgemeines Ele-ment eines HTML- oder XML-Dokuments.

Das document-Objekt22 repräsentiert den Inhalt des darzustellendenDokuments, also den Inhalt des Browser-Fensters. Mit der Methodewrite()des document-Objekts können wir mit JavaScript in das Browser-Fenster schreiben. Eine weitere wichtige Methode des document-Objektes ist getElementById("ID"), die ein Element des Dokuments alsErgebnis liefert, dessen Attribut "id" als Wert den übergebenen Stringhat. Beide Methoden haben wir bereits als einführende Beispiele fürJavaScript-Ausgaben im Abschnitt 1.1 kennen gelernt.

CSS-Anweisungen mit der Eigenschaft style

Ein element-Objekt hat unter anderem die Eigenschaft style, mitder CSS-Deklarationen über JavaScript angewiesen werden können.21

Hierbei kann zu jedem HTML-Element dessen style-Attribut per Ja-vaScript verändert werden, indem das zu jeweilige CSS-Attribut miteinem neuen Wert belegt wird. Dabei ist zu beachten, dass ein CSS-Attribut mit einem Bindestrich in JavaScript mit der Binnenmajuskel-Notation (CamelCase) übernommen wird, da dort der Bindestrich alsMinuszeichen eine arithmetische Rechenoperation darstellen würde.In dem folgenden Beispielprogramm wird die Hintergrundfarbe des

19 https://developer.mozilla.org/en-US/docs/Web/API/Window20 https://developer.mozilla.org/en-US/docs/DOM/Node, http:

//de.selfhtml.org/javascript/objekte/node.htm [2016-01-18]21 https://developer.mozilla.org/en-US/docs/DOM/Element [2016-01-18]22 https://developer.mozilla.org/en-US/docs/DOM/Document [2016-01-18]

27

Page 28: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

Textes in einem span-Element per Schaltfläche verändert, indem dieFunktion aendereFarbe mit der gewünschten Hintergrundfarbe aufge-rufen wird.

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <title>CSS-Anweisungen über JavaScript und DOM</title>

6 <script>

7 var aendereFarbe = function(farbe) {

8 document.getElementById("text").style.backgroundColor =

farbe;

9 }

10 </script>

11 </head>

12 <body>

13 Hintergrundfarbe ändern:

14 <button onclick="aendereFarbe(’green’);">Grün</button>

15 <button onclick="aendereFarbe(’red’);">Rot </button>

16 <span id="text">Die Zeichen an der Wand.</span>

17 </body>

18 </html>

Die entscheidende Anweisung dazu ist in Zeile 8, wo das CSS-Attributbackground-color in Binnenmajuskelnotation in JavaScript als AttributbackgroundColor des Elementattributs style festlegt.

Das folgende auf Crockford [1, S. 42] zurückgehende Programm bei-spielsweise verändert mit einer Closure langsam die Hintergrundfar-be des Browserfensters (das Element document.body) von gelb (#ffff00)auf weiß (#ffffff):

1 var fade = function(element, delay) {

2 var level = 0;

3 var step = function() {

4 var hex = level.toString(16); // level in hexadezimal

5 element.style.backgroundColor = "#ffff" + hex + hex;

6 if (level < 15) {

7 level += 1; // Variable der äußeren Funktion!

8 setTimeout(step, delay); // Rekursion nach delay [ms]

9 }

10 };

11 step(); // erster Aufruf von step

12 };

13

14 fade(document.body, 100);

Hier rufen wir in Zeile 14 die Funktion fade auf und übergeben ihr das

28

Page 29: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.9 DOM

DOM-Objekt document.body, also den Knoten des HTML-Dokuments, derdurch das Tag <body> erzeugt wurde, und die Verzögerungszeit delay inMillisekunden. Die Methode fade setzt zunächst die Variable level auf0 und definiert als Closure eine rekursive Funktion step, in der level

bei jedem hochgezählt wird und der Rekursionsaufruf mit Hilfe vonsetTimeout um delay verzögert wird. In Zeile 11 wird dann step erst-mals aufgerufen und die Rekursion gestartet. Bei jedem weiteren Aufrufvon step wird der Wert der Variablen level erhöht und als neuer Wertin step verwendet. Die Variablen element, delay und level sind hier ausSicht der Closure also eine „globale“ Variable. Eleganter wäre sicherlicheine Rekursion, die ohne solche grlobalen Variablen auskommt, z.B. in-dem sie sie als Parameter übergibt:

var step = function(element, delay, level) {

...

if (level < 15) {

step(element, delay, level + 1);

}

};

Leider ermöglicht setTimeout jedoch nur den verzögerten Aufruf vonFunktionen ohne Parametern.

Hinzufügen und Löschen von Elementen

In dem folgenden Beispielprogramm wird mit Hilfe der Standardme-thoden des DOM createElement in Zeile 9 und appendChild in Zeile 10durch JavaScript dynamisch ein <li>-Element an das <ol>-Element mitder id angehängt.

Listing 3: DOM-Manipulation

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <title>DOM-Elemente</title>

6 <script>

7 var hinzufuegen = function() {

8 var wurzel = document.getElementById(’liste’);

9 var neu = document.createElement(’li’);

10 var neuerText = document.createTextNode("Die Zeichen an

der Wand.");

11 neu.appendChild(neuerText);

12 wurzel.appendChild(neu);

13 }

14 var loeschen = function() {

15 var element = document.getElementById(’liste’);

16 if (element.hasChildNodes()) {

29

Page 30: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

17 element.removeChild(element.lastChild);

18 }

19 }

20 </script>

21 </head>

22 <body>

23 <button onclick="hinzufuegen();">Neuer Text</button>

24 <button onclick="loeschen();">Löschen</button>

25 <ol id="liste"></ol>

26 </body>

27

28 </html>

Entsprechend wird in Zeile 18 das letzte Kindelement des <ol>-Elements mit der id mit der Methode removeChild gelöscht. Damites nicht zu einem Laufzeitfehler kommt, wenn kein Kindelement des<ol>-Elements mehr vorhanden ist, wird das Löschen nur durchge-führt, wenn die Prüfung auf Existenz von Kindknoten mit der Metho-de hasChildNodes in Zeile 17 positiv ausgeht. Der DOM-Baum des Doku-

Abb. 1.5: Der DOM-Baum des HTML-Dokuments aus Listing 3.

ments ist in Abbildung 1.5 skizziert. Die gestrichelt gezeichneten Kno-ten werden durch das JavaScript-Programm je nach Eingabe hinzuge-fügt oder gelöscht.

1.9.2 Das window-Objekt

Das Browser-Fenster, in dem die HTML-Seite, die den JavaScript-Codeenthält, dargestellt wird, wird durch ein window-Objekt repräsentiert.Das window-Objekt verfügt über Methoden wie prompt() alert() oderconfirm(), mit denen eigene Fenster zur Ein- und Ausgabe geöffnet wer-den können.

30

Page 31: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.9 DOM

Darüberhinaus hat das window-Objekt Attribute, die sich von JavaScriptaus steuern lassen. Dazu gehört die Statuszeile (Attribut status), derURL, der gerade dargestellt wird (location) oder die URL’s der Seiten,die bis jetzt dargestellt wurden (history).Tatsächlich sind sind sogar alle anderen JavaScript-HTML-Objekte ent-weder selbst Attribute des window-Objekts oder Attribute von Attribu-ten des window-Objekts; so auch das document-Objekt, welches wir be-reits öfter zum Schreiben in das Browser-Fenster benutzt haben. Daswindow-Objekt ist also die Wurzel der Objekthierarchie in JavaScript.Das window-Objekt verfügt über drei Methoden, mit denen Benutzerin-teraktion möglich ist. Die erste (prompt()) haben wir bereits kennen-gelernt. prompt() öffnet ein eigenes Fenster oberhalb des Browser-Fensters. Das Fenster enthält zwei Bereiche: im ersten wird eine Mel-dung dargestellt (erster Parameter von prompt()), im zweiten kann derBenutzer Eingaben tätigen (der zweite Parameter von prompt() ist eineVorgabe im Eingabefeld).confirm() erwartet vom Benutzer eine Bestätigung. Der einzige Pa-rameter von confirm() ist eine Meldung, die im von confirm() aufge-spannten Fenster dargestellt wird. Der Benutzer kann mit einem OK-Button bestätigen (confirm() liefert dann true zurück) oder mit einemAbbruch-Button abbrechen (confirm() liefert false zurück). Betrachtenwir dazu folgendes Programm:

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <script>

6 var factorial = function (n) {

7 if (n < 0) return NaN;

8 if (n === 0) return 1;

9 return n * factorial(n-1);

10 }

11

12 var einlesen = function () {

13 var n = document.getElementById("eingabe").value;

14 var wirklich = true;

15 if (n > 150) {

16 wirklich = confirm("Wirklich "+n+"! berechnen? Das kann

lange dauern . . .");

17 }

18 if (wirklich) {

19 document.getElementById("label").innerHTML = n + "! = " +

factorial(n);

20 } else {

21 document.getElementById("label").innerHTML = "Berechnung

von "+n+"! abgebrochen.";

31

Page 32: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

22 }

23 }

24 </script>

25 </head>

26 <body>

27 <input type="text" id="eingabe"/>

28 <input type="button" value="Rechnen" onclick="einlesen();"/>

29 <p>Ergebnis: <span id="label"></span>.</p>

30 </body>

31 </html>

Hier muss der Anwender die Frage bestätigen, ob die Zahl, deren Fakul-tät berechnet werden soll, größer als 150 sein darf. In diesem Fall wirdein confirm-Fenster aufgebaut. Wählt der Benutzer „OK“, gibt confirm

einfach true zurück. Der Boole’schen Variablen wirklichwird damit derWert true zugewiesen und die Fakultäten werden berechnet. Klickt derBenutzer hingegen Abbrechen, wird von confirm false zurückgegeben,wirklichwird damit false zugewiesen, und die Berechnung findet nichtstatt.

1.10 XMLHttpRequest und AJAX

Ein weiteres wichtiges Objekt in JavaScript ist XMLHttpRequest. Es er-möglicht, über einen aus JavaScript ausgelösten Request, also eineNetzanfrage, Daten von einem beliebigen URL zu laden. Es spielt ei-ne Schlüsselrolle bei AJAX-Anwendungen. Anders als der Name sug-geriert, kann XMLHttpRequest nicht nur XML-Daten laden, sondern be-liebige Formate, also auch Binärdateien wie Bilder und Streams. Eben-so kann es nicht ausschließlich HTTP-Requests auslösen, sondern auchandere Anfragen über andere Protokolle wie FTP oder FILE.Als Objekt besitzt es als wichtigste Attribute readystate, response undstatus, als wichtigste Methoden openund send sowie den Event-Handleronreadystatechange:23

Um einen HTTP-Request auszulösen, muss zunächst einXMLHttpRequest-Objekt mit new instanziiert werden:

var request = new XMLHttpRequest();

Mit der Methode open wird ein Request initialisiert. Sie benötigt dafürmindestens zwei Parameter vom Typ String, sowie drei optionale Para-meter:

23 https://developer.mozilla.org/en/DOM/XMLHttpRequest

32

Page 33: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.10 XMLHttpRequest und AJAX

void open(String method, String url, [boolean async, String user,

String password])

Hierbei bezeichnet method die HTTP(S)-Methode, die einen der Wer-te "GET", "POST", "PUT" oder "DELETE" annehmen kann und url der an-gefragte URL, also der Pfad zur angefragten Datei. Der optionale Boo-le’sche Parameter async bestimmt, ob die Anfrage asynchron ablaufenoder das Programm die Antwort abwarten soll; er ist im Default auf truegesetzt. Die beiden optionalen Parameter user und password schließ-lich ermöglichen eine etwaig notwendige Authentifizierung für Zugangzu dem URL. Mit der Methode send wird die Anfrage abgeschickt. Dazumuss sie vorher mit open initialisiert sein. Ist sie asynchron initialisiert,so läuft das Programm weiter, andernfalls wird das Ende der Metho-de abgewartet. Die Methode kann optional mit zu übertragenden Da-ten als Parameter aufgerufen werden, z.B. Formulardaten. Die Funktiononreadystatechange ist ein Event Handler, der auf Änderungen des Attri-buts readyState reagiert, das wiederum einen der 5 möglichen Werte 0,1, 2, 3, 4 annehmen kann:

readyState Zustand Bedeutung0 UNSENT open ist noch nicht aufgerufen1 OPENED send ist noch nicht aufgerufen2 HEADERS_RECEIVED send ist aufgerufen und Headers und Status des

Requests sind verfügbar3 LOADING Daten werden empfangen4 DONE Die Anfrage ist erledigt

Die beiden ersten Zustände dienen der Vorbereitung der Kommunika-tion, der Request wird erst durch die send()-Methode ausgelöst. Die-se Kommunikation läuft übrigens asnchron ab, d.h. die send()-Methodeblockiert oder beeinflusst nicht andere JavaScriptprogramme der Seite.Diese Möglichkeit, asynchrone Anfragen an den Server zu stellen, ohnedass die dargestellte Webseite blockiert wird oder gar neu geladen wer-den muss, bildet die technische Grundlage für AJAX-Anwendungen, diewir in Abschnitt 1.10.2 behandeln werden.Der Event Handler ist zunächst nur eine „leere“ Funktion und mussimplementiert werden, so wie wir es ja auch von den Event-Handlerndes DOM bereits kennen. Üblicherweise wird hier die Antwort derAnfrage verarbeitet, die wiederum in dem Attribut response gespei-chert ist. Im Überblick ergibt sich damit das Zustandsdiagramm ei-nes XMLHttpRequest-Objekts nach Abbildung 1.6. Die Details sind imtechnischen Report unter http://w3.org/TR/XMLHttpRequest des W3-Konsortiums festgelegt.Beginnen wir mit einem einfachen Beispiel, das die vier Schritte Erzeu-gung eines Requests, Implementierung des Event Handlers, Öffnen undSenden eines Requests zeigt:

33

Page 34: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

Abb. 1.6: Zustandsdiagramm eines XMLHttpRequest-Objekts. Vgl. [6, S. 26].

1 var request = new XMLHttpRequest();

2 request.onreadystatechange = function() { // Event Handler

3 if (request.readyState === 4) { // Request ist erledigt

4 document.write(request.response);

5 }

6 }

7 request.open("GET", "http://localhost/");

8 request.send();

Die Reihenfolge der Anweisungen bei der Ausführung des Programmsentspricht dabei nicht ganz der Reihenfolge ihrer Implementierung:Der Event-Handler onreadystatechange wird für das Request-Objektzwar zu Beginn des Objektes implementiert, aber erst nach Beendender Anfrage verarbeitet, also nach dem send. Er sollte aber natürlich be-reits implementiert sein, wenn der Request gesendet wird.Zu beachten ist, dass bei den Standardeinstellungen des Webserverseine Anfrage in JavaScript nur für denselben Server möglich ist, aufdem sich auch das JavaScript-Programm befindet. Möchte man überXMLHttpRequest einen anderen Server aufrufen, so müssen die Einstel-lungen dieses Servers entsprechend angepasst sein. Man spricht in die-sem Falle von Cross Origin Resource Sharing (CORS).24 Damit JavaScripteinen XMLHttpRequest weiter verarbeitet, muss der Server nämlich dieAntwort mit dem HTTP-Header

Access-Control-Allow-Origin: *

senden. Möglich ist auch die Variante Access-Control-Allow-Origin:

http://foo.bar, wobei foo.bar die Domain ist, von der die Anfrage, alsodas JavaScript-Programm, kommt. Ein PHP-Skript kann diesen Headerindividuell senden, wenn es mit der Zeile

1 header("Access-Control-Allow-Origin: *");

beginnt.

24 http://www.w3.org/wiki/CORS_Enabled

34

Page 35: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.10 XMLHttpRequest und AJAX

Mit dem Standardobjekt FormData kann man dynamisch erstellte For-mulardaten versenden.25 Ein einfaches Beispiel übermittelt die Formu-lardaten x=2 an ein PHP-Skript:

1 var request = new XMLHttpRequest();

2 request.onreadystatechange = function() { // Event Handler

3 if (request.readyState === 4) {

4 document.write(request.response);

5 }

6 };

7 request.open("POST", "http://haegar.fh-swf.de/AJAX/spiegel.php"

);

8 var data = new FormData();

9 data.append("x",2);

10 request.send(data);

Mit der folgenden Änderung der Zeile 9 erhält man sogar die Übertra-gung eines dynamisch in JavaScript erzeugten Arrays prim:

1 data.append("prim[]",2); data.append("prim[]",3); data.append("

prim[]",5);

1.10.1 Aktionen nach dem Request: onreadystatechange

Bislang haben wir nur Beispiele von XMLHttpRequest-Objekten ken-nengelernt, deren Event-Handler onreadystatechange einfach nur dieempfangene Antwort des Servers, d.h. den String request.response,ausgibt. Häufig werden allerdings komplexere Daten übermittelt, diein dem Event-Handler weiter verarbeitet werden sollten. Grundsätz-lich können diese Daten als beliebiger Text vorliegen, üblich sind aberStrings in den drei folgenden Formaten HTML, JSON und XML. Die Ver-arbeitung

• HTML-Strings werden dabei in der Regel nicht weiterverar-beitet und unverändert dargestellt, also so wie in den obigenXMLHttpRequest-Beispielen mit request.response.

• Ein JSON-String kann mit der Standardmethode JSON.parse() di-rekt in ein JSON-Objekt umgewandelt werden, also beispielswei-se

var objekt = JSON.parse(request.respnse);

Dieses Objekt kann nun in JavaScript beliebig weiterverarbeitetwerden.

25 https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/FormData/ [2016-07-17]; siehe auch:https://developer.mozilla.org/en/DOM/XMLHttpRequest/FormData/Using_FormData_

Objects

35

Page 36: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

• Ein XML-String kann manuell geparst werden. Ist die Serverant-wort beispielsweise ein SVG-String, so kann die Grafik direkt imBrowser dargestelllt werden.

Betrachten wir als Beispiel das folgende Programm, das die Datendes aktuellen Sondernangebots im JSON-Format erhält und im Event-Handler verarbeitet:

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <script>

6 var ladenJSON = function() {

7 var request = new XMLHttpRequest();

8 request.onreadystatechange = function() {

9 if (request.readyState === 4 && request.status === 200)

{

10 var artikel = JSON.parse(request.response);

11 var element = document.getElementById("angebot");

12 var ausgabe = "Kaufen Sie unseren " +

13 artikel.name + " mit der Nummer " +

14 artikel.id + " für " + artikel.preis + " &euro;!";

15 element.innerHTML = ausgabe;

16 }

17 };

18 request.open("GET", "http://haegar.fh-swf.de/json-artikel

.php");

19 request.send();

20 }

21 </script>

22 </head>

23 <body>

24 <h1>Unser Preisknaller!</h1>

25 <p id="angebot">Klicken Sie, um unser heutiges Sonderangebot

zu sehen:</p>

26 <input type="button" value="JSON Eingabe" onclick="ladenJSON

();";>

27 </body>

28 </html>

Bei Aufruf der HTML-Datei erscheint unter der Überschrift zunächstder Text „Klicken Sie, um unser heutiges Sonderangebot zu sehen:“.Klickt man den Button, so wird sein Event-Handler onclick aufgerufen,der wiederum die Funktion ladenJSON aufruft. In ihr wird ein XMLHtt-pRequest request erzeugt, das ein PHP-Skript auf dem Hägar-Serveraufruft und einen JSON-String empfängt, der in dem Event-Handleronreadystatechange zu einem vollständigen Text „Kaufen Sie unseren

36

Page 37: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.10 XMLHttpRequest und AJAX

Prozessor mit der Nummer 123 für 99.99 €!“ ausformuliert wird unddamit den vorherigen Text im <p>-Element überschreibt, allerdings nurunter der Bedingung, dass die HTTP-Antwort eingetroffen und derStatus-Code OK lautet. (Der Status-Code 200 besagt, dass die HTTP-Anfrage erfolgreich verlief.) Das PHP-Skript auf Hägar ist übrigens nurganz kurz und gibt einen immer gleichen String aus:

1 <?php

2 header("Access-Control-Allow-Origin: *");

3 echo ’{

4 "id" : "123",

5 "name" : "Prozessor",

6 "preis": 99.99

7 }’;

8 ?>

Wir können uns jedoch leicht vorstellen, dass das PHP-Programm statt-dessen einen Datenbankzugriff ausführen könnte und so das Tagesan-gebot aktuell aus der Datenbank selektiert.

1.10.2 AJAX

Viele moderne Webanwendungen basieren auf AJAX (Asynchronous Ja-vaScript and XML), das wiederum auf dem XMLHttpRequest-Objekt be-ruht. Ziel vieler AJAX-Anwendungen ist es, das starre Architekturmus-ter des Request-Response von HTTP zu überwinden, bei dem Anfra-gen nur vom Client ausgehen und der Server nur reagieren kann. Ha-ben sich jedoch zentrale Daten auf dem Server aktualisiert, so kann derServer die Clients nicht darüber informieren. Bei einer Internetauktionbeispielsweise würde ein Bieter nicht erfahren, wenn ein neues Geboteines anderen vorläge, wenn er nicht selber immer wieder nachfragt.Ebenso würde bei einem Chatserver beispielsweise ein angemeldeterUser nicht erfahren, wenn eine neue Nachricht eines Anderen einge-troffen wäre. Zwei Verfahren, den Client mit Hilfe eines asynchronenXMLHttpRequest-Objekts automatisiert von einer Datenaktualisierungin Kenntnis zu setzen, sind das Polling und das Long Polling, siehe Ab-bildung 1.7. Beim Polling wird in einem regelmäßigen Zeitabstand ∆teine Anfrage an den Server gestellt, auf die er unverzüglich antwortet.Beim Long Polling dagegen stellt der Client eine asynchrone Anfrage,auf die der Server jedoch erst nach einer Aktualisierung seiner Datenantwortet. Empfängt der Client eine Antwort, stellt er sofort eine neueAnfrage, auf die er wiederum eine Antwort erst nach erfolgter Daten-aktulisierung auf dem Server erhält.Das Polling ist ein in JavaScript clientseitig relativ einfach zu implemen-tierendes Verfahren, siehe Listing 4. Allerdings hat es den großen Nach-teil, dass eine große Anzahl unnützer Anfragen gestellt werden, wenndie Anfragefrequenz höher als die typische Änderungsfrequenz der Da-

37

Page 38: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

Abb. 1.7: Polling und Long Polling als Methoden zur Synchronisation eines zentralenDatenbestandes. Vgl. [6, S. 27f].

ten ist. Vor allem Server mit sehr vielen Usern können dadurch unnötigbelastet werden. Das Long-Polling dagegen lastet den Server optimalaus, da er nur noch zu den notwendigen Zeitpunkten an die betroffe-nen Clients Nachrichten sendet.

Listing 4: Polling durch Rekursion

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <script>

6 var periode = 2000; // Polling-Periode in ms

7 var data;

8 var request = new XMLHttpRequest();

9

10 request.onreadystatechange = function() { // Event Handler

11 if (request.readyState === 4) {

12 document.getElementById("ausgabe").innerHTML = request.

response;

13 }

14 }

15

16 var poll = function(x) {

17 if (x > 5) return; // Basisfall: beende Rekursion

18 request.open("POST", "http://haegar.fh-swf.de/AJAX/spiegel.

php");

19 data = new FormData();

20 data.append("x", x); // x-Werte

21 data.append("y", x*x); // y-Werte

38

Page 39: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.11 Web Workers: Nebenläufigkeit in JavaScript

22 request.send(data);

23 setTimeout("poll("+(x+1)+")", periode); // Rekursionsaufruf

24 }

25

26 poll(0); // Start der Rekursion

27 </script>

28 </head>

29

30 <body>

31 <div id="ausgabe"></div>

32 <p>(<i>y</i> = <i>x</i><sup>2</sup>)</p>

33 </body>

34 </html>

1.11 Web Workers: Nebenläufigkeit in JavaScript

Im Gegensatz zu Java oder C++ bietet JavaScript keine Möglichkeit,einzelne Threads zu programmieren, ein JavaScript-Programm wirdgrundsätzlich in nur einem einzigen Thread ausgeführt [7]. Bei rechen-intensiven Algorithmen bewirkt diese Eigenart, dass das Programm so-lange blockiert und keine weiteren Anweisungen ausführt oder auf Be-nutzereingaben reagiert, bis die Berechnungen beendet sind.Allerdings bietet JavaScript zur nebenläufigen Programmierung dasKonzept der Workers oder Web Workers an.26 Ein Worker in JavaScriptist ein Standardobjekt, das als Teilprozess im Hintergrund läuft, alsonachrangig zum Hauptprozess des eigentlichen JavaScript-Programms,und isoliert für sich ausgeführt wird, insbesondere unabhängig vonweiteren Benutzereingaben. Interaktionen sind ausschließlich mit demHauptprozess über die Methoden postMessage und terminate sowie denEvent-Handler onmessage möglich. Um ein Worker-Objekt zu erzeugen,muss Quelltext des Workerprogramms in einer externen JavaScript-Datei ausgelagert vorliegen. Dies sei beispielsweise worker.js; dannwird im Hauptdokument das Worker-Objekt wie folgt erzeugt:

var worker = new Worker("worker.js");

Die Kommunikation zwischen dem Hauptprozess und dem Workerpro-zess verläuft nun über den Austausch von Nachrichten. Wie in Abbil-

Abb. 1.8: Kommunikation zwischen Hauptprozess und Worker.

dung 1.8 dargestellt reagiert der Event-Handler des einen Prozesses

26 http://dev.w3.org/html5/workers/http://dev.w3.org/html5/workers/, https:

//developer.mozilla.org/en-US/docs/DOM/Worker [2016-07-17]

39

Page 40: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

stets auf die von postMessage gesendeten Nachricht des jeweils anderenProzesses. Ein einfaches Beispiel ist das folgende HTML-Dokument, daseinen bidirektionalen Nachrichtenaustausch bewirkt:

1 <!DOCTYPE HTML>

2 <html>

3 <head><meta charset="UTF-8"/><title>Worker example: Send

Messages</title></head>

4 <body>

5 <p>

6 <script>

7 var worker = new Worker("worker.js");

8 worker.onmessage = function (event) {

9 document.getElementById("result").innerHTML = event.data;

10 };

11 </script>

12 <input type="text" id="message" value="Hallo Welt!"/>

13 <input type="button" value="Send"

14 onclick="worker.postMessage(document.getElementById(’

message’).value);"/>

15 </p>

16 <p>Message: <output id="result"></output></p>

17 </body>

18 </html>

Die zugehörige Worker-Datei lautet:

1 var count = 0;

2 self.onmessage = function (event) {

3 count++;

4 self.postMessage(event.data + " (No " + count + ")");

5 };

1.12 DOM Storage

DOM Storage, oder Web Storage nach W3C,27 ist eine Web-Technik, mitder über einen Browser Daten von mehreren MB Größe auf einem Rech-ner gespeichert werden können. DOM Storage ermöglicht damit einepersistente Datenspeicherung ähnlich wie ein Cookie, allerdings mitder entscheidenden Einschränkung, dass Datenzugriffe nicht über dasHTTP-Protokoll geschehen, sondern vollständig vom Browser gesteu-ert und durch clientseitige Skripte (in der Regel JavaScript) durchge-führt werden.DOM Storage speichert Daten in einem assoziativen Array, in dem dieSchlüssel und Werte Strings sind. Sie können also in JavaScript einfach

27 Die Namensgebung ist einigermaßen kompliziert, nach W3C heißt es Web Storage,aber auch DOM Storage ist möglich, allerdings setzt es nicht die Existenz eines tatsäch-lichen Dokument-Objekts voraus http://dev.w3.org/html5/webstorage/#terminology.

40

Page 41: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.12 DOM Storage

mit JSON.parse als Objekt erzeugt und mit JSON.stringify in DOM Sto-rage gespeichert werden.

1.12.1 Lokale und sessionspezifische Speicherung

Daten, die lokal gespeichert werden, die sogenannten Local Shared Ob-jects (LSO), sind mit einer Domain verknüpft und bleiben auch nachBeenden des Browsers bestehen. Alle Skripte einer Domain, von deraus die Daten gespeichert wurden, können auf die Daten zugreifen. BeiMozilla Firefox werden die Daten in der Datenbankdatei webappssto-re.sqlite gespeichert.Session-spezifisch gespeicherte Daten sind mit dem erzeugendenBrowser-Fenster verknüpft und auf dieses beschränkt. GespeicherteDaten werden beim Schließen des Browser-Fensters gelöscht. DieseTechnik bietet die Möglichkeit, mehrere Instanzen derselben Anwen-dung in verschiedenen Fenstern laufen zu lassen, ohne dass es zu einergegenseitigen Beeinflussung kommt, was von Cookies nicht unterstütztwird.In JavaScript werden beide Speicherarten durch die StandardobjektelocalStorage und sessionStorage realisiert und bieten die MethodensetItem und getItem zum Speichern und Lesen der Daten:

// Speichert ein Key-Value-Paar im localStorage

localStorage.setItem(’schluessel’, ’wert’);

// Liest den eben gespeicherten Wert aus und zeigt ihn an

alert(localStorage.getItem(’schluessel’)); // => wert

// Speichert ein Key-Value-Paar im sessionStorage

sessionStorage.setItem(’key’, ’value’);

// Liest den eben gespeicherten Wert aus und zeigt ihn an

alert(sessionStorage.getItem(’key’)); // => value

Für weitere Informationen zu DOM Storage mit JavaScript siehe http:

//www.jstorage.info/

41

Page 42: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

1.13 Übungsaufgaben

1.13.1 Grundlagen JavaScript

Aufgabe 1.1 (Ein- und Ausgabe in JavaScript) (a) Erstellen Sie ein Pro-gramm in JavaScript, das einen Euro-Betrag in Dollar zu einem einzu-gebenden Kurs umrechnet.

Die Umrechnung soll dabei nach Drücken des = -Buttons geschehen.

(b) Modifizieren Sie Ihr Programm so, dass die Ein- und Aus-gabe mit Dezimalkommas möglich ist. Finden Sie die dazunötigen Funktionen mit Hilfe der Objektreferenz auf http:

//de.selfhtml.org/javascript/objekte/, heraus, dort unter einempassenden der vordefinierten Objekte.

Aufgabe 1.2 (Eingabe und Ereignisbehandlung) Progammieren Sie eineWebseite zur Datenerfassung für den Browser, in dem für ein Unter-nehmen die Eigenkapitalquote und die Fremdkapitalquote einzugebenist:

Geben Sie die folgenden Daten Ihres Unternehmens ein:

Eigenkapitalquote: %

Fremdkapitalquote: %

Dabei soll nach jedem Tastendruck in einem der Eingabefelder der Dif-ferenzwert zu 100 im jeweiligen anderen Eingabefeld erscheinen. D.h.tippt man in das untere Feld 4 ein, so soll sofort 96 im oberen erschei-nen, und umgekehrt.

Hinweise: (i) Den notwendigen Ereignisbehandler finden Sie z.B. unterhttps://wiki.selfhtml.org/wiki/JavaScript/Event-Handler. (ii) So wieSie in JavaSript aus einem Eingabefeld lesen können, können Sie auchetwas hineinschreiben, d.h. das geeignete Attribut verändern!

Aufgabe 1.3 (Funktionale Programmierung) Nach der Regel von Weddle,auch Newton-Cotes-Formel vom Grad n = 6 genannt, wird das IntegralIf (a, b) =

∫ ba f (x) dx einer integrierbaren Funktion f : [a, b] → R mit a,

b ∈ R durch

If (a, b) ≈ b – a840

(41f (a) + 216f

(5a+b

6

)+ 27f

(4a+2b

6

)+ 272f

(3a+3b

6

)+ 27f

(2a+4b

6

)+ 216f

(a+5b

6

)+ 41f (b)

)

42

Page 43: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.13 Übungsaufgaben

angenähert. Programmieren Sie diese Formel in JavaScript als eineFunktion, die neben den Zahlen a und b die Funktion f als Parametererwartet. Wenden Sie damit die Näherungsformel auf die Integrale

∫ 10

07x6 – 8x3 + 2x – 1 dx,

∫ 1

0sin x dx und

∫ 10

0sin x dx

und vergleichen Sie die Ergebnisse mit den analytisch berechnetenWerten. Die ersten beiden Integrale sollten dabei recht genau angenä-hert werden, das dritte dagegen hat einen Fehler von fast 20% des tat-sächlichen Wertes. Haben Sie eine Erklärung dafür?

Aufgabe 1.4 (Funktionsauswertung mit map) Erstellen Sie in JavaScripteine Funktion map(f,a), die eine Funktion f und ein Array a von Zahlenals Parameter erwartet und ein Array zurück gibt, das aus den Funkti-onswerten f(a[i]) der Werte von a besteht. Beispielsweise soll für dieFunktion f (x) = x3 gelten:

map (x3, [1, 2, 3, 4]) = [1, 8, 27, 64]

1.13.2 JavaScript, DOM und AJAX

Aufgabe 1.5 (DOMund Ereignisbehandlung in JavaScript) (a) Erstellen Sieein JavaScript-Programm, das zwei Buttons Grün und Rot anzeigt,die beim Anklicken entsprechend die Schriftfarbe in einem <p>-Elementändert. Dabei soll zum Verändern der Farbe nur eine Funktion verwen-det werden.

a) b)

(b) Schreiben Sie ein JavaScript Programm, das durch das Anklickendes Buttons Stern erzeugen einen neuen Stern unter dem Button ein-fügt, indem ein neues <img>-Element erzeugt wird. Entsprechend sollbeim Anklicken der Schaltfläche Stern löschen der letzte Stern ge-löscht werden. Die Bilddatei für den Stern finden Sie auf dem Hägar-Server.

Aufgabe 1.6 (Laden von JSON-Elementen mit AJAX) In dem Verzeich-nis http://haegar.fh-swf.de/Webtechnologie/Aufgaben/Woche_1-15/ be-finden sich der Quelltext einer HTML-Seite und mehrere JSON-Dateienmit Informationen zu verschiedenen Städten. Die HTML-Seite liefertdas Gerüst, mit dem die Städteinformationen HTML5-konform ange-zeigt werden sollen. (Insbesondere sollte sie auch auf mobilen Endge-räten ansprechend dargestellt werden, testen Sie es!)

43

Page 44: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1 JavaScript

Erweitern Sie den Quelltext um JavaScript-Anweisungen, so dass beimAnklicken der Buttons die jeweilige JSON-Datei geladen wird und de-ren Informationen in den Elementen titel und inhalt angezeigt wer-den. Zum Beispiel soll nach dem Laden der Datei Istanbul.json mit denDaten

{

"name": "Istanbul",

"state": "Turkey",

"capital": false,

"residents": "14 million",

"remark": "Istanbul is the most populous city of Turkey and

of Europe."

}

der folgende Text erscheinen:

Istanbul

Istanbul is a city in Turkey with a metropolitan area of14 million residents. Istanbul is the most populous cityof Turkey and of Europe.

Aufgabe 1.7 (Google Visualization API) (a) Erstellen Sie mit Hilfe der Goo-gle Visualization API und der Dokumentation

https://developers.google.com/chart/interactive/docs/gallery

eine Webseite mit den folgenden drei Diagrammen,

44

Page 45: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

1.13 Übungsaufgaben

die die Studierendenzahlen der FH in 2012 wiedergeben:

Standort Erstsemester StudierendeHagen 790 1689Iserlohn 859 1640Meschede 504 1127Soest 803 2007

Erstellen Sie dabei zunächst jedes der Diagramme in einer eigenen Da-tei, bevor Sie sie auf eine gemeinsame Seite zusammenfassen.

(b) Erstellen Sie mit Hilfe der Google Visualization API die folgendenFunktionsgraphen im Browserfenster:

45

Page 46: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2 jQuery

2 jQuery

JavaScript spielt in der professionellen Webprogrammierung eineganz zentrale Rolle, insbesondere aufgrund seiner Fähigkeiten, DOM-Manipulationen und asynchrone HTTP-Requests dynamisch auszulö-sen. Da allerdings die dazu notwendigen Anweisungen in JavaScriptrecht aufwendig sind — mit Funktionen wie getElementById zur DOM-Manipulation oder dem im wesentlichen immer gleichen Dreisch-ritt zur Implementierung eines asynchronen HTTP-Requests — wur-den immer wieder spezielle JavaScript-Bibliotheken entwickelt, umdie Programmierung zu vereinfachen. Eine der wichtigsten und ver-breitesten dieser Bibliotheken ist jQuery, das zu einem De-Facto-Standard der Webprogrammierung geworden ist: Nach W3Techs (http://w3techs.com/) wird jQuery auf fast 70 % aller Webauftritte eingesetzt.

2.1 Entstehungsgeschichte, Lizenz, Dokumentation

jQuery wurde 2006 von John Resig veröffentlicht und ist seit April 2013in der Version 2 verfügbar. Da diese Version nur noch mit modernenBrowserversionen kompatibel ist (also insbesondere nicht mit dem In-ternet Explorer bis einschließlich Version 8), wird die Version 1 par-allel weitergeführt. jQuery ist als freie Software unter der MIT-Lizenz(https://tldrlegal.com/license/mit-license) verfügbar, darf also auchfür kommerzielle Zwecke verwendet werden, wobei jede Kopie ihr Co-pyright beinhalten muss.Die API-Dokumentation von jQuery ist unter

http://api.jquery.com/

verfügbar, ein sehr gutes Tutorial unter http:

//www.w3schools.com/jquery/.

2.2 Einbindung der Bibliothek

Da jQuery eine JavaScript-Bibliothek ist, benötigt man zur dessen Ver-wendung keine besondere Installation, sondern bindet es per Hyper-link in das HTML-Dokument ein. Die aktuellste Variante findet man un-ter

http://code.jquery.com/

Dort ist jede Version in einer „unkomprimierten“ und einer „minifizier-ten“ Fassung verfügbar. Die erste ist kommentiert und formatiert undsomit gut lesbar, die andere ist unformatiert und ohne Kommentare,aber mit deutlich weniger Speicherbedarf. Die minifizierte Fassung eig-net sich also zur reinen Nutzung besser aals die unkomprimierte. Mankann nun die gewünschte Version der Bibliothek einfach auf den eige-nen Server herunterladen und sie dann per Link einbinden, man kann

46

Page 47: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2.3 Syntax

aber auch die Originalbibliothek einfach verlinken. Die minifizierte Ver-sion 2.2.0 beispielsweise kann man im Head des HTML-Dokuments mit

<script src="http://code.jquery.com/jquery-2.2.0.min.js"></

script>

einbinden.

2.3 Syntax

Basis einer jQuery-Anweisung ist der Aufruf der Funktion $, oder syn-onym jQuery, mit einem Selektor und einer Aktion:

$(Selektor).Aktion(...); oder synonymjQuery(Selektor).Aktion(...);

(Gebräuchlicher ist die Verwendung von $.) Der Selektor ist hierbei einCSS-Selektor zur Auswahl eines oder mehrerer HTML-Elemente, die Ak-tion ist eine auszuführende Funktion aus der jQuery-Bibliothek. Fürden Selektor gibt es im Wesentlichen vier Varianten, beispielhaft mitder Aktion hide() aufgelistet, die die ausgewählten HTML-Elemente perCSS verstecken lässt:

$("#test").hide() versteckt alle HTML-Elemente mit der ID "test".$(".test").hide() versteckt alle HTML-Elemente der Klasse "test".$("p").hide() versteckt alle <p>-Elemente.$(this).hide() versteckt das aktuelle Element (funktioniert normaler-

weise nur innerhalb eines selektierten Elements);

Diese Anweisungen müssen in eine anonyme Funktion (auch „Callback-Funktion“ oder „Lambda-Ausdruck“) eingepackt werden:

$(function(){

...

}

oder äquivalent$(document).ready(function(){

...

}

und sollten im <head> des HTML-Dokuments programmiert (bzw. alsexterne JS-Datei dort eingelesen) werden. Auf diese Weise wird garan-tiert, dass das gesamte Dokument vollständig geladen ist, bevor jQuery-Code ausgeführt wird.Neben diesen „Selektor-Aktion“-Anweisungen kann man in jQuery auchdirekt vordefinierte Nutzfunktionen durch

$.Nutzfunktion(...); oder synonymjQuery.Nutzfunktion(...);

aufrufen. In der API-Dokumention (http://api.jquery.com/) sind dievorhandenen Nutzfunktionen mit

jQuery.Nutzfunktion (...)

47

Page 48: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2 jQuery

aufgeführt. Die auf selektierte Elemente möglichen Aktionen sind da-gegen einfach mit

.Aktion (...)

beschrieben.

2.4 DOM-Manipulation mit jQuery

Als erstes Programmbeispiel mit jQuery betrachten wir eine Versiondes Programms aus Kapitel 16 (Listing 16.2), das nach Klicken derSchaltfläche ein neues <li>-Element an die geordnete Liste <ol> hängt:

Listing 5: DOM Manipulation mit jQuery

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <script src="http://code.jquery.com/jquery-2.2.0.min.js"></

script>

6 <script>

7 $(function() {

8 $("button").click(function(){ // Event-Handler für alle

Buttons

9 if ($(this).val() === "hinzufuegen") {

10 $("#liste")

11 .append($("<li>Die Zeichen an der Wand</li>"));

12 } else if ($(this).val() === "loeschen") {

13 $("#liste")

14 .children()

15 .last()

16 .remove();

17 }

18 });

19 });

20 </script>

21 </head>

22 <body>

23 <button value="hinzufuegen">Neuer Text</button>

24 <button value="loeschen">Löschen</button>

25 <ol id="liste"></ol>

26 </body>

27 </html>

Ein direkter Vergleich der jQuery-Anweisungen mit einem äquivalen-ten Programm in „reinen“ JavaScript zeigt die Philosophie und die funk-tional orientierte Sicht von jQuery. Das jQuery Programm

48

Page 49: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2.4 DOM-Manipulation mit jQuery

$(function() {

$("button").click(function(){ // Event-Handler für alle

Buttons

console.log("$(this).val(): " + $(this).val());

if ($(this).val() === "hinzufuegen") {

$("#liste")

.append($("<li>Die Zeichen an der Wand</li>"));

} else if ($(this).val() === "loeschen") {

$("#liste")

.children()

.last()

.remove();

}

});

});

würde in JavaScript (fast) äquivalent wie folgt lauten:

var modifizieren = function(aktion) {

var wurzel = document.getElementById(’liste’);

if (aktion === "hinzufuegen") {

var neu = document.createElement(’li’);

wurzel.appendChild(neu);

var neuerText = document.createTextNode("Die Zeichen an

der Wand.");

neu.appendChild(neuerText);

} else if (aktion === "loeschen") {

if (wurzel.hasChildNodes()) {

wurzel.removeChild(wurzel.lastChild);

}

}

};

mit den Ereignisbehandlern

<button onclick="modifizieren(’hinzufuegen’);">Neuer Text</

button>

<button onclick="modifizieren(’loeschen’);">Löschen</button>

Im jQuery-Quelltext wird die objektorientierte API des DOM derartgekapselt, dass sie eine „fluente“ („fließende“) Programmierung hin-tereinandergeschalteter Funktionen erlaubt, wie in Zeile 15 bis 17 inListing 5. Außerdem brauchen die Ereignisbehandler nicht mehr imHTML-Quelltext in den betreffenden Elementen implementiert zu wer-den, sondern über die Selektoren ausschließlich in JavaScript. Damit isteine saubere Trennung zwischen der Ablaufdynamik und den HTML-Inhalten möglich.

49

Page 50: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2 jQuery

2.5 CSS-Formatierungen

Etwas einfacher und auch durchweg gebräuchlicher als direkte DOM-Manipulationen, wie im vorigen Abschhnitt besprochen, sind dyna-mische Veränderungen von Formatierungen über CSS. Hier stehen injQuery mit hide, show und toggle (umschalten) drei wirkmächtige Funk-tionen zur Verfügung, die hier stellvertretend für dynamische Effek-te aufgelistet seien. Die Funktionen modifizieren dabei gar nicht dieStruktur des DOM, sondern ändern lediglich die style-Attribute derHTML-Elemente. Als Beispiel sei das folgende jQuery-Programm gelis-tet, das durch Klicken der Schaltfläche „Umschalten“ bewirkt, dass alleAbätze des HTML-Dokuments angezeigt werden oder nicht:

Listing 6: Zeigen und Verbergen von HTML-Elementen mit jQuery

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <script src="http://code.jquery.com/jquery-2.2.0.min.js"></

script>

6 <script>

7 $(function() {

8 $("button").click(function(){

9 $("p").toggle();

10 });

11 });

12 </script>

13 </head>

14 <body>

15 <button>Umschalten</button>

16 <p>Dies ist ein erster Absatz.</p>

17 <p>Dies ist ein anderer kleiner Absatz.</p>

18 </body>

19 </html>

Untersucht man die HTML-Elemente mit den Entwicklertools desBrowsers, so erkennt man, dass lediglich das style-Attribut aller <p>-Elemente verändert wird, entweder von <p style="display: block;"

(sichtbar) auf <p style="display: none;" (unsichtbar), oder umge-kehrt.Mit jQuery stehen aber auch Funktionen für Effekte mit CSS zur Ver-fügung, die lange und komplexe JavaScript-Anweisungen bündeln. Imfolgenden Beispielprogramm wird ein angeklickter Listeneintrag zu-nächst rot gefärbt und verblasst dann langsam, bevor er nach 3 Sekun-den (scheinbar) verschwindet.

Listing 7: Animationsartiger CSS-Effekt mit jQuery

50

Page 51: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2.6 AJAX mit jQuery

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <script src="http://code.jquery.com/jquery-2.2.0.min.js"></

script>

6 <script>

7 $(function() {

8 $("li").click(function() {

9 $(this).css("color", "red").fadeOut(3000);

10 });

11 });

12 </script>

13 </head>

14 <body>

15 <ul>

16 <li>Clyde</li>

17 <li>Fred</li>

18 <li>Bonny</li>

19 </ul>

20 </body>

21 </html>

Lassen Sie das Programm ablaufen und beobachten Sie dabei imEntwicklertool des Firefox („Inspector“) oder des Chrome Browsers(„Elements“) die sich dynamisch verändernden Einstellungen der CSS-Anweisungen!

2.6 AJAX mit jQuery

Die einfachste Möglichkeit zur Implementierung von AJAX-Ereignissenist über die Nutzfunktion $.ajax (bzw. jQuery.ajax). Es gibt zwei Ver-sionen (siehe http://api.jquery.com/jQuery.ajax/), die gebräuchliche-re erwartet als Arguent ein JSON-Objekt setting mit den Einstellungender asynchronen HTML-Anfrage:

• type: Die Methode der HTML-Anfrage, also "GET" oder "POST"

• url: Der URL der HTML-Anfrage

• data: Die zu übermittelnden Daten der HTML-Anfrage,

• success: Der Ereignisbehandler bei Erfolg der HTML-Anfrage.

Beispielhaft sei hier ein einfacher asynchroner Aufruf des Spiegel-skripts auf Hägar beschrieben:

Listing 8: AJAX mit jQuery

1 <!DOCTYPE html>

51

Page 52: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2 jQuery

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <script src="http://code.jquery.com/jquery-2.2.0.min.js"></

script>

6 <script>

7 $.ajax({

8 type: "POST",

9 url: "http://haegar.fh-swf.de/AJAX/spiegel.php",

10 data: "y=x^2-1&x=1",

11 success: function(response){

12 $("#ausgabe").html("<h2>Serverantwort</h2>" + response);

13 }

14 });

15 </script>

16 </head>

17 <body>

18 <p id="ausgabe"></p>

19 </body>

20 </html>

Während also mit jQuery ein einziger Funktionsaufruf zur Erzeugungder asynchronen HTTP-Anfrage genügt,

$.ajax({

type: "POST",

url: "http://haegar.fh-swf.de/AJAX/spiegel.php",

data: "y=x^2-1&x=1",

success: function(response){

$("#ausgabe").html("<h2>Serverantwort</h2>" + response);

}

});

muss man in JavaScript für denselben Zweck 7 Anweisungen program-mieren:

var request = new XMLHttpRequest();

request.onreadystatechange = function() { // Event Handler

if (request.readyState === 4 && request.status === 200) {

document.getElementById("ausgabe").innerHTML =

"<h2>Serverantwort</h2>" + request.response;

}

};

request.open("POST", "http://haegar.fh-swf.de/AJAX/spiegel.php"

);

var data = new FormData();

data.append("y","x^2 - 1");

data.append("x",1);

request.send(data);

52

Page 53: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2.7 jQuery Mobile

Zu beachten ist dabei, dass in jQuery die AJAX-Anweisungen aufgrundder verzögerten Ausführung im <head> des Dokuments programmiertwerden können, während die reinen JavaScript-Anweisungen nach dem<p>-Element geschrieben werden sollten, also wenn es zum Ausfüh-rungszeitpunkt bekannt ist, oder als Funktionsaufruf des Ereignisbe-handlers onload im <body>-Element.Eine genauere Beschreibung der für die Funktion $.ajax möglichen Pa-rameter sind in der API-Dokumentation unter

http://api.jquery.com/jquery.ajax/

beschrieben. Die wichtigsten Parameter sind bereits in obigem Listing 8aufgeführt. Bemerkenswert ist außerdem der Parameter dataType, derals Standard per Intelligent Guess eines der Formate xml, json, script(für JavaScript-Quelltext) oder html auswählt.

2.7 jQuery Mobile

jQuery Mobile ist eine für Wischgesten optimierte JavaScript-Bibliothek, die auf jQuery und auf eine spezifische CSS-Bibliothekaufbaut. Sie ist kompatibel mit den gängigen Smartphones und Ta-blets. Sie erlaubt es durch gekapseltes JavaScript, vorwiegend mitHTML-Elementen und geeigneten Attributen dynamische Apps zuprogrammieren. Als ein einführendes Beispiel sei die folgende App, diezwei miteinander verlinkte Seiten mit einfachen Effekten darstellt:

Listing 9: Eine zweiseitige App für mobile Endgeräte

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="utf-8"/>

5 <title>jQuery Mobile Example</title>

6 <!-- Include meta tag to ensure proper rendering and touch zooming: -->

7 <meta name="viewport" content="width=device-width, initial-scale=1">

8 <!-- Include jQuery Mobile stylesheets: -->

9 <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.

min.css"/>

10 <!-- Include the jQuery library: -->

11 <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>

12 <!-- Include the jQuery Mobile library: -->

13 <script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>

14 </head>

15 <body>

16 <div data-role="page" id="pageone">

17 <div data-role="header">

18 <h1>Welcome To My Homepage</h1>

19 </div>

20

21 <div data-role="main" class="ui-content">

22 <h1>Welcome!</h1>

23 <p>I am glad to be a mobile app developer.</p>

24 <p>If you click on the link below, it will take you to Page Two.</p>

25 <a href="#pagetwo">Go to Page Two</a>

26 </div>

27

28 <div data-role="footer">

53

Page 54: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2 jQuery

29 <h1>Footer Text</h1>

30 </div>

31 </div>

32

33 <div data-role="page" id="pagetwo">

34 <div data-role="header">

35 <h1>Welcome To My Homepage</h1>

36 </div>

37

38 <div data-role="main" class="ui-content">

39 <p>Now you are on Page Two.</p>

40

41 <div data-role="collapsible" data-collapsed="true">

42 <h1>Click me - I am collapsible!</h1>

43 <p>I am not expanded by default.</p>

44 </div>

45

46 <p>If you click on the link below, it will take you to Page Two.</p>

47 <a href="#pageone">Go to Page One</a>

48 </div>

49

50 <div data-role="footer">

51 <h1>Footer Text</h1>

52 </div>

53 </div>

54 </body>

55 </html>

Die App ist verfügbar unter

http://haegar.fh-swf.de/Webtechnologie/jQuery-mobile.html

Testen Sie sie mit Ihrem mobilen Endgerät oder mit den Entwickler-tools des Google Chrome!Im <head> des Dokuments werden die notwendigen CSS- und Java-Script-Bibliotheken geladen, bevor mit <div>-Elementen über das At-tribut data-role die Struktur einer Seite festgelegt wird:

<div data-role="page" id="pageone">

<div data-role="header">

...

</div>

<div data-role="main" class="ui-content">

...

</div>

<div data-role="footer">

...

</div>

</div>

Jedes <div>-Element mit der data-role="page" sollte dabei eine eigeneID bekommen. Die Rollen von "header", "main" und "footer" sind (hof-fentlich) selbsterklärend und können bei Betrachtung der App nötigen-falls erschlossen werden.Weitere Informationen: Die Dokumentation zur API befindet sich unter

54

Page 55: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2.7 jQuery Mobile

http://api.jquerymobile.com/,

ein gutes Tutorial unter http://www.w3schools.com/jquerymobile/.

55

Page 56: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2 jQuery

2.8 Übungsaufgaben

Aufgabe 2.1 (CSS-Selektoren) (a) Verändern Sie mit jQuery die CSS-Einstellungen, so dass die Hintergrundfarbe aller <tr>-Elemente hell-blau erscheinen.

(b) Modifizieren Sie das Dokument, so dass nur noch jede zweite Zeilemit der Hintergrundfarbe erscheint.

(Hinweis: http://www.w3schools.com/jquery/jquery_selectors.asp.)

Aufgabe 2.2 (Animationseffekte) Programmieren Sie folgende mit jQue-ry folgende Animationseffekte:

Aufgabe 2.3 (Suchbegriffvervollständigung) (a) Programmieren Sie eineSuchanfrage, die mittels der autocomplete-Funktion aus einer vordefi-nierten Liste von Programmiersprachen nach jedem Tastendruck die-jenigen Begriffe anzeigt, die mit den bisher im Suchfeld eingegebenenBuchstaben übereinstimmen. Verwenden Sie dazu die bereitgestelltenFrameworks neben der Standardbibliothek von jQuery:

http://code.jquery.com/ui/1.11.4/jquery-ui.js,http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css

(letztere ist kein JavaScript!) und beachten Sie die Hinweise unter http://api.jqueryui.com/autocomplete/.

(b) Modifizieren Sie Ihr Programm, so dass die gefilterten Suchbegrif-fe dynamisch aus einer Datenbank selektiert und im Suchfeld anzeigtwerden.

Aufgabe 2.4 (AJAX mit jQuery) (Vgl. Aufgabe 1.6.) In dem Verzeich-nis http://haegar.fh-swf.de/Webtechnologie/Aufgaben/Woche_1-15/ be-finden sich der Quelltext einer HTML-Seite und mehrere JSON-Dateienmit Informationen zu verschiedenen Städten. Die HTML-Seite liefertdas Gerüst, mit dem die Städteinformationen HTML5-konform ange-zeigt werden sollen. (Insbesondere sollte sie auch auf mobilen Endge-räten ansprechend dargestellt werden, testen Sie es!)

56

Page 57: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

2.8 Übungsaufgaben

Laden Sie die Dateien in ein Unterverzeichnis Ihres Webservers und er-weitern Sie den Quelltext der HTML-Datei um jQuery-Anweisungen, sodass beim Anklicken der Buttons die jeweilige JSON-Datei geladen wirdund deren Informationen in den Elementen titel und inhalt angezeigtwerden. Zum Beispiel soll nach dem Laden der Datei Istanbul.json mitden Daten

{

"name": "Istanbul",

"state": "Turkey",

"capital": false,

"residents": "14 million",

"remark": "Istanbul is the most populous city of Turkey and

of Europe."

}

der folgende Text erscheinen:

Istanbul

Istanbul is a city in Turkey with a metropolitan area of14 million residents. Istanbul is the most populous cityof Turkey and of Europe.

Beachten Sie, dass standardmäßig jQuery als empfangenen Datentypper „Intelligent Guess“ in JavaScript umformt.

57

Page 58: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3 AngularJS

3 AngularJS

AngularJS ist eine clientseitige JavaScript-Bibliothek zur Erstellung vonEinzelseiten-Webanwendungen nach dem Entwurfsmuster Model ViewViewModel (MVVM). AngularJS wird seit 2009 von Google als quellof-fenes Projekt entwickelt. Wichtigste Eigenschaften von AngularJS sinddie Zwei-Wege-Datenbindung zum Abgleich von Darstellung und Daten,und Dependency Injection zur Auflösung von Abhängigkeiten zwischenverschiedenen Komponenten. Sie stellen jede für sich sehr moderneKonzepte der Programmierung und des Software Engineering dar undwerden daher in einem ersten Abschnitt kurz theoretisch behandelt.AngularJS ist flexibel erweiterbar durch sogenannte Services zur Erstel-lung eigener Routinen und Algorithmen und durch Direktiven zur Er-stellung wiederverwendbarer HTML-Elemente.

3.1 Grundlegende Konzepte

3.1.1 Einzelseiten-Webanwendungen

Eine Einzelseiten- oder Single-Page-Webanwendung (englisch Single-page Web Application, SPA) ist eine Webanwendung, die aus einem ein-zigen HTML-Dokument besteht und deren Inhalte dynamisch nach-geladen werden. Diese Art von Web-Architektur steht im Gegen-satz zu klassischen Webanwendungen, welche aus mehreren, unter-einander verlinkten HTML-Dokumenten bestehen. Eine Einzelseiten-Webanwendung ermöglicht eine Reduzierung der Serverlast, gibt demAnwender das Gefühl einer klassischen Desktopanwendung und erlau-ben die Umsetzung von selbständigen Webclients, die auch temporäroffline verwendbar sind. Insbesondere aus letzterem Grund eignen siesich für den Einsatz in störanfälligen und oft unterbrochenen Verbin-dungen mobiler Endgeräte.Die Informationen dieses Kapitels basieren vor allem auf dem Buch [10]sowie auf der Website http://www.w3schools.com/angular/.

3.1.2 Model-View-ViewModel (MVVM)

Eines der wichtigsten Architekturmuster des Software Engineering istdas Model-View-Controller (MVC). Es zählt zu den Mustern der inter-aktiven Systeme, die allgemein Mensch-Maschine-Interaktion struktu-rieren. In den 1980er Jahren von Trygve Reenskaug für die Program-miersprache Smalltalk entwickelt, trennt es die Verantwortlichkeitenvon Datenhaltung (Model), Darstellung (View) und Ablauflogik (Con-troller) und lagert sie in separate Schichten aus. Siehe dazu Abbildung3.9 (rechts).In einer dynamischen Webanwendung kann die strikte Trennung vonAblauflogik (Controller) und Darstellung (View) allerdings nicht auf-

58

Page 59: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3.1 Grundlegende Konzepte

recht erhalten werden, da der Controller HTML-Code generieren muss,der grundsätzlich Teil der View-Komponente ist. Damit trägt aber amEnde der Server die Hauptlast der Webanwendung, worunter die In-teraktivität und das Antwortverhalten bei hoher Nutzung leiden kann,während der Browser vergleichsweise wenig zu tun hat. Er ist in die-sem Falle nur noch ein sogenannter Thin Client.Mit dem Muster Model-View-ViewModel (MVVM) wird der Controllerdurch eine Proxy-Schicht auf dem Client (!) ersetzt, die ViewModel ge-nannt wird. Dorthin werden lediglich diejenigen Daten geliefert, die tat-

Abb. 3.9: Das MVVM-Muster (links) für eine Webanwendung, im Vergleich dazu dasMVC-Muster (rechts). Da bei MVC die Hauptlast der Webanwendung auf dem Server läuft,ist der Browser in diesem Fall ein Thin Client. Bei MVVM dagegen hat er mit der Poxy-Schicht MVVM einen großen Teil der Arbeitslast und ist daher in diesem Fall ein Fat Cli-ent.

sächlich für die Anzeige gebraucht werden. Oft müssen die Daten auchauf bestimmte Art und Weise transformiert werden, bevor sie zur An-zeige kommen; auch hierfür ist das ViewModel zuständig. Außerdemdefiniert es die innerhalb der Anzeige benötigte Funktionalität: Dortmüsste beispielsweise ein Ereignisbehandler definiert werden, der aufeinen Button-Klick reagiert.So plausibel das MVVM-Muster auch auf den ersten Blick erscheint,wirft es sofort ein großes Problem auf: die Datenredundanz zwischenModel, ViewModel und View. Wie kann dieses Problem gelöst werden?Betrachten wir dazu im nächsten Abschnitt einen Ansatz, der sich alsgroßenteils erfolgreich realisierbar herausgestellt hat.

3.1.3 Datenbindung (data binding)

Aufgrund der engen Verzahnung von Model, ViewModel und Model unddadurch implizierten grundsätzlichen Datenredundanz ergibt sich so-fort das Problem der Synchronisation der Schichten. D.h. jede Daten-aktualisierung, sei sie im Model durch die Datenbank oder im Viewdurch eine Anwendereingabe, muss in den jeweils anderen Schichten

59

Page 60: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3 AngularJS

nachvollzogen werden. Ansonsten kann es sehr schnell zu Inkonsisten-zen der Daten kommen, beispielsweise weil mittlerweile ein Anwendereinen Dateninhalt geändert hat, den etwas später ein anderer verän-dern will: Hat zum Beispiel ein Anwender den letzten vorhanden Arti-kel im Bestand gekauft, so muss das ViewModel jedes anderen Anwen-ders sofort angepasst werden, sonst wird dieser Artikel möglicherwei-se mehrfach verkauft.Als ein Konzept zur Lösung dieses Synchronisationsproblems desMVVM-Musters hat sich die Datenbindung, vor allem die „Zwei-Wege-Datenbindung“, etabliert. Wir werden dieses gleich im nächstenProgrammierbeispiel betrachten. Die Zwei-Wege-Datenbindung ist imMVVM ein Mechanismus zur automatischen Synchronisation von View-modell und View bei Änderung von Daten, sei es durch den Nutzer inder View oder durch andere Nutzer oder Prozesse im mit dem Modelsynchronisierten Viewmodell.Normalerweise muss man eine solche Datenbindung zwischen denSchichten mühsam programmieren. Beispielsweise müssen für alle ein-gaberelevanten DOM-Elemente jeweils extra ein Ereignisbehandler re-gistriert werden, der die betroffenen Variablen des Models ändert. Ent-sprechend muss auch die Logik des umgekehrten Weges programmiertwerden, also die Aktualisierung der DOM-Elemente nach einer Ände-rung des Daten des Models. Auf diese Weise entsteht bereits für rela-tiv einfache Anwendungen jede Menge sogenannter „Boilerplate-Code“(etwa „Textbaustein-“ oder „Klebe-Code“), der die eigentliche Anwen-dungslogik verschmutzt.

3.1.4 Dependency Injection

Ein grundlegendes Problem komponentenbasierter Softwaresysteme,die wartbar, testbar und komponentenweise austauschbar sein sollen,ist die Auflösung von Abhängigkeiten der Komponenten untereinander.Eine einfache Abhängigkeit ist bereits gegeben, wenn eine Komponenteeine andere für ihren Ablauf benötigt. In einer objektorientierten Pro-grammiersprache beispielsweise wäre dies der Fall, wenn ein Objektzu seiner Erzeugung ein anderes verwendet. Durch solche Abhängig-keiten kann ganz schnell ein verschlungenes Netz von Abhängigkeitenentstehen, das eine Modifikation des Softwaresystems oder den Aus-tausch von Komponenten praktisch unmöglich macht.Im Software Engineering hat sich daher in den 2000er Jahren das aufMartin Fowler [4] zurück gehende Entwurfsmuster der Dependency In-jection (DI) etabliert. Ihr liegt das abstrakte Prinzip der Umkehrung desKontrollflusses (Inversion of Control (IoC)) zugrunde, also zum Beispieleine Umkehrung der Aufrufe von Funktionen oder der Ablaufsteuerungeines Programms. (Getreu dem Hollywood-Prinzip, “Don’t call us, we’llcall you!” [5]) Eine typische Realisierung dieses Prinzips sind beispiels-weise Event Handler, da sie Funktionen implementieren, deren Aufruf

60

Page 61: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3.1 Grundlegende Konzepte

nicht in der Anwendung selbst geschieht, sondern aus einer der Pro-gramme der API-Bibliothek erfolgt. Ermöglicht wird eine solche Um-kehrung des Kontrollflusses beispielsweise durch Interfaces, Plug-Insoder Callback-Funktionen. Ein anderes Beispiel für eine Kontrollfluss-umkehrung ist eine serverseitig programmierte Webanwendung, wieetwa mit PHP, da die Ausführungsverantwortung beim Server liegt [10,§2.1.3].

Das Entwurfsmuster der Dependency Injection oder der automatischenÜbergabe von Abhängigkeiten nun ist eine spezielle Form der Kontroll-flussumkehrung und besagt, dass eine Komponente ihre Abhängigkei-ten von anderen Komponenten nicht selbst erzeugt, sondern von einerzentralen Komponente des Systems, dem „Assembler“, übergeben be-kommt [4]. Dadurch können Abhängigkeiten zwischen Komponentenalso ausschließlich durch die zentrale Komponente erzeugt und damitzentral aufgelöst werden.

Listing 10: Einfache Implementierung einer Dependency Injection in Java

1 interface IAbhängiges {

2 public Abhängiges(Abhängigkeit abhängigkeit);

3 }

4

5 class Abhängiges implements IAbhängiges {

6 private Abhängigkeit abhängigkeit;

7

8 public Abhängiges(Abhängigkeit abhängigkeit) {

9 this.abhängigkeit = abhängigkeit;

10 }

11 }

12

13 class Injizierer {

14 void methode() {

15 Abhängigkeit abhängigkeit = ... ;

16 IAbhängiges abhängiges = new Abhängiges(abhängigkeit);

17 }

18 }

Mit der automatischen Übergabe von Abhängigkeiten weist ein Soft-waresystem eine lose Kopplung der Komponenten auf. Lose Kopplungführt dazu, dass Änderungen in einer Komponente nur dann Änderun-gen in einer anderen Komponente bedingen, wenn die Änderungen dieSchnittstelle betreffen. Lose Kopplung ist daher eine hinreichende Be-dingung für maximale Wartbarkeit und Testbarkeit eines Systems ge-gebener Komplexität.

61

Page 62: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3 AngularJS

3.2 Erste Beispiele: HTML wird (fast) eine Programmier-sprache

Genug der Theorie, wie kann man denn nun mit AngularJS programmie-ren? In diesem Abschnitt werden wir einführende Programmbeispie-le vorstellen, die die Datenbindung verwenden, aber auch ein Schlei-fenkonstrukt und eine (Art) Selektionsstruktur kennenlernen. Dadurchwird HTML scheinbar zu einer vollständigen Programmiersprache, inWirklichkeit ist es natürlich JavaScript, aber aufgerufen durch erwei-terte HTML-Attribute, die sogenannten Direktiven.Betrachten wir zunächst ein Programm mit AngularJS, das das Prinzipder Datenbindung (data binding) illustriert.

Listing 11: Beispiel einer Datenbindung in AngularJS

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="utf-8"/>

5 <script src="https://ajax.googleapis.com/ajax/libs/angularjs

/1.5.0/angular.min.js"></script>

6 </head>

7 <body>

8 <p>Gib einen Text ein:</p>

9

10 <div ng-app="">

11 <input type="text" ng-model="eingabe"/>

12 <p><tt>{{ eingabe }}</tt></p>

13 </div>

14

15 </body>

16 </html>

Zunächst sehen wir, dass die Bibliothek im <head> in Zeile 5 eingebun-den wird. Der Kern des Programms besteht aus den Zeilen 10 bis 13:

<div ng-app="">

<input type="text" ng-model="eingabe"/>

<p><tt>{{ eingabe }}</tt></p>

</div>

Mit der Direktive ng-app, also ein „künstliches“ HTML-Attribut, wirdeine Applikation in AngularJS initialisiert, hier ist es die als Standardvorhandene namenlose Applikation. Eine Applikation muss stets be-reits mit ihrem Namen definiert sein, um sie über diese Direktive da-mit aufrufen zu können. Mit der Direktive ng-model wird eine Variablein AngularJS festgelegt, hier ist es die Variable eingabe, die den Wert des<input>-Elements erhält. In dem Ausdruck (expression)

{{ eingabe }}

62

Page 63: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3.2 Erste Beispiele: HTML wird (fast) eine Programmiersprache

schließlich wird der aktuelle Wert der Variable ausgegeben. Hier ist eseingepackt in ein <p>- und ein tt-Element zur Ausgabe in Schreibma-schinenschrift.Was geschieht in diesem Programm? Gibt der Anwender in dem Einga-befeld einen Text ein, so wird nach jedem Tastendruck der aktualisierteWert der Variable angezeigt. Man hat also in dem HTML-Dokument zujedem Zeitpunkt in zwei verschiedenen Elementen denselben Wert ste-hen, es handelt sich um eine (hier noch einfache) Datenbindung.Die Datenbindung ist eine mächtige Technik und ermöglicht mit relativwenig Quelltext bemerkenswerte Effekte. So wird im nächsten Beispiel-programm ein Farbenwähler erstellt, der durch Schiebereglern festge-stellte Farben nach dem RGBA darstellt.28

Listing 12: 2-Wege-Datenbindung in AngularJS: Ein Farbenwähler (nach[10, §1.1])

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="utf-8"/>

5 <script src="https://ajax.googleapis.com/ajax/libs/angularjs

/1.5.0/angular.min.js"></script>

6 </head>

7 <body ng-app="" ng-init="r=255; g=0; b=123; a=0.7;">

8 R: <input type="range" name="rot" min="0" max="255" step="

1" ng-model="r"/><br/>

9 G: <input type="range" name="gruen" min="0" max="255" step="

1" ng-model="g"/><br/>

10 B: <input type="range" name="blau" min="0" max="255" step="

1" ng-model="b"/><br/>

11 A: <input type="range" name="alpha" min="0" max="1" step="

0.01" ng-model="a"/>

12

13 <div style="width: 300px; height: 100px; background-color:

rgba({{r}},{{g}},{{b}},{{a}});">

14 </div>

15 </body>

16 </html>

Hier wird in Zeile 7 die Angularapplikation für das gesamte <body>-Element definiert. Hier werden auch mit der Direktive ng-init die Wer-te der verwendeten Variablen r, g, b und a initialisiert. Die entsprechen-den Schiebereglern (Zeilen 8 bis 11) werden über die Direktive ng-model

mit diesen Werten voreingestellt und im <div>-Element mit Hilfe der

28 RGBA erweitert das RGB-Farbmodell mit den Werten für Rot, Grün und Blau je-weils ganzzahlig zwischen 0 und 255 um den Alphawert α zwischen 0 und 1, der dieTransparenz der Farbe festlegt (0: transparent, also unsichtbar, 1: nicht transparent,also opak).

63

Page 64: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3 AngularJS

CSS-Funktion rgba als Farbe dargestellt.Im letzten Beispielprogramm dieses Abschnitts wird über die Direktiveng-repeat eine Schleife zum Durchlaufen eines Arrays erzeugt, die alleEinträge ausgibt, sowie eine zweite Schleife, die bestimmte Elementedes Arrays filtert, also selektiert. Damit bietet AngularJS, zumindest aufden ersten Blick, alle Kontrollstrukturen einer vollständigen Program-miersprache in HTML-Syntax. Aber es gibt Einschränkungen. Aber zu-nächst das Programm:

Listing 13: Beispiel einer Schleife in AngularJS

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <script src="https://ajax.googleapis.com/ajax/libs/angularjs

/1.5.0/angular.min.js"></script>

5 </head>

6 <body ng-app="" ng-init="woerter=[’Hallo ’,’Welt, ’, ’hallo ’,

’Angular!’]">

7 <h1><span ng-repeat="wort in woerter">{{ wort }}</span></h1>

8 <p> <span ng-repeat="wort in woerter | filter: ’gul’">{{ wort

}}</span></p>

9 </body>

10 </html>

Es gibt als <h1>-Überschrift „Hallo Welt, hallo Angular!“ aus, und in dem<p>-Element das gefilterte Wort „Angular!“. Das ergibt sich, da in Zei-le 6 die Angularapplikation mit dem Array woerter und vier Einträgeninitialisiert wird und die Direktive ng-repeat als eine foreach-Schleifedurch das Array woerter läuft. In Zeile 8 wird dieselbe Schleife mit| filter: ... durchlaufen, also einem Filter. Ein Filter übernimmt in

der funktionalen Programmierung die Rolle der Selektion, also der if-Anweisung der imperativen Programmierung.Ein Problem ergibt sich bei gleichen Einträgen des Arrays, AngularJSbricht dann die Verarbeitung ab und ... gibt nichts aus, was die Fehler-suche nicht gerade vereinfacht. Man muss in diesem Falle bei der Di-rektive ng-repeat zusätzlich die Option track by $index angeben:

<body ng-app="" ng-init="woerter=[’Da’,’steh’,’ich’,’nun,’,’ich

’,’armer’,’Tor’]">

<p> <span ng-repeat="wort in woerter track by $index">{{wort

}} </span></p>

</body>

Der doppelte Eintrag ist hier das Wort „ich“. In diesem Beispiel wirdüberdies die Direktive ng-bind benutzt, die eine ähnliche Wirkung wieein {{}}-Ausdruck hat. Obwohl etwas umständlicher in der Schreibwei-se, sollte sie bei komplexeren Webanwendungen bevorzugt werden, dasie als ein Elementattribut die Datenbindung erst anzeigt, wenn die Sei-

64

Page 65: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3.3 Grundelemente von AngularJS

te geladen ist. In extremen Fällen kann es dagegen bei einem {{xyz}}-Ausdruck passieren, dass er vor Vollendung des Ladens unausgewertetangezeigt wird, also wörtlich als „{{xyz}}“.Weitere Hinweise zur Direktive ng-repeat fin-det man in der Dokumentation der API https:

//docs.angularjs.org/api/ng/directive/ngRepeat, zur Direktiveng-bind siehe https://docs.angularjs.org/api/ng/directive/ngBind.Ist also HTML mit AngularJS eine vollständige Programmiersprachewie Java, JavaScript oder PHP? Immerhin ermöglicht die HTML-SyntaxSchleifen und Selektionen. Die Antwort ist Nein, da es, vereinfachtgesagt, keine while-Schleife gibt: Eine Programmiersprache muss dieMächtigkeit haben, Algorithmen auszuführen, die potenziell unendlichlang laufen können.29 Das ist mit AngularJS nicht möglich.

3.3 Grundelemente von AngularJS

Zunächst sei als Standardreferenz die Dokumentation der API von An-gularJS erwähnt:

https://docs.angularjs.org/api/

AngularJS basiert auf den folgenden Grundelementen, siehe Abbildung3.10. Das übergreifende Strukturelement in AngularJS bilden Module.Sie kapseln zusammenhängende Anwendungskomponenten und die-nen als Container für Controller, Routen, Services, Direktiven und Filter.Modulen in AngularJS können im Sinne der Dependency Injection be-

Abb. 3.10: Struktur der Grundelemente von AngularJS.

quem andere Module als Abhängigkeiten einbinden. Sofern diese Mo-dule zuvor in einem <script>-Element in der index.html eingebundenworden sind, übernimmt AngularJS die Abhängigkeitsauflösung auto-matisch.Eine Angularanwendung besteht aus mindestens einem Startmodul,das durch die Direktive ng-app festgelegt und durch AngularJS automa-tisch initialisiert und nach dem Laden der Anwendung ausgeführt wird.

29 Eine Programmiersprache muss eine universelle Turingmaschine realisieren kön-nen, die auch einen Algorithmus zur Lösung des (übrigens unentscheidbaren) Ent-scheidungsproblems umfasst [2].

65

Page 66: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3 AngularJS

Einfache Anwendungen basieren auf genau einem Modul, in großenProjekten mit mehreren Teams dagegen können nur mehrere Modulefür eine lose Kopplung des Systems sorgen.

3.4 Erste Datenbankzugriffe mit AngularJS

An Programmbeispielen haben wir bislang AngularJS lediglich im Be-reich des Clients gesehen, also der View und der ModelView mit derZwei-Wege-Datenbindung. Ohne Zweifel ist das eine der Stärken vonAngularJS und ermöglicht beeindruckende Effekte. Aber den serversei-tigen Anteil, also die Datensynchronisation mit dem Model in Abbil-dung 3.9 (links) haben wir noch nicht betrachtet.

Wir werden jedoch gleich sehen, dass dies eine weitere Stärke des An-satzes von AngularJS ist. Um das Prinzip dieses clientseitigen Ansatzeszu verstehen, betrachten wir zunächst eine einfache Webapplikation,die die Adressdatenbank aus Abschnitt 12.2 mit AngularJS darstellt. Inder HTML-Datei wird dazu der folgende Quelltext erstellt:

Listing 14: Datenbankzugriff mit AngularJS

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="utf-8"/>

5 <script src="https://ajax.googleapis.com/ajax/libs/angularjs

/1.5.0/angular.min.js"></script>

6 <script>

7 var addressApp = angular.module(’addressApp’, []);

8 addressApp.controller(’listCtrl’, function($scope, $http) {

9 $http({

10 method: "GET",

11 url: "http://localhost/programme/angular/datenbank/

address-db.php?action=list"

12 }).then(function (response) {

13 $scope.response = response.data;

14 }, function error(response) {

15 $scope.response = response.statusText;

16 });

17 });

18 </script>

19 </head>

20

21 <body ng-app="addressApp">

22 <table ng-controller="listCtrl">

23 <tr><th>Vorname</th><th>Name</th><th>URI</th></tr>

24 <tr ng-repeat="eintrag in response">

25 <td>{{ eintrag.vorname }}</td>

66

Page 67: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3.4 Erste Datenbankzugriffe mit AngularJS

26 <td>{{ eintrag.name }}</td>

27 <td><a href="http://{{ eintrag.web }}">{{ eintrag.web }}</a

></td>

28 </tr>

29 </table>

30 </body>

31 </html>

Listing 15: Das serverseitige PHP-Skript, das in Listing 14 aufgerufenwird.

1 <?php

2 header("Access-Control-Allow-Origin: *"); //für JS-Zugriffe von

anderen Hosts

3

4 if (isset($_GET[’action’]) && $_GET[’action’] == "list") {

5 $mysqli = new mysqli("localhost", "user", "c5dDC8VJemscKPQS"

, "AdressDB");

6 $mysqli->query("SET CHARACTER SET ’utf8’");

7 $mysqli->query("SET NAMES ’utf8’");

8

9 $sql = "SELECT * FROM adressen";

10 $result = $mysqli->query("SELECT * FROM adressen");

11

12 $array = array();

13 while ($adresse = $result->fetch_assoc()) {

14 $array[] = $adresse;

15 }

16 echo json_encode($array);

17 }

18 ?>

Hier wird in den Zeilen 7 bis 17 das Modul addressApp erzeugt und ihrsofort der Controller lstCtrl hinzugefügt:

var addressApp = angular.module(’addressApp’, []);

addressApp.controller(’listCtrl’, function($scope, $http) {

...

});

Der Controller wiederum besteht aus einer Funktion,die den Angularservice $http aufruft. Er ist in https:

//docs.angularjs.org/api/ng/service/$http dokumentiert und er-wartet ein JSON-Objekt mit den Attributen method und url:

$http({

method: "GET",

url: "http://..."

}).then(function success(response) {

67

Page 68: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3 AngularJS

$scope.response = response.data;

}, function error(response) {

$scope.response = response.statusText;

});

});

Die Funktion ist ein Promise30, also eine asynchron aufgerufene Funk-tion, auf deren Resultat eine then-Funktion mit zwei Callbackfunktio-nen reagiert, eine für den Erfolgsfall und eine für den Fehlerfall. DieKonstruktion mit der then-Funktion ist also die Entsprechung der Aus-nahmebehandlung mit try-catch in der synchronen objektorientiertenProgrammierung.

3.5 Single PageAppmit Components undDatenbankzugrif-fen

In diesem Abschnitt erstellen wir eine kleine Single-Page App (SPA) mitComponents. Components sind in AngularJS als Teil eines Moduls imple-mentierbar und lehnen sich an die Web-Components an, das sind selbstdefinierbare HTML-Tags. In AngularJS hat jede Component einen Na-men und bezieht sich damit auf HTML-Tags, die jeden Großbuchstabendurch einen Bindestrich und den entsprechenden Kleinbuchstaben er-setzt. Die Component "adressenListe"beispielsweise wird mit den Tags

<adressen-liste> ... </adressen-liste>

verwendet. Sie wird in AngularJS mit der Funktion component eines Mo-duls definiert und neben dem Namen mit einem Objekt

{

templateUrl: "...",

controller: function(...) {...},

bindings: {...}

}

versehen, das die Adresse der Templatedatei, den Controller und op-tional die Bindung zu importierenden oder exportierenden Daten be-nennt. In AngularJS zeichnet sich eine Component grundsätzlich da-durch aus, dass alle Daten nur innerhalb ihres Controllers gültig sind,ein- und ausgehende Datenflüsse sowie von der Component gefeuerteEreignisse müssen über das Bindings-Objekt definiert werden. Als Kon-sequenz ist die $scope-Variable von AngularJS als öffentliches Objektin einer Component wirkungslos. Stattdessen muss im entsprechendenTemplate mit $ctrl auf den Controller mit seinen Properties zugegrif-fen werden (Abbildung 3.11). Hierbei ist innerhalb einer Componentauch gewährleistet, dass immer nur auf das passende Controllerobjekt$ctrl zugegriffen wird.

30 https://docs.angularjs.org/api/ng/service/$q#the-promise-api

68

Page 69: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3.5 Single Page App mit Components und Datenbankzugriffen

Abb. 3.11: Verantwortlichkeitsbereiche (Scopes) zweier verschachtelter Componentsund der Datenbindungen zwischen ihren Controllern ($ctrl).

Für weitere Details zu Components siehe den Developer Guide von An-gularJS, https://docs.angularjs.org/guide/component.

3.5.1 Bindings

Üblicherweise können in AngularJS Daten an irgendeiner Stelle verän-dert werden und sind mit der 2-Wege-Bindung auch überall verändert.In Components wird mit diesem allgemeinen Grundsatz gebrochen, ei-ne Component soll nur diejenigen Daten ihres lokalen Zuständigkeits-bereichs ändern können. Nur so kann in einer komplexen Anwendungnachverfoĺgt werden, wer welche Daten wann verändert hat. Für Com-ponents in AngularJS gelten daher folgende Konventionen:

• Eingaben in eine Component sollten mit den Binding < für ausder Elternkomponente eingehende Daten (Einwegbindung) ver-sehen werden, beispielsweise für ein Objekt adresse:

bindings: {

adresse: ’<’

}

• Ausgaben an die Elternkomponente werden mit den Binding & de-finiert, typischerweise als in der Component gefeuerte Ereignis-se. Beispielsweise würden die in den Funktionen onUpdate oderonDelete des Controllers der <inner>-Komponente gefeuerten Er-eignisse

bindings: {

onUpdate: ’&’,

onDelete: ’&’

}

in der Elternkomponente <outer> die Ereignisbehandleron-update oder on-delete aufrufen, wenn sie dort mit

<outer on-update="..." on-delete="...">

<inner> ... </inner>

</outer>

angegeben werden. Hierbei sind die drei Punkte in Anführungs-zeichen jeweils die zuständigen Ereignisbehandler im Controllerder <outer>-Komponente.

69

Page 70: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3 AngularJS

3.5.2 Beispielprogramm

Mit Components lässt sich nun eine webbasierte Single-Page App pro-grammieren, indem einerseits gleich mit dem Startaufruf alle Com-ponents aufgebaut werden, allerdings mit den Direktiven ng-hide bzw.ng-show abhängig von dem aktuellen Wert von Schaltervariablen deszuständigen Controllers angezeigt bzw. verborgen werden. Abhängigvon spezifischen Ereignisbehandlern, beispielsweise über die Direktiveng-click können diese Schaltervariablen verändert werden. Eine Bei-spielanwendung ist mit den folgenden Listings gegeben. Zunächst deDatei index.html, die das Viewmodel implementiert:

Listing 16: Die Index-Seite der App

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="utf-8"/>

5 <script src="https://ajax.googleapis.com/ajax/libs/angularjs

/1.5.0/angular.min.js"></script>

6 <script>

7 var modelUri = "http://localhost/programme/angular/datenbank/

address-db-2.php";

8 var addressApp = angular.module(’addressApp’, []);

9

10 addressApp.component(’adressenListe’, {

11 templateUrl: ’templates/adressenListe.html’,

12 controller: function($http) {

13 var ctrl = this; // reference necessary for closure in

$http!

14 ctrl.liste;

15 $http({

16 method: "GET",

17 url: modelUri + "?action=list"

18 }).then(function (response) {

19 ctrl.liste = response.data;

20 }, function error(response) {

21 ctrl.response = response.statusText;

22 });

23

24 ctrl.update = function(adresse) {

25 $http({

26 method: "GET",

27 url: modelUri + "?action=update&json=" + JSON.

stringify(adresse)

28 }).then(function (response) {

29 }, function error(response) {

70

Page 71: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3.5 Single Page App mit Components und Datenbankzugriffen

30 ctrl.response = response.statusText;

31 });

32 }

33 }

34 });

35

36 addressApp.component(’adressenDetail’, {

37 templateUrl: ’templates/adressenDetail.html’,

38 controller: function () {

39 this.editMode = false;

40

41 this.switchEditMode = function() {

42 this.editMode = !this.editMode;

43 }

44

45 this.update = function() {

46 this.switchEditMode();

47 this.onUpdate({adresse: this.adresse}); // <- Event

feuern

48 };

49 },

50 bindings: {

51 adresse: ’<’,

52 onUpdate: ’&’

53 }

54 });

55 </script>

56 </head>

57

58 <body ng-app="addressApp">

59 <adressen-liste>

60 </adressen-liste>

61 </body>

62 </html>

Hier wird das Modul sowie seine beiden Components definiert. DieComponent adressenListe wird ab Zeile 10 definiert, Die erste ist zurDarstellung der gesamten Adressenliste zuständig und enthält denController zur Steuerung der Datenbindung zum Model. Die Compo-nent adressenDetail ab Zeile 36 ist zur Anzeige und Editierung einereinzelnen Adresse verantwortlich und hat einen Controller, der die An-zeige über einen Schalter editMode zur Editierung ein- oder ausschaltet.Über die Bindungen (Zeile 50 bis 53) wird ein Objekt adresse von außenimportiert und ein Ereignis onUpdate nach außen gefeuert.Aus diesem Viewmodel ergibt sich noch nicht unbedingt die Hierar-chie der Components, sie wird durch den HTML-Teil der Indexdatei unddurch die beiden Templates im Unterverzeichnis templates festgelegt.

71

Page 72: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3 AngularJS

Betrachten wir die Templates zunächst im Detail:

Listing 17: Template zur Ansicht der Adressliste

1 <h2>Adressen</h2>

2 <table>

3 <tr><th>Vorname</th><th>Nachname</th><th>URI</th><th>E-Mail</

th><th></th></tr>

4 <tr ng-repeat="adresse in $ctrl.liste">

5 <td>{{ adresse.vorname }}</td>

6 <td>{{ adresse.name }}</td>

7 <td><a href="http://{{ adresse.web }}">{{ adresse.web }}</a

></td>

8 <td><a href="mailto:{{ adresse.email }}">{{ adresse.email

}}</a></td>

9 <td>

10 <adressen-detail

11 adresse="adresse"

12 on-update="$ctrl.update(adresse)">

13 </adressen-detail>

14 </td>

15 </tr>

16 </table>

Und:

Listing 18: Template zum Editieren einer Adresse

1 <button ng-hide="$ctrl.editMode" ng-click="$ctrl.switchEditMode

()">Editieren</button>

2 <div ng-show="$ctrl.editMode">

3 <input type="text" ng-model="$ctrl.adresse.vorname"><br/>

4 <input type="text" ng-model="$ctrl.adresse.name"><br/>

5 <input type="text" ng-model="$ctrl.adresse.web"><br/>

6 <input type="text" ng-model="$ctrl.adresse.email"><br/>

7 <button ng-click="$ctrl.update()">Speichern</button>

8 <button ng-click="$ctrl.switchEditMode()">Abbrechen</button>

9 </div>

Das erste Template ist zur Darstellung der vollständigen Adresslistevorgesehen, das andere zur editierbaren Darstellung einer einzelnenAdresse. Zusammen mit dem HTML-Teil der index.html ergibt sich da-durch die folgende Grobstruktur der Components in der View:

<body ng-app="addressApp">

<adressen-liste>

<h2>Adressen</h2>

<table>

...

<adressen-detail adresse="adresse" on-update="..."></

adressen-detail>

72

Page 73: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3.5 Single Page App mit Components und Datenbankzugriffen

...

</table>

</adressen-liste>

</body>

Der Datenbankkonnektor auf Serverseite schließlich ist in Listing 19angegeben.

Listing 19: Das serverseitige PHP-Skript, das in Listing 16 aufgerufenwird.

1 <?php

2 if (!isset($_GET[’action’])) {

3 die ("Kein Feld \"action\" in der GET-Method! Was soll ich

tun?");

4 }

5

6 $db = "AdressDB";

7 $table = "adressen";

8

9 $mysqli = new mysqli("localhost", "user", "c5dDC8VJemscKPQS",

$db);

10 $mysqli->query("SET CHARACTER SET ’utf8’");

11 $mysqli->query("SET NAMES ’utf8’");

12

13 if ($_GET[’action’] === "list") {

14 $sql = "SELECT * FROM $table";

15 $result = $mysqli->query($sql);

16 $array = array();

17 while ($entry = $result->fetch_assoc()) {

18 $array[] = $entry;

19 }

20 echo json_encode($array);

21 } else if ($_GET[’action’] === "update") {

22 $entry = json_decode($_GET[’json’]);

23 $sql = "UPDATE $table SET ";

24

25 foreach ($entry as $key => $value) {

26 if ($key === "\$\$hashKey") continue;

27 if ($key === "id") {

28 $where = " WHERE id=$value";

29 continue;

30 }

31 $sql .= " $key=’$value’,";

32 }

33 // Delete last comma:

34 $sql = substr($sql, 0, strlen($sql) - 1);

35

73

Page 74: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3 AngularJS

36 $sql .= $where;

37 $mysqli->query($sql);

38 }

39 ?>

Bekommt er per $_GET als Aufrufparameter action=list, so selektiert eralle Adressen der Datenbank und gibt sie als JSON-String an die Appli-kation aus, während mit action=update ein Parameter json mit der zuändernden Adresse als JSON-Objekt erwartet wird.

3.6 Bewertung und Ausblick

Es ist immer ein gewisses Risiko, ein neues Programmierkonzept odereine aktuelle Softwarebibliothek in ein Lehrwerk aufzunehmen. Insbe-sondere trifft dies zu, wenn es sich wie bei AngularJS um ein Frame-work handelt, das nicht standardisiert oder auf andere Art und Weiseübergeordnet legitimiert ist. So ist die Gefahr nicht vollkommen ausge-schlossen, dass zu dem Zeitpunkt, zu dem Sie diese Zeilen lesen, Angu-larJS bereits als veraltet gilt und ganz andere Konzepte zu empfehlensind. Für ein Lehrwerk, das auf die praktischen Probleme der Zukunftvorbereiten und das dafür notwendige Handwerkszeug bereit stellenmöchte, wäre das Aufzeigen einer fachlichen Sackgasse oder eines in-haltlichen Irrweges nicht zielführend.

Doch es sprechen aus meiner Sicht mehrere Gründe dafür, dass Angu-larJS auch im Verlaufe des nächsten Jahrzehnts eine bedeutende Rollespielen wird. Zum Ersten ist es seit mehr als einem halben Jahrzehntein Projekt des zur Zeit größten und mächtigsten Innovationstreibersder digitalen Ökonomie, der Google Inc. Ein Ende des Projekts seitensGoogle ist nicht erkennbar und wäre in den nächsten Jahren mindes-tens überraschend.

Ein weiteres Argument zur Behandlung von AngularJS ist die Tatsache,dass dort moderne und aktuelle Konzepte des Software Engineeringsangewandt werden, so Kontrollflussumkehr IoC, Dependency Injecti-on, Datenbindung und lose Kopplung. Selbst wenn AngularJS als Sys-tem vollständig in Vergessenheit geraten sein sollte, wäre es allein alsAnwendungsbeispiel dieser wichtigen Konzepte didaktisch wertvoll.

Zum Dritten bewirkt AngularJS einen sehr beachtenswerten Paradig-menwechsel der Softwareentwicklung im Web, die effiziente Aufgaben-verlagerung weg vom Server hin zum Client. Waren in den ersten Jah-ren des Internet, also Ende der 1990er Jahre, mit JavaScript, Java Ap-plets und Flash Webanwendungen vorherrschend, die dem Client fastdie gesamte Arbeit überließen, so war es in den 2000er und beginnen-den 2010er Jahren der Server, auf den aufgrund zentral zu verwalten-der Daten mit PHP, Java EE oder ASP konzeptionell die Hauptlast derWebanwendungen verlagert wurde; die serverseitigen Skripte und Pro-gramme waren zuständig sowohl für Darstellung als auch Ablauflogik

74

Page 75: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3.6 Bewertung und Ausblick

eines Webauftritts. Selbst modernere Ansätze wie Ruby on Rails, diemit einer strikteren Architektur die Webanwendungen nach dem MVC-Muster strukturieren, änderten nichts an der zentralen Rolle des Ser-vers. Erst durch das MVVM-Muster mit einem clientseitigen ViewMo-del werden große Teile der Ausführung einer Webanwendung dem Cli-ent übertragen. Die dadurch erst mögliche lose Kopplung hat mehrerewichtige Vorteile, vor allem die konsequente Trennung der zentralenFunktionen des Models und der Datenspeicherung von den Funktio-nen der Darstellung und der Bedieneroberfläche auf dem Client. Dieswiederum ermöglicht die weitgehend getrennte Programmierung vonGUI und Datenspeicherung, d.h. View und Model. Es liegt auf der Hand,dass auf diese Weise zentrale Datenspeicherungen von unterschiedli-chen Clientsystemen dargestellt und verarbeitet werden können, insbe-sondere von mobilen Endgeräten. Grundsätzlich könnte AngularJS oderein darauf aufbauender Ansatz sich zu einer Schlüsseltechnologie fürdie mobile ubiquitäre digitale Ökonomie entwickeln.

75

Page 76: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3 AngularJS

3.7 Übungsaufgaben

Aufgabe 3.1 (Direktiven und Datenbindung) (a) Schreiben Sie eine An-wendung, die zwei Textfelder „Menge“ und „Preis“ anzeigt und schonbei der Eingabe den Gesamtbetrag Menge mal Preis ausgibt.

(b) Schreiben Sie eine Webseite, in der mit einem Slider ein dargestell-tes Bild ausgeblendet werden kann. Benutzen Sie dazu das CSS-Attributopacity für Ihr Bild.

(c) Schreiben Sie eine Webanwendung, die einen Text und eine Check-box anzeigt, wobei der Text sich ändert, wenn die Checkbox selektiertist:

Verwenden Sie die Direktiven ng-hide und ng-show und dieAPI https://docs.angularjs.org/api/ng/directive/. (Soll-te dies nicht helfen, verwenden Sie die Hinweise auf http:

//www.w3schools.com/angular/tryit.asp?filename=try_ng_ng-hide.)

Aufgabe 3.2 (Single-Page App (SPA)mit Datenbankanbindung) ErweiternSie die SPA unter

https:

//docs.angularjs.org/guide/component#example-of-a-component-tree,

so dass damit eine Datenbank als Model geladen und nach Änderungder Location in der SPA auch in der Datenbank geändert wird.

76

Page 77: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 Lösungen der Aufgaben

Aufgabe 1.1

1 <!doctype html>

2 <html>

3 <head>

4 <meta http-equiv="content-type" content="text/html; charset

=utf-8" />

5 <title>Währungsumrechner</title>

6 <script type="text/javascript">

7 var berechnen = function() {

8 var euro = document.getElementById("euro").value.replace("

,",".");

9 var kurs = document.getElementById("kurs").value.replace("

,",".");

10 document.getElementById(’dollar’).innerHTML = (euro*kurs).

toFixed(2).replace(".",",");

11 }

12 </script>

13 </head>

14 <body>

15 <h2>Währungsumrechner</h2>

16 <article>

17 <table>

18 <tr>

19 <td>Kurs:</td><td><input id="kurs" value="1,29"/> $/e </

td>

20 </tr>

21 <tr>

22 <td>Betrag:</td>

23 <td width="300px">

24 <input type="text" id="euro" value="230,78"/> e

25 <input type="button" value=" = " onclick="berechnen();"

/>

26 <span id="dollar">?</span> $

27 </td>

28 </tr>

29 </table>

30 </article>

31 </body>

32 </html>

Aufgabe 1.2

1 <!doctype html>

2 <html>

3 <head>

77

Page 78: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 Lösungen der Aufgaben

4 <meta charset="UTF-8" />

5 <title>Dateneingabe</title>

6 <script type="text/javascript">

7 var get = function(id) {

8 return document.getElementById(id);

9 }

10

11 var berechnen = function(n) {

12 get((n+1)%2).value = (100 - get(n).value); //

.toFixed(2).replace(".",",");

13 }

14 </script>

15 </head>

16 <body>

17 <h2>Daten eingeben:</h2>

18 Eigenkapitalquote: <input id="0" onkeyup="berechnen(0);"/> %

19 <br/>

20 Fremdkapitalquote: <input type="text" id="1" onkeyup="

berechnen(1);"/> %

21 </body>

22 </html>

Aufgabe 1.3

1 <!DOCTYPE html>

2 <html>

3 <head> <meta charset="UTF-8"/> </head>

4 <body>

5 <script type="text/javascript">

6 /* Hintergrund: http://de.wikipedia.org/wiki/Newton-Cotes-

Formeln */

7 // n=1, Sehnentrapezformel:

8 document.write("Sehnentrapezformel:<br/>");

9 var I = function (f, a, b) {

10 return (b-a)/2 * (f(a) + f(b));

11 }

12

13 var f = function(x,y) {return 7*x*x*x*x*x*x - 8*x*x*x + 2*x -

1;}

14 var g = function(x,y) {return 1/x;}

15 var h = function(x,y) {return Math.sin(x);}

16

17 document.write("I(f,0,10) = " + I(f, 0, 10)); // => 1

18 document.write("<br/>I(g,1,e) = " + I(g, 1, Math.E)); // =>

1.1752011936438014

19 document.write("<br/>I(h,0,1) = " + I(h, 0, 1)); // => 0.5

20 document.write("<br/>I(h,0,10) = " + I(h, 0, 10)); // => 0.5

78

Page 79: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

21

22 // n=2, Kepler’sche Fassregel oder Simpsonformel:

23 document.write("<br/><br/>Kepler’sche Fassregel:<br/>");

24 var I = function (f, a, b) {

25 return (b-a)/6 * (f(a) + 4*f((a+b)/2) + f(b));

26 }

27 document.write("I(f,0,10) = " + I(f, 0, 10)); // => 1

28 document.write("<br/>I(g,1,e) = " + I(g, 1, Math.E)); // =>

1.0078899408946134

29 document.write("<br/>I(h,0,1) = " + I(h, 0, 1)); // => 0.5

30 document.write("<br/>I(h,0,10) = " + I(h, 0, 10)); // => 0.5

31

32 // n=3, Newton’sche 3/8-Regel:

33 document.write("<br/><br/>Newton’sche 3/8-Regel:<br/>");

34 var I = function (f, a, b) {

35 return (b-a)/8 * (f(a) + 3*f((2*a+b)/3) + 3*f((a+2*b)/3) + f

(b));

36 }

37 document.write("I(f,0,10) = " + I(f, 0, 10)); // => 1

38 document.write("<br/>I(g,1,e) = " + I(g, 1, Math.E)); // =>

1.003823485552161

39 document.write("<br/>I(h,0,1) = " + I(h, 0, 1)); // => 0.5

40 document.write("<br/>I(h,0,10) = " + I(h, 0, 10)); // => 0.5

41

42 // n=4, Boole-Regel:

43 document.write("<br/><br/>Milne-Regel:<br/>");

44 var I = function (f, a, b) {

45 return (b-a)/90 * (7*f(a) + 32*f((3*a+b)/4) + 12*f((2*a+2*b)

/4) + 32*f((a+3*b)/4) + 7*f(b));

46 }

47 document.write("I(f,0,10) = " + I(f, 0, 10)); // => 1

48 document.write("<br/>I(g,1,e) = " + I(g, 1, Math.E)); // =>

1.0003409768323182

49 document.write("<br/>I(h,0,1) = " + I(h, 0, 1)); // => 0.5

50 document.write("<br/>I(h,0,10) = " + I(h, 0, 10)); // => 0.5

51

52 // n=6, Weddle-Regel:

53 document.write("<br/><br/>Weddle-Regel:<br/>");

54 var I = function (f, a, b) {

55 return (b-a)/840 * (

56 41*f(a) + 216*f((5*a+b)/6) + 27*f((4*a+2*b)/6) + 272*f((3*

a+3*b)/6) +

57 27*f((2*a+4*b)/6) + 216*f((a+5*b)/6) + 41*f(b)

58 );

59 }

60 document.write("I(f,0,10) = " + I(f, 0, 10)); // => 1

79

Page 80: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 Lösungen der Aufgaben

61 document.write("<br/>I(g,1,e) = " + I(g, 1, Math.E)); // =>

1.0000220551768157

62 document.write("<br/>I(h,0,1) = " + I(h, 0, 1)); // => 0.5

63 document.write("<br/>I(h,0,10) = " + I(h, 0, 10)); // => 0.5

64 </script>

65 </body>

66 </html>

Aufgabe 1.4

1 <!DOCTYPE html>

2 <html>

3 <head> <meta charset="UTF-8"/> </head>

4 <body>

5 <script type="text/javascript">

6 var map = function(f,a) {

7 var result = []; // Create a new Array

8 for (var i = 0; i < a.length; i++) {

9 result[i] = f(a[i]);

10 }

11 return result;

12 };

13 var square = function(x) {return x*x;};

14 var cube = function(x) {return x*x*x;};

15 document.write("map(x^2, [1,2,3,4,5]) = " + map(square,

[1,2,3,4,5]));

16 document.write("<br/>map(x^3, [1,2,3,4,5]) = " + map(cube,

[1,2,3,4,5]));

17

18 var a = [1,2,3,4,5];

19 document.write("<hr/><table border=\"1\"><tr><td><i>x</i></td>"

);

20 for (var i = 0; i < a.length; i++) {

21 document.write("<td style=\"text-align:right;\">" + a[i] + "

</td>");

22 }

23 document.write("</tr><tr><td><i>x</i><sup>2</sup></td>");

24 var m = map(square,a);

25 for (var i = 0; i < a.length; i++) {

26 document.write("<td style=\"text-align:right;\">" + m[i] + "

</td>");

27 }

28 document.write("</tr><tr><td><i>x</i><sup>3</sup></td>");

29 m = map(cube,a);

30 for (var i = 0; i < a.length; i++) {

31 document.write("<td style=\"text-align:right;\">" + m[i] + "

</td>");

80

Page 81: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

32 }

33 document.write("</tr></table>");

34 </script>

35 </body>

36 </html>

Aufgabe 1.5 (a) & (b)

1 <!doctype html>

2 <html>

3 <head>

4 <meta charset="utf-8" />

5 <title>JavaScript - DOM</title>

6 <script type="text/javascript">

7 var wechsleFarbe = function(farbe) {

8 document.getElementById("Text").style.color = farbe;

9 }

10

11 var erstelleStern = function() {

12 var stern = document.createElement("img");

13 stern.setAttribute("src", "./stern.png");

14 stern.setAttribute("width", "30px");

15 document.getElementById("stern").appendChild(stern);

16 }

17

18 var loescheStern = function() {

19 document.getElementById("stern").removeChild(document.

getElementById("stern").lastChild);

20 }

21 </script>

22 </head>

23 <body>

24 <!-- main_document -->

25 <article>

26 <header>

27 <h1>Übungsblatt 3, Aufgabe 1</h1>

28 </header>

29

30 <header>

31 <h2>a)</h2>

32 </header>

33

34 <section>

35 <p id="Text" style="font-weight:bold;">Ändere meine Farbe:</p

>

36 <button onclick="wechsleFarbe(’#009900’)">Grün</button>

37 <button onclick="wechsleFarbe(’#e60000’)">Rot</button>

81

Page 82: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 Lösungen der Aufgaben

38 </section>

39

40 <header>

41 <h2>b)</h2>

42 </header>

43

44 <section>

45 <button id="erstelleStern" onclick="erstelleStern()">Stern

erstellen</button>

46 <button id="loescheStern" onclick="loescheStern()">Stern l&

ouml;schen</button>

47 <div id="stern"></div>

48 </section>

49

50 </article>

51 </body>

52 </html>

Aufgabe 1.6

1 <!DOCTYPE html>

2 <html lang="en">

3 <head>

4 <meta charset="utf-8">

5 <title>FH Südwestfalen Städteinfo</title>

6 <style>

7 body {font-family: Verdana, sans-serif; font-size:0.8em;}

8 header,nav, section,article,footer

9 {border:1px solid grey; margin:5px; padding:8px;}

10 nav ul {margin:0; padding:0;}

11 nav ul li {display:inline; margin:5px;}

12 </style>

13 <script type="text/javascript">

14 var laden = function(stadt) {

15 var request = new XMLHttpRequest();

16 request.onreadystatechange = function() {

17 if (request.readyState === 4) {

18 var info = JSON.parse(request.response);

19 document.getElementById("titel").innerHTML = info.

name;

20 var el = document.getElementById("inhalt");

21 var ausgabe = info.name;

22 if (info.capital) {

23 ausgabe += " is the capital of ";

24 } else {

25 ausgabe += " is a city in ";

26 }

82

Page 83: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

27 ausgabe += info.state + " with a metropolitan area

of " + info.residents + " residents. ";

28 ausgabe += info.remark;

29 el.innerHTML = ausgabe;

30 }

31 };

32 request.open("GET", "./" + stadt + ".json");

33 request.send();

34 };

35 </script>

36 </head>

37

38 <body>

39 <header>

40 <h1>Famous Cities</h1>

41 </header>

42

43 <nav>

44 <ul>

45 <li><input type="button" value="Berlin" onclick="laden(’

Berlin’);"/></li>

46 <li><input type="button" value="Istanbul" onclick="laden(’

Istanbul’);"/></li>

47 <li><input type="button" value="Paris" onclick="laden(’Paris

’);"/></li>

48 <li><input type="button" value="London" onclick="laden(’

London’);"/></li>

49 <li><input type="button" value="Tokyo" onclick="laden(’Tokyo

’);"/></li>

50 </ul>

51 </nav>

52

53 <section>

54

55 <h1>Famous Cities</h1>

56

57 <article>

58 <h2 id="titel">London</h2>

59 <p id="inhalt">

60 London is the capital city of England

61 with a metropolitan area of over 13 million inhabitants.

62 It is the most populous city in the United Kingdom.

63 </p>

64 </article>

65

66 </section>

83

Page 84: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 Lösungen der Aufgaben

67

68 <footer>

69 <p>&copy; 2016 FH Südwestfalen.</p>

70 </footer>

71

72 </body>

Aufgabe 1.7 (a)

1 <!doctype html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <!--Load the AJAX API-->

6 <script type="text/javascript" src="http://www.google.com/

jsapi"></script>

7 <script type="text/javascript">

8 google.load(’visualization’, ’1’, {’packages’: [’geochart’]})

;

9 var datatable_2012 = [

10 [’Standort’, ’Erstsemester’, ’Studierende’],

11 [’Hagen’, 790, 1689],

12 [’Iserlohn’, 859, 1640],

13 [’Meschede’, 504, 1127],

14 [’Soest’, 803, 2007],

15 ];

16

17 google.setOnLoadCallback(drawMarkersMap);

18

19 function drawMarkersMap() {

20 var data = google.visualization.arrayToDataTable(

datatable_2012);

21 var options = {

22 //width: ’600’,

23 region: ’DE’,

24 resolution: ’provinces’,

25 displayMode: ’markers’,

26 colorAxis: {colors: [’red’, ’purple’]}

27 };

28

29 var chart = new google.visualization.GeoChart(document.

getElementById(’karte’));

30 chart.draw(data, options);

31 };

32

33 google.load("visualization", "1", {packages:["corechart"]});

34 google.setOnLoadCallback(drawChart);

84

Page 85: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

35

36 function drawChart() {

37 var data = google.visualization.arrayToDataTable(

datatable_2012);

38 var options = {

39 //title: ’Company Performance’,

40 //hAxis: title: ’Year’, titleTextStyle: color: ’red’,

41 //width: ’600’,

42 };

43

44 var chart = new google.visualization.ColumnChart(document.

getElementById(’säulen’));

45 chart.draw(data, options);

46 //chart.draw(data);

47

48 var pieChart = new google.visualization.PieChart(document.

getElementById(’torten’));

49 var options = {

50 title: ’Einschreibungen 2012’,

51 //hAxis: title: ’Year’, titleTextStyle: color: ’red’,

52 //width: ’600’,

53 };

54 pieChart.draw(data, options);

55 }

56 </script>

57 </head>

58

59 <body>

60 <h2>Studierendenzahlen der FH Südwestfalen 2012</h2>

61 <div>(Haupthörer in Regelstudienzeit)</div>

62 <table border="0">

63 <tr>

64 <td id="säulen" style="width: 700px; height: 180px;"></

td>

65 <td rowspan="2" id="karte" style="width: 800px; height:

400px;"></td>

66 </tr>

67 <tr>

68 <td id="torten" style="width: 400px; height: 220px;"></

td>

69 </tr>

70 </table>

71 </body>

72 </html>

(b)

85

Page 86: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 Lösungen der Aufgaben

1 <!doctype html>

2 <html>

3 <head>

4 <meta charset="UTF-8"/>

5 <!--Load the AJAX API-->

6 <script type="text/javascript" src="http://www.google.com/

jsapi"></script>

7 <script type="text/javascript">

8 function tanh(x) {

9 return 1 - 2/(Math.exp(2*x) + 1);

10 }

11

12 // Load the Visualization API and the standard diagram

package.

13 google.load(’visualization’, ’1’, {’packages’:[’corechart

’]});

14

15 // Die möglichen Diagrammtypen:

16 //

https://developers.google.com/chart/interactive/docs/gallery

17

18 // Set a callback to run when the Google Visualization

API is loaded.

19 google.setOnLoadCallback(drawChart);

20

21 // Callback that creates and populates a data table,

22 // instantiates the diagram chart, passes in the data and

draws it.

23 function drawChart() {

24 // Create the data table.

25 var data = new google.visualization.DataTable();

26 data.addColumn(’string’, ’x’);

27 data.addColumn(’number’, ’2/π arctan x’);

28 data.addColumn(’number’, ’sin x’);

29 data.addColumn(’number’, ’tanh x’);

30

31 var min = -2;

32 var max = 2;

33 // either ... --------

34 var n = 100; var delta = (max - min) / n;

35 // ... or ...

36 //var delta = 0.04; var n = (max - min) / delta;

37 // ---------------

38 var x, t, precision = 2;

39 data.addRows(n+1);

40 for (i = 0; i <= n; i++) {

86

Page 87: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

41 t = min + i*delta;

42 x = Math.PI * t;

43 if (t.toFixed(precision) == Math.round(t)) {

44 if (t == -1) data.setValue(i, 0, "-π");

45 else if (t == 0) data.setValue(i, 0, "0");

46 else if (t == 1) data.setValue(i, 0, "π");

47 else data.setValue(i, 0, t + "π");

48 }

49 data.setValue(i, 1, 2/Math.PI * Math.atan(x));

50 data.setValue(i, 2, Math.sin(x));

51 data.setValue(i, 3, tanh(x));

52 }

53

54 // Instantiate and draw our chart, passing in some

options.

55 var chart = new google.visualization.LineChart(document

.getElementById(’diagram’));

56 chart.draw(data, {

57 width:640, height: 240,

58 fontSize: 10,

59 legend: ’top’, legendTextStyle: {fontSize: 12},

60 hAxis: {title: ’x’, slantedText: true,

slantedTextAngle: 90, titleTextStyle: {fontSize:

14}},

61 vAxis: {title: ’f(x)’, titleTextStyle: {fontSize:

14}},

62 //curveType: ’function’,

63 pointSize: 0,

64 });

65 }

66 </script>

67 </head>

68

69 <body>

70 <div id="diagram"></div>

71 </body>

72 </html>

Aufgabe 2.1 (a)

(b)

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="utf-8"/>

5 <title>Companies</title>

87

Page 88: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 Lösungen der Aufgaben

6 <script src="http://code.jquery.com/jquery-2.2.0.min.js"></

script>

7 <script>

8 $(function(){

9 $("tr:even").css("background-color", "lightblue");

10 });

11 </script>

12 </head>

13 <body>

14

15 <h1>Welcome to My Web Page</h1>

16

17 <table>

18 <tr>

19 <th>Company</th>

20 <th>Country</th>

21 </tr>

22 <tr>

23 <td>Alfreds Futterkiste</td>

24 <td>Germany</td>

25 </tr>

26 <tr>

27 <td>Berglunds snabbköp</td>

28 <td>Sweden</td>

29 </tr>

30 <tr>

31 <td>Centro comercial Moctezuma</td>

32 <td>Mexico</td>

33 </tr>

34 <tr>

35 <td>Ernst Handel</td>

36 <td>Austria</td>

37 </tr>

38 <tr>

39 <td>Island Trading</td>

40 <td>UK</td>

41 </tr>

42 </table>

43

44 </body>

45 </html>

Aufgabe 2.2

1 <!DOCTYPE html>

2 <html>

3 <head>

88

Page 89: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 <meta charset="utf-8"/>

5 <title>Effekte</title>

6 <script src="http://code.jquery.com/jquery-2.2.0.min.js"></

script>

7 <script src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"

></script>

8 <script>

9 $(function(){

10 $("#explode").click(function() {

11 $(this).hide("explode", {pieces: 16}, 2000);

12 });

13 });

14 </script>

15 </head>

16 <body>

17 <h1>Effekte</h1>

18 <p>

19 <img src="http://haegar.fh-swf.de/grafik/logo.gif" id="

explode" alt="Logo"/>

20 <p>

21 </body>

22 </html>

Aufgabe 2.3 (a)

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="utf-8"/>

5 <title>Programmiersprachen</title>

6 <script src="http://code.jquery.com/jquery-2.2.0.min.js"></

script>

7 <script src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"

></script>

8 <link rel="stylesheet" href="http://code.jquery.com/ui

/1.11.4/themes/smoothness/jquery-ui.css">

9 <script>

10 $(function() {

11 var availableTags = [

12 "ActionScript",

13 "AppleScript",

14 "Asp",

15 "BASIC",

16 "C",

17 "C++",

18 "Clojure",

19 "COBOL",

89

Page 90: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 Lösungen der Aufgaben

20 "ColdFusion",

21 "Erlang",

22 "Fortran",

23 "Groovy",

24 "Haskell",

25 "Java",

26 "JavaScript",

27 "Lisp",

28 "Perl",

29 "PHP",

30 "Python",

31 "Ruby",

32 "Scala",

33 "Scheme"

34 ];

35 $("#tags").autocomplete({

36 source: availableTags

37 });

38 $("#autocomplete").autocomplete({

39 source: function(request, response) {

40 var matcher = new RegExp("^" + $.ui.autocomplete.

escapeRegex(request.term), "i");

41 response($.grep(availableTags, function(item) {

42 return matcher.test(item);

43 }));

44 }

45 });

46 });

47 </script>

48 </head>

49 <body>

50

51 <div class="ui-widget">

52 Wähle eine Programmiersprache aus:

53 <label for="tags">Tags: </label>

54 <input id="tags">

55 <label for="autocomplete">Autocomplete: </label>

56 <input id="autocomplete">

57 </div>

58

59 </body>

60 </html>

Aufgabe 2.4

1 <!DOCTYPE html>

2 <html lang="en">

90

Page 91: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

3 <head>

4 <meta charset="utf-8">

5 <title>FH Südwestfalen Städteinfo</title>

6 <script src="http://code.jquery.com/jquery-2.2.0.min.js"></

script>

7 <script>

8 var laden = function(stadt) {

9 $.ajax({

10 type: "GET",

11 url: "./"+stadt+".json",

12 success: function(response) {

13 var info = response;

14 $("#title").html(info.name);

15 var ausgabe = info.name;

16 if (info.capital) {

17 ausgabe += " is the capital of ";

18 } else {

19 ausgabe += " is a city in ";

20 }

21 ausgabe += info.state + " with a metropolitan area of

" + info.residents + " residents. ";

22 ausgabe += info.remark;

23 $("#inhalt").html(ausgabe);

24 }

25 });

26 }

27 </script>

28 <style>

29 body {font-family: Verdana, sans-serif; font-size:0.8em;}

30 header,nav, section,article,footer

31 {border:1px solid grey; margin:5px; padding:8px;}

32 nav ul {margin:0; padding:0;}

33 nav ul li {display:inline; margin:5px;}

34 </style>

35 </head>

36

37 <body>

38 <header>

39 <h1>Famous Cities</h1>

40 </header>

41

42 <nav>

43 <ul>

44 <li><input type="button" value="Berlin" onclick="laden(’

Berlin’);"/></li>

45 <li><input type="button" value="Istanbul" onclick="laden(’

91

Page 92: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 Lösungen der Aufgaben

Istanbul’);"/></li>

46 <li><input type="button" value="Paris" onclick="laden(’Paris

’);"/></li>

47 <li><input type="button" value="London" onclick="laden(’

London’);"/></li>

48 <li><input type="button" value="Tokyo" onclick="laden(’Tokyo

’);"/></li>

49 </ul>

50 </nav>

51

52 <section>

53

54 <h1>Famous Cities</h1>

55

56 <article>

57 <h2 id="titel">London</h2>

58 <p id="inhalt">

59 London is the capital city of England

60 with a metropolitan area of over 13 million inhabitants.

61 It is the most populous city in the United Kingdom.

62 </p>

63 </article>

64

65 </section>

66

67 <footer>

68 <p>&copy; 2016 FH Südwestfalen.</p>

69 </footer>

70

71 </body>

Aufgabe 3.1 (a)

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="utf-8"/>

5 <script src="https://ajax.googleapis.com/ajax/libs/angularjs

/1.5.0/angular.min.js"></script>

6 </head>

7 <body ng-app="">

8 Menge: <input type="text" ng-model="menge"/> <br/>

9 Preis: <input type="text" ng-model="preis"/> <br/>

10 Gesamter Betrag: {{ menge*preis }}

11 </div>

12 </body>

13 </html>

92

Page 93: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

(b)

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="utf-8"/>

5 <script src="https://ajax.googleapis.com/ajax/libs/angularjs

/1.5.0/angular.min.js"></script>

6 </head>

7 <body ng-app="" ng-init="alpha=0.7;">

8 Fade out: <input type="range" name="alpha" min="0" max="1"

step="0.01" ng-model="alpha"/>

9 <img style="opacity:{{alpha}};" src="Merkel.jpg" width="200"

alt="Die Kanzlerin"/>

10 </body>

11 </html>

(c)

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="utf-8"/>

5 <script src="https://ajax.googleapis.com/ajax/libs/angularjs

/1.5.0/angular.min.js"></script>

6 </head>

7 <body ng-app="">

8 <input type="checkbox" ng-model="flag"/>

9 <span ng-show="flag">Text anzeigen</span>

10 <span ng-hide="flag">Text verstecken</span>

11 </div>

12 </body>

13 </html>

Aufgabe 3.2 Die Seite index.html:

1 <!DOCTYPE html>

2 <html>

3 <head>

4 <meta charset="utf-8"/>

5 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></

script>

6 <script>

7 var heroApp = angular.module(’heroApp’, []);

8 var modelUri = "http://localhost/programme/angular/datenbank/heroes/heroes.php";

9

10 heroApp.component(’heroList’, {

11 templateUrl: ’heroList.html’,

12 controller: function($scope, $element, $attrs, $http) {

13 var ctrl = this; // reference necessary for closure in $http!

14 ctrl.list;

15 $http({

16 method: "GET",

93

Page 94: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 Lösungen der Aufgaben

17 url: "http://localhost/programme/angular/datenbank/heroes/heroes.php?action=

list"

18 }).then(function (response) {

19 ctrl.list = response.data; // <- defines the list

20 }, function error(response) {

21 $scope.response = response.statusText;

22 });

23

24 ctrl.updateHero = function(hero, prop, value) {

25 hero[prop] = value; // <- no "deep data binding"!!

26 var rest = modelUri + "?action=update&id=" + hero.id + "&"+prop+"="+value;

27 $http({

28 method: "POST",

29 url: rest

30 }).then(function success(response) {

31 }, function error(response) {

32 $scope.response = response.statusText;

33 });

34 };

35

36 ctrl.deleteHero = function(hero) {

37 var idx = ctrl.list.indexOf(hero);

38 if (idx >= 0) {

39 ctrl.list.splice(idx, 1);

40 }

41 var rest = modelUri + "?action=delete&id=" + hero.id;

42 $http({

43 method: "POST",

44 url: rest

45 }).then(function success(response) {

46 }, function error(response) {

47 $scope.response = response.statusText;

48 });

49 };

50

51 ctrl.insertHero = function(hero) {

52 var rest = modelUri + "?action=insert";

53 for (var field in hero) {

54 rest += "&" + field + "=" + hero[field];

55 }

56 $http({

57 method: "POST",

58 url: rest

59 }).then(function success(response) {

60 }, function error(response) {

61 $scope.response = response.statusText;

62 });

63 ctrl.list.push(hero);

64 };

65 }

66 });

67

68 heroApp.component(’heroDetail’, {

69 templateUrl: ’heroDetail.html’,

70 controller: function ($scope, $element, $attrs) {

71 this.update = function(prop, value) {

72 this.onUpdate({hero: this.hero, prop: prop, value: value});

73 };

74 },

75 bindings: {

76 hero: ’<’,

77 onDelete: ’&’,

78 onUpdate: ’&’

79 }

80 });

94

Page 95: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

81

82 heroApp.component(’editableField’, {

83 templateUrl: ’editableField.html’,

84 controller: function ($scope, $element, $attrs) {

85 this.editMode = false; // property used to switch button view

86

87 this.handleModeChange = function() {

88 if (this.editMode) {

89 this.onUpdate({value: this.fieldValue});

90 this.fieldValueCopy = this.fieldValue;

91 }

92 this.editMode = !this.editMode;

93 };

94

95 this.reset = function() {

96 this.fieldValue = this.fieldValueCopy;

97 };

98

99 this.$onInit = function() {

100 // Make a copy of the initial value to be able to reset it later

101 this.fieldValueCopy = this.fieldValue;

102

103 // Set a default fieldType

104 if (!this.fieldType) {

105 this.fieldType = ’text’;

106 }

107 };

108 },

109 bindings: {

110 fieldValue: ’<’,

111 fieldType: ’@?’,

112 onUpdate: ’&’

113 }

114 });

115

116 heroApp.component(’heroInsert’, {

117 templateUrl: ’heroInsert.html’,

118 controller: function ($scope, $http) {

119 var ctrl = this; // reference necessary for closure in $http!

120 ctrl.hero;

121 ctrl.editMode = false;

122 ctrl.properties = [];

123 ctrl.switchEditMode = function() {

124 ctrl.editMode = !ctrl.editMode;

125 };

126

127 ctrl.save = function() {

128 ctrl.switchEditMode();

129 ctrl.onSave({hero: ctrl.hero}); // <- fire event

130 };

131 },

132 bindings: {

133 onSave: ’&’

134 }

135 });

136 </script>

137 </head>

138 <body ng-app="heroApp">

139 <hero-list></hero-list>

140 </body>

141 </html>

Das Template heroList.html:

1 <b>Heroes</b>

2 <br/>

95

Page 96: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

4 Lösungen der Aufgaben

3 <hero-detail

4 ng-repeat="hero in $ctrl.list"

5 hero="hero"

6 on-delete="$ctrl.deleteHero(hero)"

7 on-update="$ctrl.updateHero(hero, prop, value)">

8 </hero-detail>

9 <br/>

10 <hero-insert on-save="$ctrl.insertHero(hero)">

11 <button ng-click="onInsert()">Insert a new hero</button>

12 </hero-insert>

Das Template heroList.html:

Das Template heroDetail.html:

1 <hr>

2 <div>

3 Name: {{$ctrl.hero.name}}

4 <br>

5 Location:

6 <editable-field

7 field-value="$ctrl.hero.location"

8 field-type="text"

9 on-update="$ctrl.update(’location’, value)">

10 </editable-field>

11 <br>

12 Feat:

13 <editable-field

14 field-value="$ctrl.hero.feat"

15 field-type="text"

16 on-update="$ctrl.update(’feat’, value)">

17 </editable-field>

18 <br>

19 <button ng-click="$ctrl.onDelete({hero: $ctrl.hero})">Delete</button>

20 </div>

Das Template editableField.html:

1 <span ng-switch="$ctrl.editMode">

2 <input ng-switch-when="true" type="{{$ctrl.fieldType}}" ng-model="$ctrl.fieldValue">

3 <span ng-switch-default>{{$ctrl.fieldValue}}</span>

4 </span>

5 <button ng-click="$ctrl.handleModeChange()">{{$ctrl.editMode ? ’Save’ : ’Edit’}}</button

>

6 <button ng-if="$ctrl.editMode" ng-click="$ctrl.reset()">Reset</button>

Das Template heroInsert.html:

1 <hr>

2 <button ng-hide="$ctrl.editMode" ng-click="$ctrl.switchEditMode()">Create new hero</

button>

3

4 <form name="insertForm" ng-show="$ctrl.editMode" novalidate>

5 <div>

6 <input type="text" name="Name" placeholder="Name" ng-model="$ctrl.hero.name"/><br/>

7 <input type="text" name="Location" placeholder="Location" ng-model="$ctrl.hero.

location"/><br/>

8 <textarea rows="5" name="Feat" placeholder="The hero’s feat" ng-model="$ctrl.hero.feat

"/></textarea>

9 </div>

10 <button ng-show="$ctrl.editMode" ng-click="$ctrl.save();">Save</button>

11 </form>

Das PHP-Skript heroes.php:

1 <?php

2 if (!isset($_GET[’action’])) {

3 die ("No field \"action\" in GET method! What shall I do?");

4 }

96

Page 97: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

5

6 $db = "halloffame";

7 $table = "heroes";

8

9 $mysqli = new mysqli("localhost", "user", "c5dDC8VJemscKPQS", $db);

10 $mysqli->query("SET CHARACTER SET ’utf8’");

11 $mysqli->query("SET NAMES ’utf8’");

12

13 if ($_GET[’action’] == "list") {

14 $sql = "SELECT * FROM $table";

15 $result = $mysqli->query($sql);

16 $array = array();

17 while ($entry = $result->fetch_assoc()) {

18 $array[] = $entry;

19 }

20 echo json_encode($array);

21 } else if ($_GET[’action’] == "insert") {

22 $keys = array(); $values = array();

23

24 foreach ($_GET as $key => $value) {

25 if ($key === "action") continue;

26 $keys[] = $key;

27 $values[] = "’$value’";

28 }

29

30 $sql = "INSERT INTO $table ";

31 $sql .= "(" . implode(",", $keys) . ")";

32 $sql .= " VALUES ";

33 $sql .= "(" . implode(",", $values) . ")";

34 $mysqli->query($sql);

35 } else if ($_GET[’action’] == "update") {

36 $sql = "UPDATE $table SET ";

37

38 foreach ($_GET as $key => $value) {

39 if ($key === "action") continue;

40 $sql .= " $key=’$value’,";

41 }

42 // Delete last comma:

43 $sql = substr($sql, 0, strlen($sql) - 1);

44

45 $sql .= " WHERE id=$_GET[id]";

46

47 $mysqli->query($sql);

48 } else if ($_GET[’action’] == "select") {

49 $sql = "SELECT * FROM $table WHERE id=$_GET[id] LIMIT 1";

50 $result = $mysqli->query($sql);

51 $json = "{}";

52 while ($entry = $result->fetch_assoc()) {

53 $json = json_encode($entry);

54 }

55 echo $json;

56 } else if ($_GET[’action’] == "delete") {

57 $sql = "DELETE FROM $table WHERE id=$_GET[id]";

58 $result = $mysqli->query($sql);

59 } else if ($_GET[’action’] == "structure") {

60 $sql = "SHOW COLUMNS FROM $table";

61 $result = $mysqli->query($sql);

62 $fields = array();

63 while ($entry = $result->fetch_assoc()) {

64 $fields[] = $entry;

65 }

66 echo json_encode($fields);

67 }

68 ?>

97

Page 98: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

Literatur

Literatur

[1] Crockford, D. : Das Beste an JavaScript. Köln : O’Reilly, 2008

[2] de Vries, A. : Hagener Berichte der Wirtschaftsinformatik. Bd. 1: P6= NP? Norderstedt : Books on Demand, 2012. – 71–102 S.

[3] Forster, O. : Analysis 1. 9. Wiesbaden : Vieweg, 2008

[4] Fowler, M. : Inversion of Control Containersand the Dependency Injection pattern. http:

//martinfowler.com/articles/injection.html, Jan 2004

[5] Fowler, M. : InversionOfControl. http:

//martinfowler.com/bliki/InversionOfControl.html, Jun 2005

[6] Gorski, P. L. ; Iacono, L. L. ; Nguyen, H. V.: WebSockets. ModerneHTML5-Echtzeitanwendungen entwickeln. Müchen : Hanser, 2015

[7] Lau, O. : ‘Verteiltes Rechnen mit JavaScript’. In: c’t kompakt Pro-grammieren 3 (2012). – http://www.ct.de/cs1207014

[8] Piepmeyer, L. : Grundkurs Funktionale Programmierung mitScala. München Wien : Carl Hanser Verlag, 2010. – http:

//www.grundkurs-funktionale-programmierung.de/

[9] Schuhfuß, M. : ‘Node-Ausrüstung’. In: JavaScript Spezial (2012),S. 34–38. – http://www.javascript-spezial.de

[10] Tarasiewicz, P. ; Böhm, R. : AngularJS. Eine praktische Einführungin das JavaScript-Framework. Heidelberg : dpunkt.verlag, 2014

[11] Wenz, C. : ‘Die 10 Gebote. Zehn Dinge, die man über JavaScriptwissen muss’. In: Entwickler Magazin Spezial 5 (2015), S. 10–16.– https://entwickler.de/entwickler-magazin/

[12] Zeidler, E. (Hrsg.): Teubner Taschenbuch der Mathematik. Teil 1.Leipzig : B. G. Teubner, 1996

Internetquellen

[DOM] https://w3.org/DOM – Spezifikation des W3C des DOM.

[JS] https://developer.mozilla.org/en-US/docs/Web/JavaScript –JavaScript-Dokumentation des Mozilla Developer Network.

[JSL] http://www.jslint.com/ – JSLint, Programm zur Überprüfung derQualität von JavaScript Quelltext.

98

Page 99: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

Literatur

[W3C] http://www.w3c.org/ – World Wide Web Consortium, Gremiumzur Standardisierung der Web-Techniken; eine deutsche Überset-zung wichtiger Teile dieses Webauftritts findet man unter http:

//www.edition-w3c.de/, auf die auch das Deutsch-ÖsterreichischeBüro W3C.DE/AT http://www.w3c.de/ bzw. http://www.w3c.at/

verlinkt.

99

Page 100: Internettechnologien, LE 4: JavaScript, jQuery, AngularJShaegar.fh-swf.de/TBW/Internettechnologien/Internettechnologien-LE4.pdf · 1 JavaScript 1JavaScript JavaScriptisteinewichtigeProgrammiersprache,daesdieSpracheder

Abbildungsverzeichnis

Abbildungsverzeichnis

1.1 Optionen der Toleranz von JSLint [JL] . . . . . . . . . . . . . . . . . . . 51.2 Ausgabe per Element-ID . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.3 Aufrufstruktur einer Rückruffunktion. (Modifiziert nach

https://en.wikipedia.org/wiki/File:Callback-notitle.svg) . . . . . . 221.4 Objekt-Hierarchie des Browsers mit wichtigen Objekten, insbesondere

das document-Objekt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271.5 Der DOM-Baum des HTML-Dokuments aus Listing 3. . . . . . . . . . . 301.6 Zustandsdiagramm eines XMLHttpRequest-Objekts. Vgl. [6, S. 26]. . . 341.7 Polling und Long Polling als Methoden zur Synchronisation eines zen-

tralen Datenbestandes. Vgl. [6, S. 27f]. . . . . . . . . . . . . . . . . . . . 381.8 Kommunikation zwischen Hauptprozess und Worker. . . . . . . . . . 393.9 Das MVVM-Muster (links) für eine Webanwendung, im Vergleich dazu

das MVC-Muster (rechts). Da bei MVC die Hauptlast der Webanwendungauf dem Server läuft, ist der Browser in diesem Fall ein Thin Client. BeiMVVM dagegen hat er mit der Poxy-Schicht MVVM einen großen Teilder Arbeitslast und ist daher in diesem Fall ein Fat Client. . . . . . . . 59

3.10 Struktur der Grundelemente von AngularJS. . . . . . . . . . . . . . . . 653.11 Verantwortlichkeitsbereiche (Scopes) zweier verschachtelter Com-

ponents und der Datenbindungen zwischen ihren Controllern ($ctrl).. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

100


Recommended