<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de-x-formal">
	<id>https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Yoshi</id>
	<title>GlossarWiki - Benutzerbeiträge [de-formal]</title>
	<link rel="self" type="application/atom+xml" href="https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Yoshi"/>
	<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/Spezial:Beitr%C3%A4ge/Yoshi"/>
	<updated>2026-07-17T04:59:48Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=HTML5-Tutorium:_JavaScript:_Hello_World_04&amp;diff=41280</id>
		<title>HTML5-Tutorium: JavaScript: Hello World 04</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=HTML5-Tutorium:_JavaScript:_Hello_World_04&amp;diff=41280"/>
		<updated>2016-10-21T08:10:52Z</updated>

		<summary type="html">&lt;p&gt;Yoshi: /* Erstellen einer Ordnerstruktur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{HTML5-Tutorium:JavaScript:HelloWorld:Menü}}&lt;br /&gt;
&#039;&#039;&#039;Musterlösung&#039;&#039;&#039;: [https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/web/index1.html &amp;lt;code&amp;gt;index1.html&amp;lt;/code&amp;gt;],&lt;br /&gt;
[https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/web/index2.html &amp;lt;code&amp;gt;index2.html&amp;lt;/code&amp;gt;],&lt;br /&gt;
[https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/web/index3.html &amp;lt;code&amp;gt;index3.html&amp;lt;/code&amp;gt;],&lt;br /&gt;
[https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/web/index3b.html &amp;lt;code&amp;gt;index3b.html&amp;lt;/code&amp;gt;],&lt;br /&gt;
[https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/web/index4.html &amp;lt;code&amp;gt;index4.html&amp;lt;/code&amp;gt;],&lt;br /&gt;
[https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/web/index5.html &amp;lt;code&amp;gt;index5.html&amp;lt;/code&amp;gt;]&lt;br /&gt;
([https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/ SVN-Repository])&lt;br /&gt;
==Anwendungsfälle (Use Cases)==&lt;br /&gt;
Gegenüber dem [[HTML5-Tutorium:_JavaScript:_Hello_World_03|dritten Teil des Tutoriums]]&lt;br /&gt;
ändern sich die die Anwendungsfälle nicht. Die Anwendung leistet also genau dasselbe wie zuvor.&lt;br /&gt;
&lt;br /&gt;
In diesem Teil des Tutoriums geht es darum, die Anwendung besser zu strukturieren, {{dh}} zu [[Modul|modularisieren]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Bitte beachten Sie, dass ich einige HTML-Elemente und Funktionen des dritten Tutoriums umbenannt habe. &lt;br /&gt;
Das heißt, Ihre Lösungen des [[HTML5-Tutorium: JavaScript: Hello World 03|dritten Teil des Tutoriums]] sind vermutlich nicht mehr ganz konsistent mit &lt;br /&gt;
der [https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld03/Mussterlösung]. Daher ist es evtl. sinnvoll,&lt;br /&gt;
wenn Sie den vierten Teil aus Basis der Musterlösung des dritten Teils bearbeiten.&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modularisierung===&lt;br /&gt;
&lt;br /&gt;
Eine Anwendung, wie {{zB}} ein HTML5-Spiel, besteht aus diversen unterschiedlichen Komponenten mit ganz unterschiedlichen Aufgabe.&lt;br /&gt;
Bei einem HTML5-Spiel müssen die Spielfiguren, die Spielszenen, die Spiellogik, die Benutzereingaben, die Darstellung das Spiels im Browser&lt;br /&gt;
etc. erstellt und verwaltet werden, wobei das Erstellen und Verwalten teilweise während der Spiel-Entwicklung und teilweise&lt;br /&gt;
während der Spiel-Ausführung (Runtime) erfolgt. An der Entwicklung eines Spiels sind üblicherweise mehrere oder gar viele&lt;br /&gt;
Entwickler gleichzeitig beteiligt. Oft müssen einzelnen Komponenten an neue Endgeräte oder Betriebssysteme angepasst werden.&lt;br /&gt;
Beispielsweise muss eine Tastatursteuerung für eine Mobilversion des Spiels durch eine Touch- oder Gestensteuerung ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das alles ist nur machbar, wenn man die Anwendung modularisiert, {{dh}} in kleine, möglichst unabhängige&lt;br /&gt;
Komponenten unterteilt. Ein großer Feind der Modularisierung sind globale Variablen und Funktionen.&lt;br /&gt;
Je mehr Dateien von unterschiedlichen Autoren erstellt werden, desto größer ist die Gefahr, dass es zu Namenskollisionen kommt.&lt;br /&gt;
Daher gilt der [[Multimedia-Programmierung: Best Practices#Modularisierung|Grundsatz]]: Verwende so wenig globale Größen wie möglich.&lt;br /&gt;
&lt;br /&gt;
==Erstellen eines neuen Projektes==&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie ein neues Projekt  „&amp;lt;code&amp;gt;HelloWorld04&amp;lt;/code&amp;gt;“ und legen Sie dieses in Ihrem Repository ab.&lt;br /&gt;
Kopieren Sie anschließend alle Dateien aus dem dritten Teil des Tutoriums, passen Sie den Titel in der HTML-Datei an und committen Sie abermals.&lt;br /&gt;
&lt;br /&gt;
==Erstellen einer Ordnerstruktur==&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich gilt auch bei der Programmierung: Ordnung ist das halbe Leben.&lt;br /&gt;
&lt;br /&gt;
Web-Anwendungen werden sehr schnell sehr groß. Also sollte man sich eine geeignete Ordnerstruktur überlegen.&lt;br /&gt;
Üblicherweise legt man CSS-Dateien in einen Ordner namens  „&amp;lt;code&amp;gt;css&amp;lt;/code&amp;gt;“ und JavaScript-Dateien in einen Ordner namens&lt;br /&gt;
„&amp;lt;code&amp;gt;js&amp;lt;/code&amp;gt;“ oder  „&amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt;“. Sollten es viele CSS- und/oder JavaScript-Dateien werden, &lt;br /&gt;
legt man im entsprechenden Ordner geeignete Unterordner an.&lt;br /&gt;
&lt;br /&gt;
Legen Sie im Root-Verzeichnis Ihres Projektes folgende Ordner an:&lt;br /&gt;
* &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;: Der Inhalt dieses Ordners kommt später auf einen echten Web-Server. &lt;br /&gt;
* &amp;lt;code&amp;gt;web/css&amp;lt;/code&amp;gt;: Hier speichern Sie die CSS-Dateien Ihrer Web-Anwendung.&lt;br /&gt;
* &amp;lt;code&amp;gt;web/js&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;web/js/app&amp;lt;/code&amp;gt;: Hier speichern Sie die von Ihnen geschriebenen JavaScript-Dateien Ihrer Web-Anwendung.&lt;br /&gt;
* &amp;lt;code&amp;gt;web/js/lib&amp;lt;/code&amp;gt;: Hier speichern Sie die JavaScript-Bibliotheken, die andere JavaScript-Entwickler erstellt haben und die Sie in Ihrer Anwendung einsetzen..&lt;br /&gt;
&lt;br /&gt;
Da in diesem Teil des Tutoriums fünf Web-Anwendungen mit jeweils unterschiedlichem Modularisierungsgrad&lt;br /&gt;
erstellt werden, werden hier fünf App-Ordner angelegt:&lt;br /&gt;
* &amp;lt;code&amp;gt;web/js/app1&amp;lt;/code&amp;gt;: Aufteilung der App in mehrere Objekte und Dateien.&lt;br /&gt;
* &amp;lt;code&amp;gt;web/js/app2&amp;lt;/code&amp;gt;: Definition einer Klasse &amp;lt;code&amp;gt;Greet&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;web/js/app3&amp;lt;/code&amp;gt;: Reduktion der Konstanten in &amp;lt;code&amp;gt;Greet&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;web/js/app4&amp;lt;/code&amp;gt;: Weitere Modularisierung der Web-App mit JavaScript-Bordmitteln.&lt;br /&gt;
* &amp;lt;code&amp;gt;web/js/app5&amp;lt;/code&amp;gt;: Alternative Modularisierung der Web-App mit der JavaScript-Bibliothek &amp;lt;code&amp;gt;RequireJS&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Editorbereich die Datei  „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ und verschieben sie in den Ordner „&amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;“, wobei Sie darauf achten sollten, &lt;br /&gt;
dass im Verschiebe-Dialogfenster die Option  „&amp;lt;code&amp;gt;Search for references&amp;lt;/code&amp;gt;“ aktiviert ist.&lt;br /&gt;
.&lt;br /&gt;
Verschieben sie anschließend die Dateien „&amp;lt;code&amp;gt;main.css&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;main.js&amp;lt;/code&amp;gt;“&lt;br /&gt;
in die passenden Ordner „&amp;lt;code&amp;gt;web/css&amp;lt;/code&amp;gt;“ bzw. „&amp;lt;code&amp;gt;web/js&amp;lt;/code&amp;gt;“. Sie werden feststellen, dass die Verweise in den Link- und Script-Elementen der&lt;br /&gt;
Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ automatisch angepasst werden. Verschieben Sie nun die Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ in den Ordner „&amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis dieser Aktion ist, dass Ihre Web-Anwendung nicht mehr im Root-Verzeichnis des Projektes liegt, sondern (sauber strukturiert) in unterschiedlichen Unterordnern.&lt;br /&gt;
Daher ist es möglich, im Root-Verzeichnis des Projektes weitere projektspezifische Ordner und Dateien anzulegen wie „&amp;lt;code&amp;gt;conf&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;“,&lt;br /&gt;
die später nicht auf den Web-Server, auf dem die Anwendung schließlich laufen soll, kopiert werden.&lt;br /&gt;
&lt;br /&gt;
==App1==&lt;br /&gt;
&lt;br /&gt;
Benennen Sie die Dateien „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;main.js&amp;lt;/code&amp;gt;“ in&lt;br /&gt;
„&amp;lt;code&amp;gt;index1.html&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;main1.js&amp;lt;/code&amp;gt;“ um. (Im Laufe des Tutoriums kommen weitere Versionen dieser beiden Dateien dazu.)&lt;br /&gt;
&lt;br /&gt;
===Laden der CSS- und der JavaScript-Dateien===&lt;br /&gt;
&lt;br /&gt;
Eine Web-Anwendung funktioniert nur – wie Sie bereits erfahren haben –, wenn nicht nur die HTML-Datei, sondern auch die zugehörigen&lt;br /&gt;
CSS- und JavaScript-Dateien geladen werden. Allerdings gibt es dabei ein Problem: Die CSS- und JavaScript-Dateien werden im Laufe der&lt;br /&gt;
Zeit immer zahlreicher und/oder größer. Diese Dateien zu laden, dauert seine Zeit. &lt;br /&gt;
&lt;br /&gt;
In der aktuellen Version der Web-Anwendung stehen diese Verweise auf diese Dateien im &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;-Bereich des Dokuments.&lt;br /&gt;
Dieser wird vollständig geladen, bevor der &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Bereich eingelesen wird. Das heißt aber, dass der Browser keine Inhalte des HTML-Dokuments&lt;br /&gt;
darstellen kann, solange er die JavaScript- und CSS-Dateien lädt. Wenn dies zu lange dauert, verliert der Besucher die Geduld und verlässt die Seite &lt;br /&gt;
vorzeitig.&lt;br /&gt;
&lt;br /&gt;
Besser wäre es daher andersherum vorzugehen: Es wird zuerst der &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Bereich geladen und dann die JavaScript- und die CSS-Dateien.&lt;br /&gt;
Im Falle von JavaScript ist das durchaus sinnvoll, aber im Falle von CSS hat das den Effekt, dass der Browser keine Layout-Vorgaben erhalten hat,&lt;br /&gt;
wenn er mit dem [[Rendern]] der Seite beginnt. Also verwendet er die browserspezifischen Defaultwerte. Das heißt, die Seite sieht zunächst&lt;br /&gt;
ganz anders aus, als vom Designer geplant. Wenn dann die CSS-Dateien geladen wurden, wird die Seite erneut gerendert und verändert ihr Aussehen.&lt;br /&gt;
Auch das ist verwirrend und wirkt unprofessionell.&lt;br /&gt;
&lt;br /&gt;
Was also machen?&lt;br /&gt;
&lt;br /&gt;
===CSS-Dateien===&lt;br /&gt;
Für CSS-Dateien empfiehlt Google ernsthaft, die Link-Element ganz ans Ende der HTML-Datei  zu stellen, also &#039;&#039;&#039;nach&#039;&#039;&#039; dem &lt;br /&gt;
schließenden &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Tag.&lt;br /&gt;
Damit das Problem mit dem falschen Layout nicht auftritt, sollen wichtige CSS-Befehle direkt – {{dh}} als CSS-Befehle innerhalb eines&lt;br /&gt;
&amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;-Elements – in die HTML-Datei eingefügt &lt;br /&gt;
werden.&amp;lt;ref&amp;gt;{{Quelle|Google (Web)}}, Kapitel „CSS-Bereitstellung optimieren“, https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Von beiden Vorschlägen rate ich dringend ab. Der erste Vorschlag ist nicht [[HTML]]-konform, ja noch nicht einmal [[SGML]]-konform. Es mag sein,&lt;br /&gt;
dass diverse Browser diese Syntax verstehen, korrekt ist sie trotzdem nicht. Der zweite Vorschlag hat zur Folge, dass Struktur (HTML) und Layout (CSS)&lt;br /&gt;
vermischt werden. Dies war einer der Kardinalfehler von frühen HTML-Versionen aus der Zeit, bevor es das CSS-Format gab. &#039;&#039;&#039;Tun Sie das nicht.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Gehen Sie so vor, wie es unter [[Multimedia-Programmierung: Best Practices#CSS|Multimedia-Programmierung: Best Practices]] beschrieben ist.&lt;br /&gt;
&lt;br /&gt;
In unserer Anwendung haben wir bislang alles richtig gemacht, bis auf die fehlende automatische Komprimierung.&lt;br /&gt;
Diese wird im [[HTML5-Tutorium: JavaScript: Hello World 05|fünften Teil des Tutoriums]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
===JavaScript-Dateien===&lt;br /&gt;
&lt;br /&gt;
Für JavaScript-Dateien empfiehlt Google ebenfalls, diese nicht schon zu Beginn zu laden.&amp;lt;ref&amp;gt;{{Quelle|Google (Web)}}, Kapitel „CSS-Bereitstellung optimieren“, https://developers.google.com/speed/docs/insights/BlockingJS&amp;lt;/ref&amp;gt; Dieser Vorschlag ist sehr sinnvoll.&lt;br /&gt;
&lt;br /&gt;
Entfernen Sie das &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;-Element aus dem HTML-Header-Bereich und fügen Sie es vor dem schließenden &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Tag  ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;js/main1.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Globale Funktionen als Methoden===&lt;br /&gt;
&lt;br /&gt;
Erstellen sie die  Datei „&amp;lt;code&amp;gt;js/app1/greet.js&amp;lt;/code&amp;gt;“ und fügen Sie ein weiteres Script-Element in die Datei „&amp;lt;code&amp;gt;index1.html&amp;lt;/code&amp;gt;“&lt;br /&gt;
ein (dem dem Skript „&amp;lt;code&amp;gt;main1.js&amp;lt;/code&amp;gt;“):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;script type = &amp;quot;text/javascript&amp;quot; src = &amp;quot;js/app1/greet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;js/main1.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fügen Sie in die Datei „&amp;lt;code&amp;gt;greet.js&amp;lt;/code&amp;gt;“ ein Objekt ein, dass die beiden Methoden&lt;br /&gt;
„&amp;lt;code&amp;gt;sayHello&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;lt;sayHelloOnEnter&amp;lt;/code&amp;gt;“ enthält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * @namespace greet&lt;br /&gt;
 * Contains methods to say hello to the user of the web app.&lt;br /&gt;
 */&lt;br /&gt;
var&lt;br /&gt;
  greet =&lt;br /&gt;
  {&lt;br /&gt;
    /**&lt;br /&gt;
     * Welcomes the user of the web app1 by displaying a welcome message&lt;br /&gt;
     * that includes his name. The name is fetched from a text input field.&lt;br /&gt;
     */&lt;br /&gt;
    sayHello:&lt;br /&gt;
      function()&lt;br /&gt;
      {&lt;br /&gt;
        document.getElementById(&#039;heading_hello&#039;).innerHTML =&lt;br /&gt;
          &#039;Hello, &#039; + document.getElementById(&#039;input_name&#039;).value + &#039;!&#039;;&lt;br /&gt;
        document.getElementById(&#039;section_form&#039;).classList.add(&#039;hidden&#039;);&lt;br /&gt;
        document.getElementById(&#039;section_hello&#039;).classList.remove(&#039;hidden&#039;);&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * An keyboard event observer. It tests whether the enter key has been pressed.&lt;br /&gt;
     * If so, the greet method is activated. Default reactions of the browser are&lt;br /&gt;
     * disabled.&lt;br /&gt;
     * @param {KeyboardEvent} p_event - A standard JavaScript keyboard event object&lt;br /&gt;
     *   (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent)&lt;br /&gt;
     */&lt;br /&gt;
    sayHelloOnEnter:&lt;br /&gt;
      function(p_event)&lt;br /&gt;
      {&lt;br /&gt;
        if ((p_event.code === &#039;Enter&#039; || p_event.keyCode === 13) &amp;amp;&amp;amp;&lt;br /&gt;
            document.activeElement === document.getElementById(&#039;input_name&#039;)&lt;br /&gt;
           )&lt;br /&gt;
        {&lt;br /&gt;
          p_event.preventDefault();&lt;br /&gt;
          p_event.stopPropagation();&lt;br /&gt;
          greet.sayHello();&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei  „&amp;lt;code&amp;gt;main1.js&amp;lt;/code&amp;gt;“ werden dagegen alle globalen Funktionen entfernt. Die Funktion „&amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt;“&lt;br /&gt;
wird durch eine anonyme Funktion ersetzt, die sofort nach ihrer Definition auch ausgeführt wird.&lt;br /&gt;
Da die Datei „&amp;lt;code&amp;gt;main1.js&amp;lt;/code&amp;gt;“ als Letztes geladen wird, sind alle Objekte, auf die&lt;br /&gt;
während der Initialisierung zugegriffen werden muss, bereits vorhanden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Initialize the app.&lt;br /&gt;
(function()&lt;br /&gt;
{&lt;br /&gt;
  document.getElementById(&#039;button_submit&#039;)&lt;br /&gt;
          .addEventListener(&#039;click&#039;, greet.sayHello);&lt;br /&gt;
&lt;br /&gt;
  window.addEventListener(&#039;keydown&#039;, greet.sayHelloOnEnter);&lt;br /&gt;
}());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testen Sie Ihre Anwendung und speichern Sie sie zu guter Letzt im Repository.&lt;br /&gt;
&lt;br /&gt;
==App2==&lt;br /&gt;
&lt;br /&gt;
Ein wesentliches [[Programmierprinzip]] ist das Prinzip der „Wiederverwendbarkeit“.&lt;br /&gt;
Man solle Code so schreiben, dass man ihn möglichst häufig wiederverwenden kann.&lt;br /&gt;
Jede Wiederverwendung bereits bestehende Codes bedeutet Arbeitsersparnis.&lt;br /&gt;
Man kann mit einem einfachen Test überprüfen, ob man Code erstellt hat, der &lt;br /&gt;
sogar innerhalb desselben Projektes wiederverwendbar ist. Man baut die neu &lt;br /&gt;
erstellte Anwendung einfach zweimal in ein HTML-Dokument ein. Wenn beide&lt;br /&gt;
„Instanzen“ der Anwendung unabhängig voneinander funktionieren, hat man&lt;br /&gt;
alles richtig gemacht.&lt;br /&gt;
&lt;br /&gt;
Zurzeit geht das bei unserer Anwendung noch nicht. Es gibt nämlich nur&lt;br /&gt;
ein Objekt  „&amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;“, das nicht für mehrere Anwendungen parallel eingesetzt werden kann.&lt;br /&gt;
Wir müssen also bei Bedarf neue &amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;-Objekte erzeugen können.&lt;br /&gt;
Das geschieht in JavaScript mit Hilfe von sogenannten [[Konstruktor]]funktionen.  &lt;br /&gt;
&lt;br /&gt;
Erstellen Sie in Ihrem WebStorm-Projekt Kopien Ihre Anwendungsdateien:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index1.html&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;index2.html&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;js/main1.js&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;js/main2.js&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;js/app1/greet.js&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;js/app2/greet.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei „&amp;lt;code&amp;gt;index2.html&amp;lt;/code&amp;gt;“ müssen Sie dafür sorgen, dass &lt;br /&gt;
die neuen JavaScript-Dateien anstelle der alten geladen werden.&lt;br /&gt;
Und passen Sie den Titel im HTML-Header an.&lt;br /&gt;
&lt;br /&gt;
Das Objekt „&amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;“  der Datei „&amp;lt;code&amp;gt;js/app2/greet.js&amp;lt;/code&amp;gt;“ &lt;br /&gt;
wird durch der folgende [[Konstruktor]]funktion  „&amp;lt;code&amp;gt;Greet&amp;lt;/code&amp;gt;“ ersetzt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * @class&lt;br /&gt;
 * @classdesc Contains methods to say hello to the user of the web app.&lt;br /&gt;
 */&lt;br /&gt;
function Greet()&lt;br /&gt;
{&lt;br /&gt;
  var l_this = this; // this-hack: l_this contains the new object&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Welcomes the user of the web app1 by displaying a welcome message&lt;br /&gt;
   * that includes his name. The name is fetched from a text input field.&lt;br /&gt;
   */&lt;br /&gt;
  l_this.sayHello =  // this.sayHello = ...&lt;br /&gt;
  function()&lt;br /&gt;
  {&lt;br /&gt;
    document.getElementById(&#039;heading_hello&#039;).innerHTML =&lt;br /&gt;
      &#039;Hello, &#039; + document.getElementById(&amp;quot;input_name&amp;quot;).value + &#039;!&#039;;&lt;br /&gt;
    document.getElementById(&#039;section_form&#039;).classList.add(&#039;hidden&#039;);&lt;br /&gt;
    document.getElementById(&#039;section_hello&#039;).classList.remove(&#039;hidden&#039;);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * An keyboard event observer. It tests whether the enter key has been pressed.&lt;br /&gt;
   * If so, the greet method is activated. Default reactions of the browser are&lt;br /&gt;
   * disabled.&lt;br /&gt;
   * @param {KeyboardEvent} p_event - A standard JavaScript keyboard event object&lt;br /&gt;
   *   (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent)&lt;br /&gt;
   */&lt;br /&gt;
  l_this.sayHelloOnEnter = // this.sayHelloOnEnter = ...&lt;br /&gt;
  function(p_event)&lt;br /&gt;
  {&lt;br /&gt;
    if ((p_event.code === &#039;Enter&#039; || p_event.keyCode === 13) &amp;amp;&amp;amp;&lt;br /&gt;
         document.activeElement === document.getElementById(&#039;input_name&#039;)&lt;br /&gt;
       )&lt;br /&gt;
    {&lt;br /&gt;
      p_event.preventDefault();&lt;br /&gt;
      p_event.stopPropagation();&lt;br /&gt;
      l_this.sayHello();  // NOT this.sayHello();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In JavaScript kann jede Funktion auch als [[Konstruktor]], {{dh}}&lt;br /&gt;
zum Erzeugen von neuen Objekte verwendet werden, indem man das Schlüsselwort&lt;br /&gt;
„&amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;“ voranstellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var l_greet = new Greet();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In einer Konstruktorfunktion wird üblicherweise kein &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;-Befehl eingefügt.&lt;br /&gt;
Ein Konstruktor verhält sich wie eine [[Prozedur (Informatik)|Prozedur]] und nicht wie&lt;br /&gt;
eine [[Funktion (Informatik)|Funktion]]. Sie erstellt  – als [[Seiteneffekt]] – ein neues Objekt und initialisiert es.&lt;br /&gt;
Allerdings wird diese Objekt nirgendwo gespeichert, sondern – automatisch – als Ergebnis  &lt;br /&gt;
des Befehls &amp;lt;code&amp;gt;new Greet()&amp;lt;/code&amp;gt; zurückgeliefert. Anschließend wird es üblicherweise irgendwo gespeichert,&lt;br /&gt;
in einer [[Variable]]n, in einem [[Array]], in einem [[Objekt]] oder in einem [[Funktionsparameter]].&lt;br /&gt;
&lt;br /&gt;
Im Funktionsrumpf selbst kann über die Spezialvariable „&amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;“ auf das neu erstellte Objekt&lt;br /&gt;
zugegriffen werden. Dem Objekt können mittels „&amp;lt;code&amp;gt;this.sayHello = ...&amp;lt;/code&amp;gt;“,  „&amp;lt;code&amp;gt;this.sayHelloOnEnter = ...&amp;lt;/code&amp;gt;“&lt;br /&gt;
etc. [[Attribut (Objekt)|Attribute]] zugewiesen werden. Sie speichern in dem neu erstellten Objekt wieder dieselben Methoden, &lt;br /&gt;
wie im Objekt „&amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;“ der Anwendung „app1“. &lt;br /&gt;
&lt;br /&gt;
Beachten Sie, dass in der Definition der so genannte &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;-Hack zum Einsatz kommt.&lt;br /&gt;
Das Objekt &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; wird in einer lokalen Variablen &amp;lt;code&amp;gt;l_this&amp;lt;/code&amp;gt; gespeichert.&lt;br /&gt;
Und anschließend wird diese lokale Variable anstelle von &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; benutzt.&lt;br /&gt;
Für die Definition der Attribute „&amp;lt;code&amp;gt;sayHello&amp;lt;/code&amp;gt;“ und  „&amp;lt;code&amp;gt;sayHelloOnEnter&amp;lt;/code&amp;gt;“ macht es keinen Unterschied,&lt;br /&gt;
ob man „&amp;lt;code&amp;gt;this.sayHello...&amp;lt;/code&amp;gt;“ oder „&amp;lt;code&amp;gt;l_this.sayHello&amp;lt;/code&amp;gt;“ schreibt.&lt;br /&gt;
&lt;br /&gt;
Allerdings wird auch innerhalb des Methodenrumpfes von „&amp;lt;code&amp;gt;sayHelloOnEnter&amp;lt;/code&amp;gt;“ auf das neu erstellt&lt;br /&gt;
Objekt zugegriffen: &amp;lt;code&amp;gt;l_this.sayHello();&amp;lt;/code&amp;gt;. Und hier könnte nun nicht &amp;lt;code&amp;gt;this.sayHello();&amp;lt;/code&amp;gt;&lt;br /&gt;
verwendet werden. Der Grund ist, dass der Methodenrumpf erst ausgeführt wird, wen die Methode „&amp;lt;code&amp;gt;sayHelloOnEnter&amp;lt;/code&amp;gt;“ &lt;br /&gt;
zu irgendeinem anderen Zeitpunkt von irgendeinem anderen Objekt aufgerufen wird. Und  &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; bezeichnet&lt;br /&gt;
&#039;&#039;&#039;immer&#039;&#039;&#039; den Aufrufer eine Methode, und nicht das Objekt, das die Methode beinhaltet. Aber im Aufrufer der&lt;br /&gt;
Methode ist  „&amp;lt;code&amp;gt;sayHello&amp;lt;/code&amp;gt;“ {{iAllg}} gar nicht definiert oder falls doch, dann meist mit einer vollkommen anderen  &lt;br /&gt;
Funktionalität. Die Spezialvariable  „&amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;“ verhält sich hier vollkommen anders als sämtliche andere Variablen und Parameter.&lt;br /&gt;
(Fachsprachlich: In JavaScript ist die Variable  „&amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;“ [[Variable#Bindung|dynamisch gebunden]], alle übrigen Variablen sind &lt;br /&gt;
[[Variable#Bindung|statisch gebunden]].) Daher kopiert man den Wert von „&amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;“ in eine lokale Variable, &lt;br /&gt;
auf die die Methode  „&amp;lt;code&amp;gt;sayHelloOnEnter&amp;lt;/code&amp;gt;“ auch dann Zugriff hat, wenn Sie von einem anderen Objekt aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp&#039;&#039;&#039;: Definieren Sie innerhalb einer Konstruktorfunktion immer eine lokale Variable „&amp;lt;code&amp;gt;var l_this = this&amp;lt;/code&amp;gt;“ und verwenden Sie innerhalb&lt;br /&gt;
des Konstruktors nur „&amp;lt;code&amp;gt;l_this&amp;lt;/code&amp;gt;“ und nie „&amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;“. (Sie können natürlich auch einen anderen Alternativnamen für &lt;br /&gt;
 „&amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;“ verwenden. Übliche Bezeichnungen sind  „&amp;lt;code&amp;gt;that&amp;lt;/code&amp;gt;“,  „&amp;lt;code&amp;gt;self&amp;lt;/code&amp;gt;“ oder  „&amp;lt;code&amp;gt;me&amp;lt;/code&amp;gt;“.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung&#039;&#039;&#039;: Eigentlich ist der  &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;-Hack unsauber. Besser wäre es, die Methode „&amp;lt;code&amp;gt;bind&amp;lt;/code&amp;gt;“ zu verwenden&lt;br /&gt;
(siehe  [https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Function/bind MDN] oder [http://stackoverflow.com/questions/2236747/use-of-the-javascript-bind-method Stackoverflow]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
this.sayHelloOnEnter =&lt;br /&gt;
  function(p_event)&lt;br /&gt;
  {&lt;br /&gt;
    ...&lt;br /&gt;
      this.sayHello();&lt;br /&gt;
    ...&lt;br /&gt;
  }.bind(this)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aber für JavaScript-Anfänger ist die Verwendung des &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt;-Hacks deutlich einfacher.&lt;br /&gt;
&lt;br /&gt;
Fügen Sie die zuvor erwähnte Zeile &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var l_greet = new Greet();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
als erste Zeile &#039;&#039;&#039;in&#039;&#039;&#039; Ihre Initialisierungsfunktion (Datei „&amp;lt;code&amp;gt;main2.js&amp;lt;/code&amp;gt;“)&lt;br /&gt;
ein und ersetzen Sie in derselben Funktion die beiden Zugriffe auf das globale Objekt&lt;br /&gt;
„&amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;“ durch Zugriffe auf das lokale Objekt „&amp;lt;code&amp;gt;l_greet&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Danach sollte Ihre Anwendung (Datei „&amp;lt;code&amp;gt;index2.html&amp;lt;/code&amp;gt;“) wieder wie gewohnt laufen.&lt;br /&gt;
&lt;br /&gt;
==App3==&lt;br /&gt;
&lt;br /&gt;
Leider bringt uns hinsichtlich der Wiederverwendbarkeit die „Verbesserung“, die wir in App2 gegenüber App1&lt;br /&gt;
vorgenommen haben, gar nichts. Wir können jetzt zwar beliebig viele &amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;-Objekte&lt;br /&gt;
mit Hilfe von „&amp;lt;code&amp;gt;new Greet()&amp;lt;/code&amp;gt;“ erstellen.&lt;br /&gt;
Aber wir haben nichts davon, da alle diese Objekte dieselben HTML-Elemente&lt;br /&gt;
im HTML-Dokument lesen und ändern. Das heißt, wir müssen die Konstanten und&lt;br /&gt;
am Besten auch gleich noch die Zugriffe auf globale Variablen aus de rKonstruktorfunktion&lt;br /&gt;
„&amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;“ verbannen.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie in Ihrem WebStorm-Projekt Kopien Ihre Anwendungsdateien:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index2.html&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;index3.html&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;js/main2.js&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;js/main3.js&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;js/app2/greet.js&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;js/app3/greet.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei „&amp;lt;code&amp;gt;index3.html&amp;lt;/code&amp;gt;“ müssen Sie wiederum dafür sorgen, dass &lt;br /&gt;
die neuen JavaScript-Dateien anstelle der alten geladen werden.&lt;br /&gt;
Und passen Sie auch wieder den Titel im HTML-Header an.&lt;br /&gt;
&lt;br /&gt;
Ersetzen Sie nun die Konstruktorfunktion der Datei „&amp;lt;code&amp;gt;js/app3/greet.js&amp;lt;/code&amp;gt;“ &lt;br /&gt;
durch folgenden Konstruktor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * @class&lt;br /&gt;
 * @classdesc Contains methods to say hello to the user of the web app.&lt;br /&gt;
 *&lt;br /&gt;
 * @param p_document {object} A DOM object (usually the global object &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;)&lt;br /&gt;
 * @param p_section_form {string} The ID of the HTML element that contains the form section.&lt;br /&gt;
 * @param p_input_name string} The ID of the text field via which the user passes her/his name.&lt;br /&gt;
 * @param p_section_hello {string} The ID of the HTML element that contains the welcome section.&lt;br /&gt;
 * @param p_output_hello {string} The ID of the HTML element into which the greeting is to be put.&lt;br /&gt;
 * @param p_hello {string} The hello test to be displayed.&lt;br /&gt;
 */&lt;br /&gt;
function Greet(p_document,&lt;br /&gt;
               p_section_form, p_input_name,&lt;br /&gt;
               p_section_hello, p_output_hello,&lt;br /&gt;
               p_hello&lt;br /&gt;
              )&lt;br /&gt;
{&lt;br /&gt;
  var l_this = this; // this-hack&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Welcomes the user of the web app1 by displaying a welcome message&lt;br /&gt;
   * that includes his name. The name is fetched from a text input field.&lt;br /&gt;
   */&lt;br /&gt;
  l_this.sayHello =&lt;br /&gt;
  function()&lt;br /&gt;
  {&lt;br /&gt;
    p_document.getElementById(p_output_hello).innerHTML =&lt;br /&gt;
      p_hello + &#039;, &#039; + p_document.getElementById(p_input_name).value + &#039;!&#039;;&lt;br /&gt;
    p_document.getElementById(p_section_form).classList.add(&#039;hidden&#039;);&lt;br /&gt;
    p_document.getElementById(p_section_hello).classList.remove(&#039;hidden&#039;);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * An keyboard event observer. It tests whether the enter key has been pressed.&lt;br /&gt;
   * If so, the greet method is activated. Default reactions of the browser are&lt;br /&gt;
   * disabled.&lt;br /&gt;
   * @param {KeyboardEvent} p_event - A standard JavaScript keyboard event object&lt;br /&gt;
   *   (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent)&lt;br /&gt;
   */&lt;br /&gt;
  l_this.sayHelloOnEnter =&lt;br /&gt;
  function(p_event)&lt;br /&gt;
  {&lt;br /&gt;
    if ((p_event.code === &#039;Enter&#039; || p_event.keyCode === 13) &amp;amp;&amp;amp;&lt;br /&gt;
         p_document.activeElement === p_document.getElementById(p_input_name)&lt;br /&gt;
       )&lt;br /&gt;
    {&lt;br /&gt;
      p_event.preventDefault();&lt;br /&gt;
      p_event.stopPropagation();&lt;br /&gt;
      l_this.sayHello();  // NOT this.sayHello();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Konstruktor enthält diverse Konstanten nicht mehr, wie {{zB}} &amp;lt;code&amp;gt;&#039;input_name&#039;&amp;lt;/code&amp;gt;. Anstelle dessen gibt es diverse Parameter,&lt;br /&gt;
in denen diese Werte dem Konstruktor übergeben werden können: &amp;lt;code&amp;gt;p_input_name&amp;lt;/code&amp;gt;. Der Zugriff auf das globale Objekt&lt;br /&gt;
„&amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;“ wurde auch gleich noch durch eine Zugriff auf einen lokalen Parameter „&amp;lt;code&amp;gt;p_document&amp;lt;/code&amp;gt;“ ersetzt.&lt;br /&gt;
&lt;br /&gt;
Damit ist es jetzt möglich, &amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;-Objekte für ganz unterschiedliche HTML-Elemente zu definieren.&lt;br /&gt;
&lt;br /&gt;
Ersetzen Sie zunächst die Initialisierungsmethode in der Datei  „&amp;lt;code&amp;gt;main3.js&amp;lt;/code&amp;gt;“&lt;br /&gt;
durch folgenden Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
(function(p_window, Greet)&lt;br /&gt;
{&lt;br /&gt;
  var l_document = p_window.document, // The window object contains the document object.&lt;br /&gt;
      l_greet    = new Greet(l_document,&lt;br /&gt;
                             &#039;section_form&#039;, &#039;input_name&#039;,&lt;br /&gt;
                             &#039;section_hello&#039;, &#039;heading_hello&#039;,&lt;br /&gt;
                             &#039;Hello&#039;&lt;br /&gt;
                            );&lt;br /&gt;
&lt;br /&gt;
  l_document.getElementById(&#039;button_submit&#039;)&lt;br /&gt;
            .addEventListener(&#039;click&#039;, l_greet.sayHello);&lt;br /&gt;
&lt;br /&gt;
  p_window.addEventListener(&#039;keydown&#039;, l_greet.sayHelloOnEnter);&lt;br /&gt;
}(window, Greet));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In dieser Datei werden noch gibt es noch zwei globale Variablen, die Browser-Variable  „&amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;“&lt;br /&gt;
sowie die von uns definierte Konstruktorfunktion „&amp;lt;code&amp;gt;Greet&amp;lt;/code&amp;gt;“. Diese beiden globalen Größen werden der &lt;br /&gt;
anonymen Funktion als Argumente übergeben. Innerhalb des Rumpfes der Initialisierungsfunktion wird dann nicht&lt;br /&gt;
mehr auf globale Größen zugegriffen, sondern nur noch auch Funktionsparameter. Dies ist ein übliches&lt;br /&gt;
Vorgehen, um explizit klar zu machen, auf welche globalen Größen zugegriffen wird.&lt;br /&gt;
&lt;br /&gt;
Dem Konstruktor  „&amp;lt;code&amp;gt;Greet&amp;lt;/code&amp;gt;“ werden jetzt alle Information, die er benötigt,&lt;br /&gt;
explizit übergeben. Dies ist zum einen das HTML-Dokument, das mit Hilfe der von ihm erstellten&lt;br /&gt;
Methoden manipuliert werden soll, dann eine Reihe von ID-Attribut-Namen, die diejenigen&lt;br /&gt;
HTML-Elemente bezeichnen, die die Greet-Methoden lesen oder ändern sollen, sowie&lt;br /&gt;
der String „&amp;lt;code&amp;gt;&#039;Hello&#039;&amp;lt;/code&amp;gt;“ der zur Begrüßung des Benutzers verwendet werden soll.&lt;br /&gt;
Alternativ könnte er auch mit „&amp;lt;code&amp;gt;Hallo&amp;lt;/code&amp;gt;“ oder „&amp;lt;code&amp;gt;Howdy&amp;lt;/code&amp;gt;“ begrüßt werden.&lt;br /&gt;
&lt;br /&gt;
Nun müsste Ihre Anwendung „&amp;lt;code&amp;gt;index3.html&amp;lt;/code&amp;gt;“ wieder laufen. Wenn Sie es denn tut, vergessen Sie nicht, sie&lt;br /&gt;
im Repository zu speichern.&lt;br /&gt;
&lt;br /&gt;
Anschließend sollten Sie in Ihrem WebStorm-Projekt folgende Kopien erstellen:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index3.html&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;index3b.html&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;js/main3.js&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;js/main3b.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei  „&amp;lt;code&amp;gt;index3b.html&amp;lt;/code&amp;gt;“ soll abermals die JavaScript-Datei „&amp;lt;code&amp;gt;js/app3/greet.js&amp;lt;/code&amp;gt;“&lt;br /&gt;
verwenden, dafür aber „&amp;lt;code&amp;gt;js/main3b.js&amp;lt;/code&amp;gt;“ an Stelle von  „&amp;lt;code&amp;gt;js/main3.js&amp;lt;/code&amp;gt;“ laden.&lt;br /&gt;
&lt;br /&gt;
Fügen Sie in der Datei „&amp;lt;code&amp;gt;index3b.html&amp;lt;/code&amp;gt;“ in alle ID-Attribut-Bezeichner eine &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; ein:&lt;br /&gt;
&amp;lt;code&amp;gt;section_form&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;section1_form&amp;lt;/code&amp;gt; etc.&lt;br /&gt;
&lt;br /&gt;
Schließen Sie dann die beiden Sections „&amp;lt;code&amp;gt;section1_form&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;section1_hello&amp;lt;/code&amp;gt;“&lt;br /&gt;
in ein &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt;-Element ein und duplizieren Sie diese &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt;-Element (natürlich samt Inhalt) anschließend.&lt;br /&gt;
Sie werden feststellen, dass WebStorm eine Reihe von Fehlern der Art  „&amp;lt;code&amp;gt;Duplicate id reference&amp;lt;/code&amp;gt;“ meldet. &lt;br /&gt;
Das ist nicht weiter verwunderlich, da Sie ja insbesondere alle ID-Attribut-Bezeichner dupliziert haben.&lt;br /&gt;
Sie müssen daher im zweiten  &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt;-Element alle Einser in den  ID-Attribut-Bezeichnern durch Zweier ersetzen.&lt;br /&gt;
&lt;br /&gt;
Nun können Sie noch versuchen, die beiden &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt;-Elemente mittels CSS nebeneinander zu legen. Für den&lt;br /&gt;
angestrebten Test, ob Sie die Hello-World-App in einem HTML-Dokument zweimal starten können, ist das allerdings irrelevant.&lt;br /&gt;
&lt;br /&gt;
Passen Sie nun Ihre Datei „&amp;lt;code&amp;gt;main3b.js&amp;lt;/code&amp;gt;“ an die neuen Gegebenheiten an:&lt;br /&gt;
Erzeugen Sie zwei Greet-Objekte „&amp;lt;code&amp;gt;greet1&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;greet2&amp;lt;/code&amp;gt;“ (für jedes der beiden neuen &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt;-Elemente eines),&lt;br /&gt;
fügen Sie passende &amp;lt;code&amp;gt;click&amp;lt;/code&amp;gt;-Event-Listener für die beiden Buttons „&amp;lt;code&amp;gt;button1_submit&amp;lt;/code&amp;gt;“ sowie&lt;br /&gt;
„&amp;lt;code&amp;gt;button2_submit&amp;lt;/code&amp;gt;“ hinzu und sorgen Sie zu guter Letzt dafür, dass beide Methoden  „&amp;lt;code&amp;gt;l_greet1.sayHelloOnEnter&amp;lt;/code&amp;gt;“&lt;br /&gt;
und  „&amp;lt;code&amp;gt;l_greet2.sayHelloOnEnter&amp;lt;/code&amp;gt;“ bei jedem Tastendruck aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie alles richtig gemacht haben, sollten jetzt in Ihrer Web-Anwendung „&amp;lt;code&amp;gt;index3b.html&amp;lt;/code&amp;gt;“&lt;br /&gt;
zwei Hello-World-Anwendungen parallel laufen: [https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/web/index3b.html &amp;lt;code&amp;gt;index3b.html&amp;lt;/code&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==App4==&lt;br /&gt;
Hinsichtlich der Wiederverwendbarkeit der Module ist die Version 3 der Web-Anwendung schon ganz gut.&lt;br /&gt;
Allerdings gibt es noch ein paar Unsauberkeiten, die beseitigt werden sollten:&lt;br /&gt;
&lt;br /&gt;
# In den Initialisierungsdateien  „&amp;lt;code&amp;gt;main3.js&amp;lt;/code&amp;gt;“ und  „&amp;lt;code&amp;gt;main4.js&amp;lt;/code&amp;gt;“ sind immer noch konstante Werte enthalten.&lt;br /&gt;
# Die Anzahl der Parameter der Konstruktorfunktion ist zu groß.&lt;br /&gt;
# In den Initialisierungsdateien ist immer noch zu viel Anwendungscode enthalten.&lt;br /&gt;
# Die potentielle Zahl der globalen Größen ist noch zu hoch.&lt;br /&gt;
&lt;br /&gt;
Diese Probleme werden folgendermaßen gelöst:&lt;br /&gt;
&lt;br /&gt;
# Die Konstanten werden in eine [[JSON]]-Datei ausgelagert, die im ersten Schritt von der jeweiligen Initialisierungsdatei eingelesen wird. &lt;br /&gt;
# Der Konstruktorfunktion wird das gesamte JSON-Objekt mit allen Initialisierungswerten in einem einzigen Parameter übergeben.&lt;br /&gt;
# Es wird eine anwendungsspezifische Initialisierungsdatei „&amp;lt;code&amp;gt;hello.js&amp;lt;/code&amp;gt;“ erstellt. Die Initialisierungsfunktion in der Datei „&amp;lt;code&amp;gt;main4.js&amp;lt;/code&amp;gt;“ hat nur noch die Aufgabe, die JSON-Datei zu lesen und die darin enthalten Informationen anschließend an die Methode  „&amp;lt;code&amp;gt;hello.init&amp;lt;/code&amp;gt;“ weiterzuleiten.&lt;br /&gt;
# Es wird &#039;&#039;&#039;ein&#039;&#039;&#039; globales Objekt namens  „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“ erstellt, das die gesamte Web-Anwendung enthält.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie in Ihrem WebStorm-Projekt Kopien Ihrer Anwendungsdateien:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index3b.html&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;index4.html&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;js/main3.js&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;js/main4.js&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;js/app3/greet.js&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;js/app4/greet.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die HTML-Datei „&amp;lt;code&amp;gt;index4.html&amp;lt;/code&amp;gt;“&lt;br /&gt;
als HTML-[[Template]] verwendet, {{dh}} als Strukturrahmen. &#039;&#039;&#039;Sämtliche&#039;&#039;&#039; Texte,&lt;br /&gt;
die in diesem Dokument enthalten sind, werden dynamisch mittels JavaScript eingefügt. &lt;br /&gt;
&lt;br /&gt;
In der Datei „&amp;lt;code&amp;gt;index4.html&amp;lt;/code&amp;gt;“ müssen Sie also nicht nur dafür sorgen, dass &lt;br /&gt;
die neuen JavaScript-Dateien anstelle der alten geladen werden und dass der Titel angepasst wird.&lt;br /&gt;
Sie müssen auch sämtliche Text-Elemente mit eindeutigen ID-Attributen versehen.&lt;br /&gt;
&lt;br /&gt;
Die HTML-Datei der Musterlösung sieht folgendermaßen aus. Sie können auch Ihre&lt;br /&gt;
eigene Datei verwenden, müssen dann aber die JSON-Datei, die anschließend erstellt wird,&lt;br /&gt;
entsprechend anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset = &amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name    = &amp;quot;viewport&amp;quot;&lt;br /&gt;
        content = &amp;quot;width=device-width, initial-scale=1.0, user-scalable=yes&amp;quot;&lt;br /&gt;
  &amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;title&amp;gt;WK_HelloWorld04 (4)&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;link rel = &amp;quot;stylesheet&amp;quot; type = &amp;quot;text/css&amp;quot; href = &amp;quot;css/main.css&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;section id=&amp;quot;section1_form&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1 id=&amp;quot;heading1_form&amp;quot;&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
      &amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          &amp;lt;label id=&amp;quot;label1_name&amp;quot; for=&amp;quot;input1_name&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&lt;br /&gt;
          &amp;lt;input id=&amp;quot;input1_name&amp;quot; type=&amp;quot;text&amp;quot; autofocus=&amp;quot;autofocus&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          &amp;lt;button id=&amp;quot;button1_reset&amp;quot;  type=&amp;quot;reset&amp;quot;&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;button id=&amp;quot;button1_submit&amp;quot; type=&amp;quot;button&amp;quot;&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
    &amp;lt;section id=&amp;quot;section1_hello&amp;quot; class=&amp;quot;hidden&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1 id=&amp;quot;heading1_hello&amp;quot;&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
      &amp;lt;p id=&amp;quot;paragraph1_hello&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;section id=&amp;quot;section2_form&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1 id=&amp;quot;heading2_form&amp;quot;&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
      &amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          &amp;lt;label id=&amp;quot;label2_name&amp;quot; for=&amp;quot;input2_name&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&lt;br /&gt;
          &amp;lt;input id=&amp;quot;input2_name&amp;quot; type=&amp;quot;text&amp;quot; autofocus=&amp;quot;autofocus&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          &amp;lt;button id=&amp;quot;button2_reset&amp;quot;  type=&amp;quot;reset&amp;quot;&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;button id=&amp;quot;button2_submit&amp;quot; type=&amp;quot;button&amp;quot;&amp;gt;&amp;lt;/button&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
    &amp;lt;section id=&amp;quot;section2_hello&amp;quot; class=&amp;quot;hidden&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1 id=&amp;quot;heading2_hello&amp;quot;&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
      &amp;lt;p id=&amp;quot;paragraph2_hello&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script type = &amp;quot;text/javascript&amp;quot; src = &amp;quot;js/lib/wk/wk_ajax.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script type = &amp;quot;text/javascript&amp;quot; src = &amp;quot;js/app4/greet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script type = &amp;quot;text/javascript&amp;quot; src = &amp;quot;js/app4/hello.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script type = &amp;quot;text/javascript&amp;quot; src = &amp;quot;js/main4.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modularisierung===&lt;br /&gt;
&lt;br /&gt;
Um möglichst wenige globale Größen definieren zu müssen, legt man für eine&lt;br /&gt;
Anwendung oder eine Bibliothek typischerweise eine einzige globale Variable an, die ein Objekt enthält.&lt;br /&gt;
In diesem Objekt wird die gesamte Anwendung (Daten, Klassen, Funktionen etc.) gespeichert.&lt;br /&gt;
&lt;br /&gt;
Für die Hello-World-Anwendung wird eine globale „Namensraum-Variable“ namens „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“ verwendet.&lt;br /&gt;
In jeder Datei, in der ein Teilaspekt der Anwendung definiert wird, kommt folgender Rahmencode zum Einsatz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/** @namespace hello */&lt;br /&gt;
var hello =&lt;br /&gt;
(function(p_hello)&lt;br /&gt;
{ &amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  // anwendungsspezifischer Code&lt;br /&gt;
&lt;br /&gt;
  return p_hello;&lt;br /&gt;
}(hello ? hello : {}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Variablen „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“ wird das Ergebnis eines Aufrufs einer anonymen Funktion gespeichert.&lt;br /&gt;
Dieser Funktion wird als Argument der Inhalt der Variablen „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“ oder, falls dieses noch nicht&lt;br /&gt;
existiert, ein leeres Objekt als Argument übergeben (&amp;lt;code&amp;gt;hello ? hello : {}&amp;lt;/code&amp;gt;). Die anonyme Funktion&lt;br /&gt;
fügt irgendwelche Daten, Klassen oder Funktionen in dieses Objekt ein gibt es dann als Ergebnis zurück. &lt;br /&gt;
&lt;br /&gt;
Das hat den Effekt, dass beim ersten Aufruf einer derartigen Funktion eine neues Objekt erstellt und&lt;br /&gt;
in „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“ gespeichert wird, bei jedem weiteren Aufruf einer derartigen Funktion wird &lt;br /&gt;
das bestehende &amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;-Objekt einfach um weitere Inhalte ergänzt. Wenn die Definition&lt;br /&gt;
eines Namensraums über mehrere Dateien verteilt ist – wie dies üblicherweise der Fall ist –,&lt;br /&gt;
ist es egal in welcher Reihenfolge diese Dateien geladen werden. Sie können daher auch [[asynchron]]&lt;br /&gt;
geladen werden. Wichtig ist nur, dass eine Datei nicht die Inhalte einer anderen Datei überschreiben darf.&lt;br /&gt;
&lt;br /&gt;
Die Datei   „&amp;lt;code&amp;gt;js/app4/greet.js&amp;lt;/code&amp;gt;“ sieht nun folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/** @namespace hello */&lt;br /&gt;
var hello =&lt;br /&gt;
(function(p_hello)&lt;br /&gt;
{ &amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * @class     hello.Greet&lt;br /&gt;
   * @classdesc Contains methods to say hello to the user of the web app.&lt;br /&gt;
   *&lt;br /&gt;
   * @param p_document A DOM object (usually the global object &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;)&lt;br /&gt;
   * @param p_init A JSON object containing all init data.&lt;br /&gt;
   */&lt;br /&gt;
  p_hello.Greet =&lt;br /&gt;
  function(p_document, p_init)&lt;br /&gt;
  {&lt;br /&gt;
    var l_this = this; // this-hack&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Welcomes the user of the web app1 by displaying a welcome message&lt;br /&gt;
     * that includes his name. The name is fetched from a text input field.&lt;br /&gt;
     */&lt;br /&gt;
    l_this.sayHello =&lt;br /&gt;
    function()&lt;br /&gt;
    {&lt;br /&gt;
      var l_elements = p_init.HTMLElements,&lt;br /&gt;
          l_text     = p_init.text,&lt;br /&gt;
          l_hidden   = p_init.css.hidden,&lt;br /&gt;
          l_name     = p_document.getElementById(l_elements.inputName).value;&lt;br /&gt;
&lt;br /&gt;
      p_document.getElementById(l_elements.welcome)     .innerHTML = l_text.welcome;&lt;br /&gt;
      p_document.getElementById(l_elements.hello)       .innerHTML = l_text.hello.replace(&#039;$1&#039;, l_name);&lt;br /&gt;
      p_document.getElementById(l_elements.sectionHello).classList.remove(l_hidden);&lt;br /&gt;
      p_document.getElementById(l_elements.sectionForm) .classList.add(l_hidden);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * An keyboard event observer. It tests whether the enter key has been pressed.&lt;br /&gt;
     * If so, the greet method is activated. Default reactions of the browser are&lt;br /&gt;
     * disabled.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {KeyboardEvent} p_event - A standard JavaScript keyboard event object&lt;br /&gt;
     *   (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent)&lt;br /&gt;
     */&lt;br /&gt;
    l_this.sayHelloOnEnter =&lt;br /&gt;
    function(p_event)&lt;br /&gt;
    {&lt;br /&gt;
      if ((p_event.code === &#039;Enter&#039; || p_event.keyCode === 13) &amp;amp;&amp;amp;&lt;br /&gt;
           p_document.activeElement ===&lt;br /&gt;
          p_document.getElementById(p_init.HTMLElements.inputName)&lt;br /&gt;
         )&lt;br /&gt;
      {&lt;br /&gt;
        p_event.preventDefault();&lt;br /&gt;
        p_event.stopPropagation();&lt;br /&gt;
        l_this.sayHello();  // NOT this.sayHello();&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return p_hello;&lt;br /&gt;
}(hello ? hello : {}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gegenüber der Version 3 dieser Datei hat sich folgendes geändert:&lt;br /&gt;
&lt;br /&gt;
* Es wird keine globale Konstruktorfunktion „&amp;lt;code&amp;gt;Greet&amp;lt;/code&amp;gt;“ mehr definiert. Diese Konstruktorfunktion wird vielmehr in der Namensraum-Variablen „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“ gespeichert:  „&amp;lt;code&amp;gt;hello.Greet&amp;lt;/code&amp;gt;“  &lt;br /&gt;
* Die Konstruktorfunktion hat nur noch zwei Parameter: „&amp;lt;code&amp;gt;p_window&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;p_init&amp;lt;/code&amp;gt;“. Der erste Parameter enthält wie in Version 3 das globale Window-Objekt, der zweite ein JSON-Objekt, in dem alle Initialisierungsinformationen enthalten sind.&lt;br /&gt;
* Im Rumpf der Konstruktorfunktion werden alle notwendigen Informationen aus  &amp;lt;code&amp;gt;p_init&amp;lt;/code&amp;gt; extrahiert: Der Name der Formular-Section, der Name des Text-Eingabefelds, der Text der Hello-Nachricht etc.&lt;br /&gt;
&lt;br /&gt;
Legen Sie gleich noch die Datei „&amp;lt;code&amp;gt;js/app4/hello.js&amp;lt;/code&amp;gt;“ für die Web-App an: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/** @namespace hello */&lt;br /&gt;
var hello =&lt;br /&gt;
(function(p_hello)&lt;br /&gt;
{ &amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Initializes the HTML sections of the app that are&lt;br /&gt;
   * stated in &amp;lt;code&amp;gt;p_init&amp;lt;/code&amp;gt;.&lt;br /&gt;
   *&lt;br /&gt;
   * @param p_window   The browser window that contains the HTML document to be initialized.&lt;br /&gt;
   * @param p_init The initialization info for the form section and welcome section.&lt;br /&gt;
   */&lt;br /&gt;
  p_hello.init =&lt;br /&gt;
  function(p_window, p_init)&lt;br /&gt;
  {&lt;br /&gt;
    var l_document = p_window.document,&lt;br /&gt;
        l_elements = p_init.HTMLElements,&lt;br /&gt;
        l_text     = p_init.text,&lt;br /&gt;
        l_greet    = new p_hello.Greet(l_document, p_init);&lt;br /&gt;
&lt;br /&gt;
    l_document.getElementById(l_elements.headingForm)   .innerHTML = l_text.title;&lt;br /&gt;
    l_document.getElementById(l_elements.inputNameLabel).innerHTML = l_text.query;&lt;br /&gt;
    l_document.getElementById(l_elements.buttonReset)   .innerHTML = l_text.reset;&lt;br /&gt;
    l_document.getElementById(l_elements.buttonSubmit)  .innerHTML = l_text.submit;&lt;br /&gt;
    l_document.getElementById(l_elements.buttonSubmit)&lt;br /&gt;
              .addEventListener(&#039;click&#039;, l_greet.sayHello);&lt;br /&gt;
    p_window.addEventListener(&#039;keydown&#039;, l_greet.sayHelloOnEnter);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return p_hello;&lt;br /&gt;
}(hello ? hello : {}));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie ist wieder aufgebaut, wie zuvor beschrieben: Sie definiert, falls notwendig, das globale Objekt „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“ &lt;br /&gt;
und fügt anschließend eine Funktion „&amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt;“ in dieses Objekt ein. Die Methode „&amp;lt;code&amp;gt;hello.init&amp;lt;/code&amp;gt;“&lt;br /&gt;
hat dieselben Parameter, wie die zuvor definierte Konstruktorfunktion und erwartet denselben Input. &lt;br /&gt;
Ihre Aufgabe ist es, die derzeit noch leeren Text-Elemente des HTML-Templates mit Inhalt zu füllen&lt;br /&gt;
soweit der Inhalt schon bekannt ist (der Name des Benutzers ist noch unbekannt). Außerdem erstellt Sie &lt;br /&gt;
ein passendes Greet-Objekt mit Hilfe der Konstruktorfunktion „&amp;lt;code&amp;gt;hello.Greet&amp;lt;/code&amp;gt;“ und weist dem&lt;br /&gt;
Submit-Button die darin enthaltene Methode „&amp;lt;code&amp;gt;sayHello&amp;lt;/code&amp;gt;“ zu. Außerdem definiert sie&lt;br /&gt;
eine Eventlistener, der im Falle eines Key-Down-Ereignisses die Methode „&amp;lt;code&amp;gt;sayHelloOnEnter&amp;lt;/code&amp;gt;“&lt;br /&gt;
ausführt.&lt;br /&gt;
&lt;br /&gt;
===Die JSON-Datei===&lt;br /&gt;
Zur Initialisierung der Web-Anwendung werden JSON-Dateien benötigt.&lt;br /&gt;
&lt;br /&gt;
Eine JSON-Datei enthält genau ein JavaScript-Objekt in textueller Darstellung.&lt;br /&gt;
 Allerdings werden nur folgende Datentypen unterstützt&amp;lt;ref&amp;gt;[http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf ECMA International, The JSON Data Interchange Format, 2013]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
* Nullwert: &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&lt;br /&gt;
* Boolesche Werte: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Zahlen&lt;br /&gt;
* Strings&lt;br /&gt;
* Arrays&lt;br /&gt;
* Objekte&lt;br /&gt;
&lt;br /&gt;
Insbesondere Funktionen können in einer JSON-Datei nicht enthalten sein. Außerdem müssen&lt;br /&gt;
Strings immer in doppelte Anführungszeichen eingeschlossen sein, einfache Anführungszeichen sind nicht erlaubt.&lt;br /&gt;
Attributnamen werden ebenfalls durch Strings dargestellt. Auch diese müssen gemäß ECMA-Standard in doppelte &lt;br /&gt;
Anführungszeichen eingeschlossen werden. Außerdem können in JSON-Dateien (leider) keine Kommentare&lt;br /&gt;
enthalten sein.&lt;br /&gt;
&lt;br /&gt;
Folgendes Objekt ist zwar ein korrektes Javascript-Objekt, aber kein gültiges JSON-Objekt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{ a: 55, &#039;b&#039;: &#039;Wolfgang&#039; }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In JSON muss dieses Objekt folgendermaßen geschrieben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{ &amp;quot;a&amp;quot;: 55, &amp;quot;b&amp;quot;: &amp;quot;Wolfgang&amp;quot; }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Objekt ist auch ein korrektes JavaScript-Objekt. Da die Syntaxregeln von JSON strenger sind&lt;br /&gt;
als von JavaScript, gilt folgende Regel: Jedes JSON-Objekt ist auch ein JavaScript-Objekt, aber nicht&lt;br /&gt;
jedes JavaScript-Objekt ist auch ein JSON-Objekt.&lt;br /&gt;
&lt;br /&gt;
Ein Problem bereitet die Verwendung von JSON. Da ein JSON-Objekt beliebig aufgebaut sein kann,&lt;br /&gt;
kann eine IDE nicht überprüfen, ob ein bestimmtes Attribut oder Element in einem JSON-Objekt&lt;br /&gt;
mit Sicherheit enthalten ist oder nicht. Das hat {{zB}} zur Folge, das WebStorm bei einem Zugriff&lt;br /&gt;
auf eine Attribut in einem JSON-Objekt den Attributnamen unterringelt und mit der Warnung&lt;br /&gt;
„&amp;lt;code&amp;gt;Unresolved variable ...&amp;lt;/code&amp;gt;“ versieht.&lt;br /&gt;
&lt;br /&gt;
Ein Lösung für dieses Problem ist die Verwendung von [http://json-schema.org/ JSON Schema].&lt;br /&gt;
Aber darauf wird zunächst verzichtet.&lt;br /&gt;
&lt;br /&gt;
Legen Sie für die zuvor definierte HTML-Datei „&amp;lt;code&amp;gt;index4.html&amp;lt;/code&amp;gt;“ folgende JSON-Initialisierungsdatei &lt;br /&gt;
unter dem Namen „&amp;lt;code&amp;gt;web/init/hello_de.json&amp;lt;/code&amp;gt;“ an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;HTMLElements&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;sectionForm&amp;quot;:    &amp;quot;section1_form&amp;quot;,&lt;br /&gt;
    &amp;quot;headingForm&amp;quot;:    &amp;quot;heading1_form&amp;quot;,&lt;br /&gt;
    &amp;quot;inputNameLabel&amp;quot;: &amp;quot;label1_name&amp;quot;,&lt;br /&gt;
    &amp;quot;inputName&amp;quot;:      &amp;quot;input1_name&amp;quot;,&lt;br /&gt;
    &amp;quot;buttonReset&amp;quot;:    &amp;quot;button1_reset&amp;quot;,&lt;br /&gt;
    &amp;quot;buttonSubmit&amp;quot;:   &amp;quot;button1_submit&amp;quot;,&lt;br /&gt;
    &amp;quot;sectionHello&amp;quot;:   &amp;quot;section1_hello&amp;quot;,&lt;br /&gt;
    &amp;quot;hello&amp;quot;:          &amp;quot;heading1_hello&amp;quot;,&lt;br /&gt;
    &amp;quot;welcome&amp;quot;:        &amp;quot;paragraph1_hello&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;text&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;title&amp;quot;:   &amp;quot;Hallo, Fremder!&amp;quot;,&lt;br /&gt;
    &amp;quot;query&amp;quot;:   &amp;quot;Wie heißen Sie?&amp;quot;,&lt;br /&gt;
    &amp;quot;reset&amp;quot;:   &amp;quot;Reset&amp;quot;,&lt;br /&gt;
    &amp;quot;submit&amp;quot;:  &amp;quot;Begrüßung&amp;quot;,&lt;br /&gt;
    &amp;quot;hello&amp;quot;:   &amp;quot;Hallo, $1!&amp;quot;,&lt;br /&gt;
    &amp;quot;welcome&amp;quot;: &amp;quot;Willkommen bei Multimedia-Programmierung!&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;css&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;hidden&amp;quot;: &amp;quot;hidden&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Datei besteht aus einem anonymen Objekt. Es enthält seinerseits drei Objekte  „&amp;lt;code&amp;gt;HTMLElements&amp;lt;/code&amp;gt;“, &lt;br /&gt;
„&amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;css&amp;lt;/code&amp;gt;“, die für die Initialisierung der Web-Anwendung gedacht sind.&lt;br /&gt;
Das Objekt „&amp;lt;code&amp;gt;HTMLElements&amp;lt;/code&amp;gt;“ enthält sämtliche ID-Attribut-Bezeichner der Web-Anwendung.&lt;br /&gt;
Wenn das JSON-Objekt im beispielsweise im Parameter „&amp;lt;code&amp;gt;p_init&amp;lt;/code&amp;gt;“ der Web-Anwendung übergeben wird,&lt;br /&gt;
kann diese den Namen des Formularabschnitts mittels „&amp;lt;code&amp;gt;p_init.HTMLElements.sectionForm&amp;lt;/code&amp;gt;“ ermitteln.&lt;br /&gt;
&lt;br /&gt;
Im Objekt  „&amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;“ sind alle Texte enthalten, die zu gegebener Zeit in das HTML-Dokument an die geeignete&lt;br /&gt;
Stelle geschrieben werden sollen. Der Text  „&amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;“ enthält  „&amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;“ als Platzhalter.&lt;br /&gt;
Dieser Platzhalter soll von der Anwendung durch den Namen des Benutzers ersetzt werden, nachdem er ihn eingegeben hat.&lt;br /&gt;
&lt;br /&gt;
In Objekt „&amp;lt;code&amp;gt;css&amp;lt;/code&amp;gt;“ sind alle Namen von CSS-Klassen enthalten, die von der Web-Anwendung zur Laufzeit&lt;br /&gt;
zu HTML-Elementen hinzugefügt oder aus HTML-Elementen entfernt werden. Der Bezeichner, der der Anwendung bekannt ist&lt;br /&gt;
(„&amp;lt;code&amp;gt;hidden&amp;lt;/code&amp;gt;“), stimmt in diesem Fall mit dem Namen der zugehörigen CSS-Klasse überein. Das ist nicht verboten.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie analog die Datei „&amp;lt;code&amp;gt;web/init/hello_en.json&amp;lt;/code&amp;gt;“. Diese Datei soll für die zweite Web-Anwendung &lt;br /&gt;
definiert werden, die allerdings englischsprachige Texte enthält (Sie erinnern sich? In &amp;lt;code&amp;gt;index4.html&amp;lt;/code&amp;gt; &lt;br /&gt;
laufen zwei unabhängige Web-Anwendungen parallel).&lt;br /&gt;
&lt;br /&gt;
===Das Laden der JSON-Dateien===&lt;br /&gt;
&lt;br /&gt;
Für das [[asynchron]]e Laden von beliebigen Dateien von einem Web-Server gibt es in JavaScript den Befehl „&amp;lt;code&amp;gt;XMLHttpRequest&amp;lt;/code&amp;gt;“.&lt;br /&gt;
Wie man am Namen sieht, war er ursprünglich für das Laden XML-Dateien vorgesehen. Heute kann dieser Befehl allerdings für&lt;br /&gt;
jede Art von Datei verwendet werden. Sie könnten jetzt natürlich die Dokumentation (https://wiki.selfhtml.org/wiki/JavaScript/XMLHttpRequest)&lt;br /&gt;
lesen und den Befehl dann verwenden. Einfacher ist es jedoch, wenn Sie von mir erstellte die Datei &lt;br /&gt;
„&amp;lt;code&amp;gt;[https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/web/js/lib/wk/wk_ajax.js wk_ajax.js] &amp;lt;/code&amp;gt;“&lt;br /&gt;
aus dem Glossar-Repository herunterladen und in Ihrem Projekt unter dem Namen  „&amp;lt;code&amp;gt;web/js/lib/wk/wk_ajax.js&amp;lt;/code&amp;gt;“ speichern.&lt;br /&gt;
&lt;br /&gt;
Dieses Module stellt unter der globalen Variablen „&amp;lt;code&amp;gt;wk&amp;lt;/code&amp;gt;“ – diese globale Variable ist für meine Module reserviert. :-) – &lt;br /&gt;
im Modul  „&amp;lt;code&amp;gt;wk.ajax&amp;lt;/code&amp;gt;“ mehrere Methoden zum Laden von Dateien bereit.  Zum Laden von JSON-Dateien&lt;br /&gt;
sollten Sie „&amp;lt;code&amp;gt;wk.ajax.getJSON&amp;lt;/code&amp;gt;“ verwenden (obwohl es mit „&amp;lt;code&amp;gt;wk.ajax.getFile&amp;lt;/code&amp;gt;“ auch ginge; Sie müssten&lt;br /&gt;
dann allerdings den Inhalt der Datei, der als String geliefert wird, noch in ein JavaScript-Objekt umwandeln).&lt;br /&gt;
&lt;br /&gt;
Diese Methode erwartet drei Argumente, einen URI, der den Speicherort der JSON-Datei beschreibt und zwei Callback-Funktionen.&lt;br /&gt;
Die erste Funktion wird aufgerufen, sobald die JSON-Datei erfolgreich geladen wurde. Ihr wird das geladen JSON-Objekt als Argument&lt;br /&gt;
übergeben. Die zweite Callback-Funktion wird aufgerufen, falls beim Laden etwas schief gehen sollte. Die Angabe dieser Funktion ist&lt;br /&gt;
optional. In der Musterlösung wurde Sie definiert, hier wird darauf verzichtet.&lt;br /&gt;
&lt;br /&gt;
Die Initialisierungsfunktion (Datei „&amp;lt;code&amp;gt;main4.js&amp;lt;/code&amp;gt;“) sieht nun folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Initialize the app.&lt;br /&gt;
(function(p_window, p_wk, p_hello)&lt;br /&gt;
{ &amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  var l_json_files = [&#039;init/hello_de.json&#039;, &#039;init/hello_en.json&#039;];&lt;br /&gt;
&lt;br /&gt;
  for (var i in l_json_files)&lt;br /&gt;
  p_wk.ajax.&lt;br /&gt;
     getJSON&lt;br /&gt;
     ( l_json_files[i],                     // Load the JSON file.&lt;br /&gt;
       function(p_init)                     // If ready, perform the callback function.&lt;br /&gt;
       { p_hello.init(p_window, p_init); } // Initialize the corresponding hello section.&lt;br /&gt;
     );&lt;br /&gt;
}(window, wk, hello));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Initialisierungsfunktion liest die beiden zuvor erstellten JSON-Dateien ein&lt;br /&gt;
und reicht jeweils das daraus erzeugte JSON-Objekt  „&amp;lt;code&amp;gt;main4.js&amp;lt;/code&amp;gt;“ an die Initialisierungsfunktion der Web-Anwendung weiter.&lt;br /&gt;
Beachten Sie, dass die Reihen folge, in der die beiden JSON-Dateien geladen wird, nicht feststeht. Sie werden parallel geladen. Sobald eine&lt;br /&gt;
Datei vollständig geladen wurde, wird die zugehörige Callback-Funktion &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function(p_init) { p_hello.init(p_window, p_init); }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ausgeführt. Dieser wird im Parameter „&amp;lt;code&amp;gt;p_init&amp;lt;/code&amp;gt;“ das zugehörige JSON-Objekt überreicht.&lt;br /&gt;
Sie reicht es (zusammen mit die Window-Objekt) an die Methode „&amp;lt;code&amp;gt;p_hello.init&amp;lt;/code&amp;gt;“ weiter.&lt;br /&gt;
&lt;br /&gt;
==App5==&lt;br /&gt;
&lt;br /&gt;
Im Prinzip kann die in App4 vorgestellte Lösung zur Modularisierung einer Web-Anwendung &lt;br /&gt;
gut eingesetzt werden. Allerdings hat sie immer noch zwei Schwächen:&lt;br /&gt;
&lt;br /&gt;
* Der Rahmencode, der in jeder Datei der Anwendung verwendet werden muss, ist lästig. (Das ist ein kleineres Problem.)&lt;br /&gt;
* Es gibt immer noch die globale Variable „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“. Wenn man viele Bibliotheken verwendet, die auf diese Weise realisiert werden, gibt es wieder viele globale Variable. Und damit steigt das Risiko von Namenskollisionen.&lt;br /&gt;
&lt;br /&gt;
Schöner wäre es, wenn JavaScript die Modularisierung von sich aus unterstützen würde. Das ist tatsächlich geplant. In EcmaScript 6&lt;br /&gt;
gibt es zu diesem Zweck die Befehle „&amp;lt;code&amp;gt;[https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/import import]&amp;lt;/code&amp;gt;“&lt;br /&gt;
und „&amp;lt;code&amp;gt;[https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/export export]&amp;lt;/code&amp;gt;“.&lt;br /&gt;
Leider unterstützen die meisten Browser dies Befehle noch nicht.&lt;br /&gt;
&lt;br /&gt;
Solange dies der Fall ist, kann man auf JavaScript-Bibliotheken zurückgreifen, die dieselbe Aufgabe (wenn auch weniger elegant) erfüllen.&lt;br /&gt;
Hier könnte die Bibliothek „&amp;lt;code&amp;gt;RequireJS&amp;lt;/code&amp;gt;“ zum Einsatz (http://requirejs.org/). An der Prinzipiellen Struktur der Anwendung ändert sich nichts.&lt;br /&gt;
Nur die Art, wie Module definiert und geladen werden, wird angepasst.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie in Ihrem WebStorm-Projekt letztmalig Kopien Ihre Anwendungsdateien:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;index4.html&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;index5.html&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;js/main4.js&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;js/main5.js&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;js/app4/greet.js&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;js/app5/greet.js&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;js/app4/hello.js&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;js/app5/hello.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Datei „&amp;lt;code&amp;gt;index5.html&amp;lt;/code&amp;gt;“ müssen Sie wiederum dafür sorgen, dass &lt;br /&gt;
die neuen JavaScript-Dateien anstelle der alten geladen werden.&lt;br /&gt;
Und passen Sie auch wieder den Titel im HTML-Header an.&lt;br /&gt;
&lt;br /&gt;
Als nächstes müssen Sie, um &amp;lt;code&amp;gt;RequireJS&amp;lt;/code&amp;gt; nutzen zu können, den Ordner „&amp;lt;code&amp;gt;web/js/lib/require&amp;lt;/code&amp;gt;“&lt;br /&gt;
erstellen und drei Dateien dort speichern:&lt;br /&gt;
* &amp;lt;code&amp;gt;[http://requirejs.org/docs/release/2.3.2/comments/require.js require.js]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://raw.githubusercontent.com/millermedeiros/requirejs-plugins/master/lib/text.js text.js]&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://raw.githubusercontent.com/millermedeiros/requirejs-plugins/master/src/json.js json.js]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modularisierung mit RequireJS===&lt;br /&gt;
&lt;br /&gt;
Wenn man konsequent RequireJS zur Modularisierung seine Anwendung&lt;br /&gt;
einsetzt, gibt es neben den globalen Objekten des Browsers (&amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;, &lt;br /&gt;
&amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; etc.) nur noch das globales Objekt „&amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;“ sowie die globale&lt;br /&gt;
Funktion „&amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;“ zum Erstellen neuer Module.&lt;br /&gt;
&lt;br /&gt;
Es wird auch nur noch eine einzige JavaScript-Datei statisch geladen:&lt;br /&gt;
„&amp;lt;code&amp;gt;require.js&amp;lt;/code&amp;gt;“. Alle anderen Dateien werden dynamisch geladen.&lt;br /&gt;
Die in diesen Dateien enthaltenen Module werden mittels &lt;br /&gt;
Callback-Funktionen an andere Module übergeben. Auf diese&lt;br /&gt;
Weise ist sicher gestellt, dass man keine anderen globalen &lt;br /&gt;
Variablen und Funktionen mehr benötigt.&lt;br /&gt;
&lt;br /&gt;
RequireJS-Moduldefinitionen sollten gemäß der AMD-Spezifikation&lt;br /&gt;
(AMD = [[WikipediaEN:Asynchronous_module_definition|Asynchronous Module Definition]]) erfolgen. RequireJS&lt;br /&gt;
kann allerdings auch Biliotheken wie {{zB]] „&amp;lt;code&amp;gt;[https://jquery.com/ jQuery]&amp;lt;/code&amp;gt;“ laden, die nicht&lt;br /&gt;
gemäß dieser Spezifikation erstellt wurden.&lt;br /&gt;
&lt;br /&gt;
Für RequireJS gibt es einige Plugins. Eines davon ermöglicht &lt;br /&gt;
das Lesen von JSON-Dateien („&amp;lt;code&amp;gt;json.js&amp;lt;/code&amp;gt;“). Dieses Plugin wird verwendet,&lt;br /&gt;
um die Dateien „&amp;lt;code&amp;gt;init/hello_xx.json&amp;lt;/code&amp;gt;“ einzulesen. &lt;br /&gt;
&lt;br /&gt;
Wenn man mit Hilde von „&amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;“ ein neues (AMD-)Modul definiert, &lt;br /&gt;
gibt man {{iAllg}} eine ganze Liste von Modulen an, auf denen das neue Modul basiert.&lt;br /&gt;
Beispielsweise benötig das Modul „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“ (welches in der Datei „&amp;lt;code&amp;gt;js/app5/hello.js&amp;lt;/code&amp;gt;“ definiert wird)&lt;br /&gt;
das Modul „&amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;“  (welches in der Datei „&amp;lt;code&amp;gt;js/app5/greet.js&amp;lt;/code&amp;gt;“ definiert wird).&lt;br /&gt;
&lt;br /&gt;
Die Moduldefinition von „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“  sieht in diesem Fall folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
define&lt;br /&gt;
( [&#039;app/greet&#039;],&lt;br /&gt;
  function (Greet) &lt;br /&gt;
  {&lt;br /&gt;
     return ... &lt;br /&gt;
  }&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion „&amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;“ lädt zunächst alle Module, die in der Modulliste aufgeführt werden, asynchron (und damit meist auch parallel).&lt;br /&gt;
Allerdings wird jedes Modul nur einmal geladen. Das heißt, wenn zwei Module dasselbe Modul benötigen, wird dieses Modul trotzdem&lt;br /&gt;
nur einmal geladen. Sobald alle Module geladen sind, wird die im  &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Aufruf definierte Callback-Funktion ausgeführt.&lt;br /&gt;
Die Funktion muss für jedes Modul, das in der Modulliste enthalten ist, einen Parameter zur Verfügung stellen, &lt;br /&gt;
in der das jeweilige Modul-Objekt an die Callback-Funktion übergeben wird.&lt;br /&gt;
&lt;br /&gt;
Mann könnte im  &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;-Aufruf auch noch einen Modulnamen angeben. Das ist aber {{iAllg}}&lt;br /&gt;
nicht notwendig, da RequireJS defaultmäßig den Dateinamen (ohen Pfad und ohne Endung „&amp;lt;code&amp;gt;js&amp;lt;/code&amp;gt;“)&lt;br /&gt;
als Modulnamen verwendet.&lt;br /&gt;
&lt;br /&gt;
Wenn man in der Definition eines Moduls auf keine anderen Module zurückgreifen will, kann man auf die Callback-Funktion verzichten.&lt;br /&gt;
Um ein Modul zu schreiben, das ein Objekt enthält, schreibt man in diesem Fall einfach:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
define &lt;br /&gt;
({&lt;br /&gt;
    // Inhalt des Objekts, den das Modul definiert. &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn das Modul lediglich eine Funktion, wie {{zB}} eine Konstruktorfunktion „&amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;“ zur Verfügung stellen soll, schreibt man&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
define&lt;br /&gt;
( function ()&lt;br /&gt;
  {  &lt;br /&gt;
     function C(...) {...}&lt;br /&gt;
&lt;br /&gt;
     return C;&lt;br /&gt;
  }&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier gibt es zwar eine Callback-Funktion. Diese wird jedoch sofort ausgeführt, da nicht auf das LAden anderer Module gewartet werden muss.&lt;br /&gt;
&lt;br /&gt;
====Landen von RequireJS====&lt;br /&gt;
&lt;br /&gt;
Damit Module auch geefunden werden, muss man RequireJS zunächst konfigurieren.&lt;br /&gt;
Das erfolgt üblicherweise in der Datei  „&amp;lt;code&amp;gt;main.js&amp;lt;/code&amp;gt;“ (hier: „&amp;lt;code&amp;gt;main5.js&amp;lt;/code&amp;gt;“).&lt;br /&gt;
Diese Datei ist auch dafür verantwortlich, das erste Modul zu laden und damit den Ladevorgang für&lt;br /&gt;
alle benötigten Module in Gang zu setzten. Bei uns ist das das Modul „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Allerdings kann man &amp;lt;code&amp;gt;main.js&amp;lt;/code&amp;gt; nicht direkt laden, sondern man muss den&lt;br /&gt;
Browser anweisen, &amp;lt;code&amp;gt;require.js&amp;lt;/code&amp;gt; zu laden. Sobald diese Datei vollständig geladen (und übersetzt) wurde,&lt;br /&gt;
lädt &amp;lt;code&amp;gt;require.js&amp;lt;/code&amp;gt; von sich aus &amp;lt;code&amp;gt;main.js&amp;lt;/code&amp;gt;  (bzw &amp;lt;code&amp;gt;main5.js&amp;lt;/code&amp;gt;). &lt;br /&gt;
Um dies zu erreichen, fügen Sie folgendes Script-Element als letztes und einziges Script-Element &lt;br /&gt;
in die Datei „&amp;lt;code&amp;gt;index4.html&amp;lt;/code&amp;gt;“ ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script data-main=&amp;quot;js/main5&amp;quot; src=&amp;quot;js/lib/require/require.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Script-Elemente werden nicht benötigt, das RequireJS Module jeweils dynamisch &lt;br /&gt;
nachlädt, sobald sie benötigt werden.&lt;br /&gt;
&lt;br /&gt;
====Landen von &amp;lt;code&amp;gt;main.js&amp;lt;/code&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Nachdem &amp;lt;code&amp;gt;require.js&amp;lt;/code&amp;gt; geladen wurde, liest das Programm das Script-Attribut „&amp;lt;code&amp;gt;data-main&amp;lt;/code&amp;gt;“&lt;br /&gt;
und erfährt so, dass die Datei „&amp;lt;code&amp;gt;js/main5.js&amp;lt;/code&amp;gt;“ als nächstes geladen werden soll (die fehlende Dateiendung&lt;br /&gt;
„&amp;lt;code&amp;gt;.js&amp;lt;/code&amp;gt;“ ergänzt RequireJS automatisch).&lt;br /&gt;
&lt;br /&gt;
Die Datei „&amp;lt;code&amp;gt;js/main5.js&amp;lt;/code&amp;gt;“ konfiguriert zunächst RequireJS:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
requirejs.config&lt;br /&gt;
({&lt;br /&gt;
  baseUrl: &#039;js&#039;, // By default load any modules from directory js&lt;br /&gt;
  paths :&lt;br /&gt;
  {&lt;br /&gt;
    app:  &#039;app5&#039;,&lt;br /&gt;
    json: &#039;lib/require/json&#039;,&lt;br /&gt;
    text: &#039;lib/require/text&#039;,&lt;br /&gt;
    init: &#039;../init&#039;&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird festgelegt, dass sich die JAvaScript-Dateien im Ordner „&amp;lt;code&amp;gt;js&amp;lt;/code&amp;gt;“ befinden. Das Attribut „&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;“&lt;br /&gt;
legt ein paar spezielle Unterordner fest. Modulnamen, die mit „&amp;lt;code&amp;gt;app/&amp;lt;/code&amp;gt;“ beginnen (wie {{zB}} „&amp;lt;code&amp;gt;app/greet&amp;lt;/code&amp;gt;“), &lt;br /&gt;
werden im Ordner „&amp;lt;code&amp;gt;js/app5/&amp;lt;/code&amp;gt;“ gesucht. Für die Module „&amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt;“ (ein RequireJS-Plugin zum Laden von&lt;br /&gt;
JSON-Dateien) und „&amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;“ (welches von &lt;br /&gt;
„&amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt;“ benötigt wird) wurde der Pfad direkt angegeben. Die JSON-Dateien finden sich im Ordner &lt;br /&gt;
„&amp;lt;code&amp;gt;js/../init&amp;lt;/code&amp;gt;“, {{dh}} im Ordner „&amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Nun kann die eigentliche Anwendung gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
requirejs&lt;br /&gt;
( [&#039;json!init/hello_de.json&#039;, &#039;json!init/hello_en.json&#039;, &#039;app/hello&#039;],&lt;br /&gt;
  function(p_init_de, p_init_en, p_hello)&lt;br /&gt;
  {&lt;br /&gt;
    p_hello.init(window, p_init_de);&lt;br /&gt;
    p_hello.init(window, p_init_en);&lt;br /&gt;
  }&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Anwendung benötigt zwei JSON-Dateien (das dafür notwendige JSON-Plugin wird automatisch geladen) &lt;br /&gt;
und das Modul  „&amp;lt;code&amp;gt;app/init&amp;lt;/code&amp;gt;“ (welches sich gemäß Konfiguration in der Datei  „&amp;lt;code&amp;gt;js/app5/init&amp;lt;/code&amp;gt;“ befindet).&lt;br /&gt;
&lt;br /&gt;
Sobald die drei Dateien vollständig geladen wurden, wird die Callback-Funktion aufgerufen.&lt;br /&gt;
Dieser werden die beiden JSON-Objekte sowie das Hello-Initialisierungs-Modul-Objekt übergeben.&lt;br /&gt;
Die Callback-Funktion kann somit problemlos die beiden Hello-World-Anwendungen mittels  „&amp;lt;code&amp;gt;p_hello.init&amp;lt;/code&amp;gt;“ initialisieren und starten.&lt;br /&gt;
&lt;br /&gt;
====Das Modul „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“====&lt;br /&gt;
&lt;br /&gt;
Der Code des Moduls „&amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;“ unterscheidet sich einglich nur hinsichtlich des Modulrahmens vom&lt;br /&gt;
Code dieses Moduls in der &amp;lt;code&amp;gt;app4&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
define&lt;br /&gt;
( [&#039;app/greet&#039;],&lt;br /&gt;
  function (Greet) // The module &#039;app/greet&#039; contains the constructor &#039;Greet&#039;.&lt;br /&gt;
  {&lt;br /&gt;
    return {&lt;br /&gt;
      /**&lt;br /&gt;
       * Initializes the HTML sections of the app that are&lt;br /&gt;
       * stated in &amp;lt;code&amp;gt;p_init&amp;lt;/code&amp;gt;.&lt;br /&gt;
       *&lt;br /&gt;
       * @param p_window   The browser window that contains the HTML document to be initialized.&lt;br /&gt;
       * @param p_init The initialization info for the form section and welcome section.&lt;br /&gt;
       */&lt;br /&gt;
      init:&lt;br /&gt;
        function (p_window, p_init)&lt;br /&gt;
        {&lt;br /&gt;
          var l_document = p_window.document,&lt;br /&gt;
              l_elements = p_init.HTMLElements,&lt;br /&gt;
              l_text     = p_init.text,&lt;br /&gt;
              l_greet    = new Greet(l_document, p_init);&lt;br /&gt;
&lt;br /&gt;
          l_document.getElementById(l_elements.headingForm).innerHTML    = l_text.title;&lt;br /&gt;
          l_document.getElementById(l_elements.inputNameLabel).innerHTML = l_text.query;&lt;br /&gt;
          l_document.getElementById(l_elements.buttonReset).innerHTML    = l_text.reset;&lt;br /&gt;
          l_document.getElementById(l_elements.buttonSubmit).innerHTML   = l_text.submit;&lt;br /&gt;
          l_document.getElementById(l_elements.buttonSubmit)&lt;br /&gt;
                    .addEventListener(&#039;click&#039;, l_greet.sayHello);&lt;br /&gt;
          p_window.addEventListener(&#039;keydown&#039;, l_greet.sayHelloOnEnter);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald das Modul „&amp;lt;code&amp;gt;app/greet&amp;lt;/code&amp;gt;“ ({{dh}} die Datei „&amp;lt;code&amp;gt;js/app5/greet.js&amp;lt;/code&amp;gt;“) vollständig geladen wurde,&lt;br /&gt;
wird ein Greet-Objekt erstellt und die Anwendung mit Hilfe des JSON-Objekts „&amp;lt;code&amp;gt;p_init&amp;lt;/code&amp;gt;“ initialisiert.&lt;br /&gt;
&lt;br /&gt;
====Das Modul „&amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;“====&lt;br /&gt;
&lt;br /&gt;
Das Modul „&amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;“ benötigt überhaupt keine anderen Module.&lt;br /&gt;
Daher ist die Moduldefinition noch etwas einfacher (die Liste mit benötigten Modulen entfällt ganz):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/** @module greet */&lt;br /&gt;
define&lt;br /&gt;
(function ()&lt;br /&gt;
 {  &amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * @class&lt;br /&gt;
     * @classdesc Contains methods to say hello to the user of the web app.&lt;br /&gt;
     *&lt;br /&gt;
     * @param p_document A DOM object (usually the global object &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;)&lt;br /&gt;
     * @param p_init A JSON object containing all init data.&lt;br /&gt;
     */&lt;br /&gt;
    function Greet(p_document, p_init)&lt;br /&gt;
    {&lt;br /&gt;
      var l_this = this; // this-hack&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Welcomes the user of the web app1 by displaying a welcome message&lt;br /&gt;
       * that includes his name. The name is fetched from a text input field.&lt;br /&gt;
       */&lt;br /&gt;
      l_this.sayHello =&lt;br /&gt;
        function ()&lt;br /&gt;
        {&lt;br /&gt;
          var l_elements = p_init.HTMLElements,&lt;br /&gt;
              l_text     = p_init.text,&lt;br /&gt;
              l_hidden   = p_init.css.hidden,&lt;br /&gt;
              l_name     = p_document.getElementById(l_elements.inputName).value;&lt;br /&gt;
&lt;br /&gt;
          p_document.getElementById(l_elements.welcome).innerHTML = l_text.welcome;&lt;br /&gt;
          p_document.getElementById(l_elements.hello).innerHTML   = l_text.hello.replace(&#039;$1&#039;, l_name);&lt;br /&gt;
          p_document.getElementById(l_elements.sectionHello).classList.remove(l_hidden);&lt;br /&gt;
          p_document.getElementById(l_elements.sectionForm).classList.add(l_hidden);&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * An keyboard event observer. It tests whether the enter key has been pressed.&lt;br /&gt;
       * If so, the greet method is activated. Default reactions of the browser are&lt;br /&gt;
       * disabled.&lt;br /&gt;
       *&lt;br /&gt;
       * @param {KeyboardEvent} p_event - A standard JavaScript keyboard event object&lt;br /&gt;
       *   (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent)&lt;br /&gt;
       */&lt;br /&gt;
      l_this.sayHelloOnEnter =&lt;br /&gt;
        function (p_event)&lt;br /&gt;
        {&lt;br /&gt;
          if ((p_event.code === &#039;Enter&#039; || p_event.keyCode === 13) &amp;amp;&amp;amp;&lt;br /&gt;
               p_document.activeElement ===&lt;br /&gt;
                 p_document.getElementById(p_init.HTMLElements.inputName)&lt;br /&gt;
             )&lt;br /&gt;
          {&lt;br /&gt;
            p_event.preventDefault();&lt;br /&gt;
            p_event.stopPropagation();&lt;br /&gt;
            l_this.sayHello();  // NOT this.sayHello();&lt;br /&gt;
          }&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return Greet;  // Return the constructor defined above.&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li value=&amp;quot;4&amp;quot;&amp;gt; {{Quelle|Kowarschick, W.: Multimedia-Programmierung}}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Kategorie: HTML5-Tutorium: JavaScript: Hello World]][[Kategorie: HTML5-Beispiel]][[Kategorie:Kapitel:Multimedia-Programmierung:Beispiele]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
→ &amp;lt;code&amp;gt;&amp;lt;/code&amp;gt; „&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;“&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yoshi</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=HTML5-Tutorium:_JavaScript:_Hello_World_01&amp;diff=41145</id>
		<title>HTML5-Tutorium: JavaScript: Hello World 01</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=HTML5-Tutorium:_JavaScript:_Hello_World_01&amp;diff=41145"/>
		<updated>2016-10-07T10:27:40Z</updated>

		<summary type="html">&lt;p&gt;Yoshi: /* Speichern der Web-Anwendung in einem Subversion-Repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{HTML5-Tutorium:JavaScript:HelloWorld:Menü}}&lt;br /&gt;
&#039;&#039;&#039;Musterlösung&#039;&#039;&#039;: [https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld01/index.html &amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;]&lt;br /&gt;
([https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld01/ SVN-Repository])&lt;br /&gt;
==Anwendungsfälle (Use Cases)==&lt;br /&gt;
Im ersten Teil dieses Tutoriums wird zunächst mit Hilfe der [[IDE]] (integrated development environment, Integrierte Entwicklungsumgebung) &lt;br /&gt;
[[WebStorm]] eine Web-Anwendung bestehend aus einem [[HTML]]-Dokument&lt;br /&gt;
erstellt.&lt;br /&gt;
&lt;br /&gt;
Das HTML-Dokument enthält als einzigen Inhalt eine Begrüßung der gesamten Welt.&lt;br /&gt;
&lt;br /&gt;
==WebStorm vorbereiten==&lt;br /&gt;
&lt;br /&gt;
Zur Erstellung der Anwendung wird [[Installation von WebStorm|WebStorm]] eingesetzt.&lt;br /&gt;
Zunächst müssen Sie diese IDE  [[Installation von WebStorm|installieren und konfigurieren]]. Es handelt sich um eine kommerzielle&lt;br /&gt;
Software, aber als Student erhalten Sie eine kostenlose Lizenz.&lt;br /&gt;
&lt;br /&gt;
==WebStorm starten==&lt;br /&gt;
&lt;br /&gt;
Nach dem Starten der IDE sehen Sie ein Menü mit drei Alternativen, ein Projekt zu bearbeiten: Sie können &lt;br /&gt;
eine neues Projekt erstellen, ein bestehendes Projekt öffnen oder ein bestehendes Projekt aus einem &lt;br /&gt;
Versionsverwaltungstool laden (&amp;lt;code&amp;gt;check out&amp;lt;/code&amp;gt;) und öffnen. &lt;br /&gt;
&lt;br /&gt;
Sie werden zunächst die erste Möglichkeit nutzen und ein neues Projekt erstellen. &lt;br /&gt;
Anschließend werden Sie die Musterlösung für dieses Projekt aus einem [[Subversion|SVN-Repository]] herunterladen.&lt;br /&gt;
&lt;br /&gt;
==Ein neues Projekt erstellen==&lt;br /&gt;
&lt;br /&gt;
Starten Sie WebStorm und klicken Sie auf „&amp;lt;code&amp;gt;Create New Project&amp;lt;/code&amp;gt;“.&lt;br /&gt;
Wählen Sie im linken Frame der Seite, die sich geöffnet hat, „&amp;lt;code&amp;gt;Empty Project&amp;lt;/code&amp;gt;“,&lt;br /&gt;
wählen Sie im Feld „&amp;lt;code&amp;gt;Location&amp;lt;/code&amp;gt;“ einen sinnvollen Pfad aus, wo auf Ihrem&lt;br /&gt;
Rechner Sie das Projekt speichern wollen ({{zB}} „&amp;lt;code&amp;gt;.../mmprog/hello_world/HelloWorld01&amp;lt;/code&amp;gt;“)&lt;br /&gt;
und klicken Sie anschließend auf „&amp;lt;code&amp;gt;Create&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Links sehen Sie nun ein senkrechtes Menü mit zwei Menüpunkten, „&amp;lt;code&amp;gt;Structure&amp;lt;/code&amp;gt;“&lt;br /&gt;
und „&amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt;“. (Wenn Sie dieses Menü nicht sehen, müssen Sie&lt;br /&gt;
auf das Icon unten links in der Leiste klicken. Damit wird das Menü eingeblendet.)&lt;br /&gt;
&lt;br /&gt;
Klicken Sie auf „&amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt;“. Es erscheint ein Dateibaum,&lt;br /&gt;
der alle Dateien Ihres Projektes enthält. Bislang gibt es nur das Wurzelverzeichnis mit dem Projektnamen&lt;br /&gt;
„&amp;lt;code&amp;gt;HelloWorld01&amp;lt;/code&amp;gt;“ sowie eine Systemdatei „&amp;lt;code&amp;gt;External Libraries&amp;lt;/code&amp;gt;“, die uns &lt;br /&gt;
derzeit nicht weiter interessiert.&lt;br /&gt;
&lt;br /&gt;
Klicken Sie mit der rechten Maus auf das Wurzelverzeichnis des Baumes und anschließend auf &amp;lt;code&amp;gt;New&amp;lt;/code&amp;gt;. &lt;br /&gt;
Es öffnet sich ein Drop-Down-Menü mit einer Auswahl an Dateien, die Sie erstellen können. &lt;br /&gt;
&lt;br /&gt;
Erstellen Sie eine HTML-Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ vom Typ „&amp;lt;code&amp;gt;HTML 5 file&amp;lt;/code&amp;gt;“.&lt;br /&gt;
In die HTML-Datei wurde von WebStorm folgender Code automatisch eingefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die erste Zeile legt den Typ der Datei fest. Diese Information benötigen dies Browser, damit &lt;br /&gt;
sie den nachfolgenden HTML-Code richtig interpretieren und [[Renderer|rendern]] können.&lt;br /&gt;
Mit „&amp;lt;code&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;/code&amp;gt;“ wird festgelegt, dass es sich um eine HTML5-Datei handelt. &lt;br /&gt;
Eine HTML-4.01-Datei, die die sich an die strengen HTML-4-Vorgaben hält („&amp;lt;code&amp;gt;strict&amp;lt;/code&amp;gt;“)&lt;br /&gt;
würde eine wesentlich komplexere Doctype-Angabe erfordern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE HTML PUBLIC&lt;br /&gt;
          &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot;&lt;br /&gt;
          &amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&lt;br /&gt;
&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt noch diverse weitere HTML-Varianten. Wir werden uns allerdings auf HTML5 konzentrieren.&lt;br /&gt;
&lt;br /&gt;
Die zweite und die letzte Zeile des Dokuments („&amp;lt;code&amp;gt;&amp;amp;lt;html lang=&amp;quot;en&amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/code&amp;gt;“)&lt;br /&gt;
begrenzen den eigentlichen HTML-Code. Das [[Attribut]] „&amp;lt;code&amp;gt;lang&amp;lt;/code&amp;gt;“ zeigt dem Browser an,&lt;br /&gt;
in welcher Sprache das Dokument verfasst ist. Wenn ein deutsches HTML-Dokument erstellt werden&lt;br /&gt;
soll, müssen Sie den Wert „&amp;lt;code&amp;gt;en&amp;lt;/code&amp;gt;“ (Englisch) in „&amp;lt;code&amp;gt;de&amp;lt;/code&amp;gt;“ (Deutsch) ändern.&lt;br /&gt;
Da es sich bei „Hello World“ jedoch um einen englischen Text handelt, ändern wir den Attributwert nicht.&lt;br /&gt;
&lt;br /&gt;
Innerhalb des öffnenden und des schließenden HTML-[[Tag]]s müssen die beiden wesentlichen Bereiche&lt;br /&gt;
eines HTML-Dokuments mit Inhalt gefüllt werden.&lt;br /&gt;
&lt;br /&gt;
Im Body-Bereich stehen die eigentlichen Inhalte, die dem Leser im Contentbereich&lt;br /&gt;
des Browsers angezeigt werden sollen. Da WebStorm keine Ahnung hat, was für Inhalte&lt;br /&gt;
präsentiert werden sollen, ist dieser Bereich noch leer.&lt;br /&gt;
&lt;br /&gt;
Im Head-Bereich stehen dagegen Informationen, die für den Browser zwar interessant sind, die &lt;br /&gt;
aber nicht gerendert und daher im Content-Bereich des Browsers nicht dargestellt werden müssen. Typische&lt;br /&gt;
Vertreter sind der Titel des Dokuments, der im Browser-Tab angezeigt wird, sowie die Zeichenkodierung&lt;br /&gt;
(UTF-8, ISO-8859-1, ASCII, ...). In HTML5 werden Zeichen standardmäßig in [[UTF-8]] kodiert.&lt;br /&gt;
In HTML 4 war noch [[ISO 8859-1]] Standard. In ISO 8859-1 (ISO Latin 1) gibt es maximal 256 Zeichen. &lt;br /&gt;
Davon sind 191 spezifiziert.&amp;lt;ref&amp;gt;[http://www.iso.org/iso/catalogue_detail?csnumber=28245 ISO/IEC 8859-1:1998]&amp;lt;/ref&amp;gt;&lt;br /&gt;
Mit UTF-8 können dagegen theoretisch über 4 Billionen Zeichen kodiert werden, praktisch werden aber (derzeit) &lt;br /&gt;
nur etwas mehr als eine Million Kodierungen als korrekt angesehen.&amp;lt;ref&amp;gt;[https://tools.ietf.org/html/rfc3629 Request for Comments 3629, UTF-8, &lt;br /&gt;
a transformation format of ISO 10646]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Die HTML-Datei mit Inhalten füllen==&lt;br /&gt;
&lt;br /&gt;
Im nächsten Schritt wird die von WebStorm erzeugte HTML-Datei mit Inhalten gefüllt.&lt;br /&gt;
Es wird ein Titel in Head-Bereich eingetragen. Im Body-Bereich fügen Sie bitte&lt;br /&gt;
eine Hauptüberschrift (heading, „&amp;lt;code&amp;gt;&amp;amp;lt;h1&amp;amp;gt;&amp;lt;/code&amp;gt;...&amp;lt;code&amp;gt;&amp;amp;lt;/h1&amp;amp;gt;&amp;lt;/code&amp;gt;“)  sowie&lt;br /&gt;
anschließend einen Absatz (paragraph, „&amp;lt;code&amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;lt;/code&amp;gt;...&amp;lt;code&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt;“)&lt;br /&gt;
mit sinnvollem Text ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;HelloWorld01&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;Hello, World!&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Welcome to Multimedia Programming!&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gewöhnen Sie sich an, ineinander verschachtelte Elemente der HTML-Datei ganz akribisch einzurücken.&#039;&#039;&#039;&lt;br /&gt;
Ein schließendes Tag steht entweder in derselben Zeile wie das öffnende Tag oder beide sind exakt gleich weit eingerückt.&lt;br /&gt;
Tag-Blöcke, die &#039;&#039;&#039;innerhalb von anderen Tags&#039;&#039;&#039; platziert werden, werden um &#039;&#039;&#039;zwei Leerzeichen&#039;&#039;&#039; weiter &#039;&#039;&#039;eingerückt&#039;&#039;&#039;, als ihre&lt;br /&gt;
Elterntags. Vier Leerzeichen, wie oft von der IDE vorgegeben, sind für größere, tief verschachtelte Dateien zu viel. (Eventuell ist&lt;br /&gt;
aber auch die Datei zu groß und daher zu tief verschachtelt. So etwas vermeiden Sie, wenn Sie strukturiert arbeiten.) &lt;br /&gt;
Eine Datei mit Programmcode sollte in der Regel nicht mehr als &lt;br /&gt;
80 Zeichen breit sein. Sonst leidet die Lesbarkeit zu sehr.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verwenden Sie im Programmcode niemals Tabulatorzeichen, sondern immer Leerzeichen.&#039;&#039;&#039; Für wie viele Leerzeichen ein&lt;br /&gt;
Tabulatorzeichen steht, ist nicht genormt. Das heißt, wenn eine Programmcode-Datei mit Tabulatorzeichen in einem&lt;br /&gt;
Text-Editor korrekt strukturiert wird, kann die Struktur derselben Datei in einem anderen Editor oder im Browser ({{zB}} bei einem Web-Zugriff&lt;br /&gt;
auf ein Repository eines Versionsverwaltungssystems) fehlerhaft sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fügen Sie nicht willkürlich Leerzeilen in den Code ein.&#039;&#039;&#039; Leerzeilen dienen ebenso wie Leerzeichen der Strukturierung&lt;br /&gt;
und können – geschickt eingesetzt – die [[Lesbarkeit]] des Codes verbessern oder – unstrukturiert eingestreut – verschlechtern.&lt;br /&gt;
&lt;br /&gt;
Alle drei der obigen Tipps sind für den Compiler oder den Interpreter eines Programmcodes vollkommen unerheblich.&lt;br /&gt;
Diese Werkzeuge kommen mit jedem syntaktisch korrektem Code zurecht. Die Tipps sind ausschließlich für Personen&lt;br /&gt;
wichtig, die den Code lesen müssen (Programmierer, Mitarbeiter der Qualitätssicherung, Studenten, &#039;&#039;&#039;Prüfer&#039;&#039;&#039; etc.). &lt;br /&gt;
Menschen können schlecht strukturierten Code viel schlechter lesen, als gut strukturierten Code.&lt;br /&gt;
&lt;br /&gt;
Folgende Variante des obigen Codes ist ebenfalls syntaktisch korrekt und wird vom Browser &lt;br /&gt;
in derselben Weise interpretiert und dargestellt. Aber lesbar ist diese Variante nur noch sehr eingeschränkt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;  &amp;lt;html lang&lt;br /&gt;
                         =&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;lt;meta&lt;br /&gt;
&lt;br /&gt;
  charset=                               &amp;quot;UTF-8&amp;quot;&amp;gt;&amp;lt;title&lt;br /&gt;
&amp;gt;HelloWorld01&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&lt;br /&gt;
&lt;br /&gt;
           &amp;gt;&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1   &amp;gt;Hello,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  World!&amp;lt;/h1&amp;gt;   &amp;lt;p&amp;gt;Welcome to Multimedia Programming!&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
                                                  &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BTW (By the way): Auch die Einrückungen des HTML5-Templates von WebStorm sind &lt;br /&gt;
nicht ganz korrekt. Eigentlich sollte der Code folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;HelloWorld01&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Hello, World!&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Welcome to Multimedia Programming!&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings ist es durchaus sinnvoll, nicht nur das &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Element sondern auch das &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;-Element und das &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Element&lt;br /&gt;
am Zeilenanfang beginnen zu lassen, da diese Elemente in jeder HTML-Datei mit Sicherheit jeweils genau einmal und&lt;br /&gt;
jedes mal auch an derselben Stellen (am Datei-Anfang, am Datei-Ende sowie einmal in der Datei-„Mitte“) vorkommen.&lt;br /&gt;
Dadurch wird die Datei um zwei Zeichen schmäler, was ebenfalls der Lesbarkeit zugute kommt.&lt;br /&gt;
&lt;br /&gt;
Fazit: Keine Regel ohne Ausnahme, aber Ausnahmen sollten begründet sein.&lt;br /&gt;
&lt;br /&gt;
==Start der Web-Anwendung==&lt;br /&gt;
&lt;br /&gt;
Um die zuvor erzeugte HTML-Datei in einem [[Browser]] ansehen zu können, &lt;br /&gt;
muss sie in das Dokument-Verzeichnis eines [[Web-Server]]s gelegt werden.&lt;br /&gt;
Dies ist normalerweise etwas umständlich, wenn der Web-Server nicht auf dem&lt;br /&gt;
Entwicklungsrechner läuft. Eine Möglichkeit wäre nun, auf dem Entwicklungsrechner,&lt;br /&gt;
also auf Ihrem Laptop oder PC, einen Server wie [[Apache]] oder [[Tomcat]] zu installieren.&lt;br /&gt;
Das ist aber für einfache HTML-Seiten nicht notwendig, {{dh}} für HTML-Seiten, die keinen [[Python]]-, [[PHP]]-, [[Java]]-, [[JavaScript]]- oder sonstigen Code&lt;br /&gt;
enthalten, der ausgeführt werden muss, &#039;&#039;&#039;bevor&#039;&#039;&#039; die Seite an den [[Client]] (Browser) &lt;br /&gt;
ausgeliefert wird. &lt;br /&gt;
&lt;br /&gt;
In diesem Tutorium werden nur HTML-Seiten erstellt, die [[JavaScript]]-Code enthalten. &lt;br /&gt;
Dieser Code soll nicht vom Server sondern vom Client ausgeführt werden,&lt;br /&gt;
&#039;&#039;&#039;nachdem&#039;&#039;&#039; die HTML-Seite (samt JavaScript-Code) an den Client übermittelt wurde.&lt;br /&gt;
Daher reicht uns ein ganz einfacher Server, der nichts weiter macht, als HTML-Seiten auszuliefern. &lt;br /&gt;
Ein derartiger Server ist in WebStorm bereits enthalten. Daher ist das Testen der Web-Anwendung ganz einfach.&lt;br /&gt;
&lt;br /&gt;
Klicken Sie im Dateibaum von WebStorm mit der rechten Maustaste auf „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“&lt;br /&gt;
und klicken Sie dann auf „&amp;lt;code&amp;gt;Run &#039;index.html&#039;&amp;lt;/code&amp;gt;“. Wenn man diesen Befehl erstmals ausgeführt hat,&lt;br /&gt;
erscheint in der Hauptmenüleiste von WebStorm ein Drop-Down-Menü mit ausführbaren Dateien sowie rechts&lt;br /&gt;
daneben ein grünes Dreieck als Icon, mit dem die im Menü selektierte Datei direkt gestartet werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Startbefehl hat zur Folge, dass ein lokaler Web-Server gestartet und die selektierte HTML-Datei in einem Browser&lt;br /&gt;
geöffnet wird. Welcher Browser dies ist, kann in WebStorm folgendermaßen festgelegt werden.&lt;br /&gt;
&lt;br /&gt;
# Im Dateibaum „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ selektieren.&lt;br /&gt;
# „&amp;lt;code&amp;gt;Run&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Edit Configurations...&amp;lt;/code&amp;gt;“ → Klick auf „&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;“ hinter dem Label „&amp;lt;code&amp;gt;Browser&amp;lt;/code&amp;gt;“ → Defaultbrowser festlegen&lt;br /&gt;
#Menü mit Klick auf „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“ verlassen.&lt;br /&gt;
&lt;br /&gt;
Wenn man anschließend in WebStorm Änderungen an der im Browser geöffneten Datei vornimmt, muss man nicht jedes mal die&lt;br /&gt;
Datei neu starten. Es reicht, im Browser den Reloadbutton zu drücken.&lt;br /&gt;
&lt;br /&gt;
Der von WebStorm gestartete Web-Server bedient diverse Browser, die sich auf dem Entwicklungsrechner befinden.&lt;br /&gt;
Wenn man dieselbe HTML-Datei in einem anderen Browser testen will, kann man dazu den URI im ersten Browser kopieren und in die URI-Leiste&lt;br /&gt;
des zweiten Browsers einfügen. WebStorm bemerkt, dass der URI in einem anderen Browser geöffnet werden soll und stellt dazu eine Sicherheitsanfrage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula&amp;quot;&amp;gt;&amp;lt;code&amp;gt;Copy authorization URL to clipboard&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man dies bestätigt enthält das Clipboard anschließend einen&lt;br /&gt;
URI, die man mit „&amp;lt;code&amp;gt;Strg-v&amp;lt;/code&amp;gt;“ als Ersatz für den zuerst eingefügte URI in den neuen Browser kopieren kann. &lt;br /&gt;
Dieser URI wird dann angezeigt und kann ebenfalls per Reload aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Man könnte die Seite sogar von einem anderen Device, wie {{zB}} einen Smartphone aus aufrufen. &lt;br /&gt;
Dies ist jedoch im WebStorm-Server standardmäßig aus Sicherheitsgründen&lt;br /&gt;
unterbunden.&lt;br /&gt;
&lt;br /&gt;
Schneller geht der Test mit einem anderen Browser, indem man die zu testende Datei im WebStorm-Editor-Fenster öffnet und mit der Maus in die&lt;br /&gt;
rechte obere Ecke dieses Fensters fährt. Irgendwann poppt in dieser Ecke in Menü mit fünf Browser-Icons auf. Durch einen Klick auf ein&lt;br /&gt;
Icon kann man die geöffnete Datei im gewünschten Browser testen.&lt;br /&gt;
&lt;br /&gt;
==Speichern der Web-Anwendung in einem Subversion-Repository==&lt;br /&gt;
&lt;br /&gt;
Nun ist es an der Zeit, die erste Version unserer Web-Anwendung in einem [[Repository]] (= digitales Archiv) eines&lt;br /&gt;
[[Versionsverwaltungssystem]]s (&#039;&#039;version control system&#039;&#039;, VCS) zu speichern. Hier wird &lt;br /&gt;
[[Subversion]] verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung&#039;&#039;&#039;: &amp;lt;i&amp;gt;Ich weiß, dass [[Git]] viel „cooler“ und „mächtiger“ ist als [[Subversion]]. Wenn Sie nicht&lt;br /&gt;
an der Lehrveranstaltung [[Lehrveranstaltung:IAM_2006:Multimedia-Anwendungen/Programmierung|Multimedia-Programmierung]] (MMProg)&lt;br /&gt;
teilnehmen, können Sie an Stelle von Subversion selbstverständlich auch [https://github.com/ GitHub] oder ein anderes Versionsverwaltungssystem verwenden, &lt;br /&gt;
um Ihre Projekte zu verwalten. Sie können aber auch Ihren eigenen Subversion-Server installieren, um die Tutorien „in voller Schönheit“ bearbeiten zu können: https://subversion.apache.org/packages.html. (Sie könnten sogar ganz darauf verzichten und Ihre Tutoriumslösungen nicht in einem&lt;br /&gt;
Versionsverwaltungssystem sichern. Davon rate ich aber ab.)&amp;lt;/i&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;i&amp;gt;Im Praktikum zur Lehrveranstaltung wird jedoch Subversion verwendet, da die Administration von Dutzenden &lt;br /&gt;
von Subversion-Accounts für den Dozenten wesentlich einfacher ist als die Verwaltung von entsprechenden Git-Accounts.&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Ihr Projekt in einem Subversion-Repository zu speichern, müssen Sie folgende Schritte ausführen:&lt;br /&gt;
&amp;lt;!--# Klick auf „&amp;lt;code&amp;gt;VCS&amp;lt;/code&amp;gt;“ in der Hauptmenüleiste&lt;br /&gt;
# Klick auf „&amp;lt;code&amp;gt;Enable Version Control Integration&amp;lt;/code&amp;gt;“--&amp;gt;&lt;br /&gt;
# „&amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt;“ auswählen&lt;br /&gt;
# Klick auf „&amp;lt;code&amp;gt;VCS&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Import into Version Control&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Share Project (Subversion)&amp;lt;/code&amp;gt;“&lt;br /&gt;
# Klick auf das Plus-Zeichen neben „&amp;lt;code&amp;gt;Point to repository location&amp;lt;/code&amp;gt;“&lt;br /&gt;
# Tragen Sie den URI Ihres Subversion-Repositories ein. Für MMProg-Teilnehmer lautet der URI „&amp;lt;code&amp;gt;https://praktikum.multimedia.hs-augsburg.de/svn/ACCOUNT/&amp;lt;/code&amp;gt;“, wobei die Zeichenkette „&amp;lt;code&amp;gt;ACCOUNT&amp;lt;/code&amp;gt;“ durch den eigenen RZ-Account ersetzt werden muss.&lt;br /&gt;
# Im darunterliegenden Fester erscheint ein neuer Eintrag mit dem URI des Repositories. Öffnen Sie diesen (Klick auf das Dreieckssymbol).&lt;br /&gt;
# Wenn Sie nach einer Kennung und einem Passwort gefragt werden, geben Sie die Daten Ihres Rechzentrumsaccounts an. Aktivieren Sie „&amp;lt;code&amp;gt;Save credentials&amp;lt;/code&amp;gt;“, ansonsten werden Sei bei jedem Zugriff auf das Repository erneut nach den Zugangsdaten gefragt. → „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“&lt;br /&gt;
#*Falls es bei MAC OS Probleme gibt, befolgen Sie folgende Schritte:&lt;br /&gt;
#**Klicken Sie links oben auf &amp;quot;Webstorm&amp;quot; dann &amp;quot;Preferences&amp;quot; dann &amp;quot;Version Control&amp;quot; dann &amp;quot;Subversion&amp;quot;&lt;br /&gt;
#**unter Reiter &amp;quot;Network&amp;quot; wählen Sie &amp;quot;TLSv1&amp;quot;&lt;br /&gt;
#**unter Reiter &amp;quot;General&amp;quot; klicken Sie auf Button &amp;quot;Clear Auth Cache&amp;quot;&lt;br /&gt;
#**danach starten Sie Webstorm neu&lt;br /&gt;
#*Falls es bei Windows Probleme gibt, befolgen Sie folgende Schritte:&lt;br /&gt;
#** Laden Sie Apache Subversion command line tools herunter: https://www.visualsvn.com/downloads/&lt;br /&gt;
#** Entpacken Sie den heruntergeladenen Ordner&lt;br /&gt;
#** In Webstorm gehen Sie dann auf &amp;quot;File&amp;quot; -&amp;gt; &amp;quot;Settings&amp;quot; -&amp;gt; &amp;quot;Version Control&amp;quot; -&amp;gt; &amp;quot;Subversion&amp;quot;&lt;br /&gt;
#** Wählen Sie unter &amp;quot;use command line client&amp;quot; im heruntergeladenen Ordner unter &amp;quot;bin&amp;quot; die &amp;quot;svn.exe&amp;quot; als neuen command line client aus.&lt;br /&gt;
# Fügen Sie ins Repository einen neuen Ordner namens „&amp;lt;code&amp;gt;mmprog&amp;lt;/code&amp;gt;“ ein:&lt;br /&gt;
## Rechtsklick auf den URI &lt;br /&gt;
## Klick auf „&amp;lt;code&amp;gt;New&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Remote Folder...&amp;lt;/code&amp;gt;“&lt;br /&gt;
## Geben Sie „&amp;lt;code&amp;gt;mmprog&amp;lt;/code&amp;gt;“ als Namen ein („&amp;lt;code&amp;gt;Remote folder name&amp;lt;/code&amp;gt;“)&lt;br /&gt;
## Klicken Sie auf „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“.&lt;br /&gt;
# Fügen sie auf dieselbe Weise den Unterordner „&amp;lt;code&amp;gt;praktikum&amp;lt;/code&amp;gt;“ in den Ordner „&amp;lt;code&amp;gt;mmprog&amp;lt;/code&amp;gt;“ ein.&lt;br /&gt;
# Selektieren Sie im Dateibaum des Repositories den neu angelegten Ordner „&amp;lt;code&amp;gt;praktikum&amp;lt;/code&amp;gt;“ durch Linksklick.&lt;br /&gt;
# Wählen Sie unter „&amp;lt;code&amp;gt;Define share target&amp;lt;/code&amp;gt;“ den zweiten Eintrag ({{dh}} denjenigen URI, der auf „&amp;lt;code&amp;gt;HelloWorld01&amp;lt;/code&amp;gt;“ endet (sofern Sie Ihr Projekt wie vorgeschlagen benannt haben).&lt;br /&gt;
# Klicken Sie auf „&amp;lt;code&amp;gt;Share&amp;lt;/code&amp;gt;“, um Ihr neu erstelltes Projekt im Repository anzulegen. &lt;br /&gt;
# Sie werden evtl.  gefragt, welches Subversion-Working-Copy-Format verwendet werden soll. Wählen Sie 1.8 (außer, Sie haben einen Uralt-Subversion-Server am Laufen).&lt;br /&gt;
# Klicken Sie auf „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“. &lt;br /&gt;
&lt;br /&gt;
Wenn daraufhin die Frage aufpoppt, ob Sie die Datei „&amp;lt;code&amp;gt;vcs.xml&amp;lt;/code&amp;gt;“ ebenfalls unter Versionskontrolle stellen wollen,&lt;br /&gt;
markieren Sie „&amp;lt;code&amp;gt;Remember, don&#039;t ask again&amp;lt;/code&amp;gt;“ und beantworten die Frage mit „&amp;lt;code&amp;gt;Yes&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist nun im gewählten Ordner des Subversion-Repositories angelegt worden, aber es wurden noch keine Daten auf den Server übertragen.&lt;br /&gt;
Die WebStorm-Ansicht hat sich ebenfalls geändert: Im Dateibaum des WebStorm-Projektes wurde die Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ grün eingefärbt&lt;br /&gt;
und in die Hauptmenü-Leiste von WebStorm sind zwei neue VCS-Icons eingetragen worden. Die beiden Icons ermöglichen eine schnellen Zugriff&lt;br /&gt;
auf die beiden wichtigsten Subversion-Befehle:&lt;br /&gt;
&lt;br /&gt;
* VCS, grüner Pfeil nach unten: &#039;&#039;Update Project&#039;&#039;&lt;br /&gt;
* VCS, grüner Pfeil nach oben: &#039;&#039;Commit Project&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mittels &#039;&#039;Commit Project&#039;&#039; werden Änderungen, die auf dem Entwicklungsrechner lokal vorgenommen wurden, ins Subversion-Repository übertragen. &lt;br /&gt;
Mittels &#039;&#039;Update Project&#039;&#039; werden Änderungen, die im Repository ({{iAllg}} auf einem anderen Rechner und/oder von einem anderen Entwickler) vorgenommen wurden, ins lokale Verzeichnis des Entwicklungsrechners übernommen. Es gibt noch diverse weitere Subversion-Befehle. Diese sind über den Dateibaum zugänglich:&lt;br /&gt;
&lt;br /&gt;
* Rechtsklick auf den Projektnamen im Dateibaum → Klick auf „&amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt;“&lt;br /&gt;
&lt;br /&gt;
Alle Dateien, die noch nicht im Repository enthalten sind (zurzeit sind noch überhaupt keine Daten darin enthalten), werden aufgelistet.&lt;br /&gt;
Neben der von Ihnen erstellten Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ gibt es noch einen Ordner namens „&amp;lt;code&amp;gt;.idea&amp;lt;/code&amp;gt;“, der WebStrom-spezifische Projekt-Dateien enthält.&lt;br /&gt;
Sie könnten theoretisch bestimmte Dateien deselektieren, um sie nicht ins Repository zu übertragen. Das wäre hier aber kontraproduktiv.&lt;br /&gt;
&lt;br /&gt;
Tragen Sie in das Feld „&amp;lt;code&amp;gt;Commit Message&amp;lt;/code&amp;gt;“ einen sinnvollen Änderungstext ein, wie&lt;br /&gt;
{{zB}} „&amp;lt;code&amp;gt;HelloWorld01 created.&amp;lt;/code&amp;gt;“ ein.&lt;br /&gt;
Klicken Sie dann auf „&amp;lt;code&amp;gt;Commit&amp;lt;/code&amp;gt;“ (dt.: &#039;&#039;übergeben&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Üblicherweise werden in Projekten englische Dateinamen, Variablenbezeichner, Kommentare (einschließlich Subversion-Kommentaren) &lt;br /&gt;
verwendet, um internationale Programmierer um Rat fragen (Diskussionsforen) oder sogar als Teammitglieder einstellen zu können.&lt;br /&gt;
&lt;br /&gt;
Die Farbe der Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ ändert sich bei einem erfolgreichen Commit abermals. Sie wird wieder schwarz.&lt;br /&gt;
Das bedeutet: Der Inhalt dieser Datei stimmt mit dem Inhalt der im Repository gespeicherten Version überein. &lt;br /&gt;
Sobald der Inhalt der lokalen Version der Datei geändert wird, wird der Dateiname blau eingefärbt.&lt;br /&gt;
Neue Dateien werden – wie bereits gesehen – grün eingefärbt.&lt;br /&gt;
Bei einem erneuten Commit werden alle geänderten Dateien abermals ins Subversion-Repository eingetragen.&lt;br /&gt;
Allerdings werden die Vorgängerversionen nicht gelöscht. Das heißt, im Repository sind alle Versionen &lt;br /&gt;
einer jeden Datei dauerhaft zugänglich. Auf diese können Sie {{zB}} mittels&lt;br /&gt;
&lt;br /&gt;
* Rechtsklick auf eine Datei im Dateibaum → Klick auf „&amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt;“ → Klick auf „&amp;lt;code&amp;gt;Show History&amp;lt;/code&amp;gt;“ &lt;br /&gt;
&lt;br /&gt;
zugreifen. Das heißt, es ist unnötig und sogar kontraproduktiv, lokale Versionen einer Datei anzulegen: „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“, „&amp;lt;code&amp;gt;index.html.v01&amp;lt;/code&amp;gt;“, „&amp;lt;code&amp;gt;index.html.v02&amp;lt;/code&amp;gt;“, ... &lt;br /&gt;
&lt;br /&gt;
Um verschiedene Versionen im Versionskontrollsystem unterscheiden zu können, sind die Kommentare, die Sie beim&lt;br /&gt;
Commit angeben, von fundamentaler Bedeutung. Vergessen Sie diese daher nicht und versuchen Sie jeweils die wesentlichen&lt;br /&gt;
Änderungen, die Sie an einer Datei vorgenommen haben, möglichst kurz und prägnant zu beschreiben (mittels eines Einzeilers).&lt;br /&gt;
&lt;br /&gt;
==Projekte aus einem Subversion-Repository laden==&lt;br /&gt;
&lt;br /&gt;
Projekte, die in einem Subversion-Repository gespeichert sind, können mit einem beliebigen [[Subversion/HowTo|Subversion-Client]] auf Ihren Rechner laden.&lt;br /&gt;
Sofern Sie Schreibrechte für das Repository haben, können Sie danach Ihre Änderungen auch wieder per Commit ins Repository einspielen.&lt;br /&gt;
&lt;br /&gt;
Damit ist Subversion (wie die meisten anderen Versionsverwaltungssysteme auch) sehr gut für Teamprojekte geeignet: &lt;br /&gt;
Zunächst muss ein Versionsverwaltungssysteme ({{dh}} Subversion-Repository) verfügbar sein,&lt;br /&gt;
auf das alle Teammitglieder lesend und schreibend zugreifen können.  Ein Teammitglied fügt ein neues Projekt in dieses System ein.&lt;br /&gt;
Alle anderen Teammitglieder laden dieses Projekt auf ihren jeweiligen Entwicklungsrechner. Jedes Mal, wenn ein Teammitglied eine&lt;br /&gt;
signifikante Änderung am Projekt vorgenommen hat, testet er diese ausgiebig, bereinigt evtl. noch vorhandene Fehler&lt;br /&gt;
und com­mit­tet diese Änderungen dann (nicht früher). Wenn sich jeder Entwickler mit seiner eigenen Kennung mit dem Versionsverwaltungssystem&lt;br /&gt;
verbindet, kann in der Änderungshistorie jederzeit nachgesehen werden, wer für welche Änderung verantwortlich ist.&lt;br /&gt;
Das ist insbesondere dann wichtig, wenn zwei Entwickler ohne Absprache denselben Code gleichzeitig ändern und committen&lt;br /&gt;
wollen. Dann kann es nämlich zu einem sogenannten Mergekonflikt kommen: Der Entwickler, der seine Änderungen&lt;br /&gt;
als Zweiter committen will, würde damit die Änderungen, die der erste Entwickler bereits committet hat, einfach überschreiben.&lt;br /&gt;
Das wird vom Versionsverwaltungssystem verhindert. Der zweite Entwickler muss den Mergekonflikt von Hand – aber mit Unterstützung des&lt;br /&gt;
Versionsverwaltungssystems – beheben.&lt;br /&gt;
&lt;br /&gt;
Um Mergekonflikte nach Möglichkeit zu vermeiden, ist die Modularisierung von Softwareprojekten, die im Teamarbeit erstellt werden,&lt;br /&gt;
von zentraler Bedeutung. Aber auch für Einzelentwickler ist der Einsatz eines Versionsverwaltungssystems vorteilhaft,&lt;br /&gt;
da er für alle wesentlichen Projektversionen stets einen Backup zur Verfügung hat. Da ein Versionsverwaltungstool &lt;br /&gt;
üblicherweise auf einem externen Server läuft, ist dieses Backup sogar räumlich vom Entwicklungsrechner getrennt.&lt;br /&gt;
&#039;&#039;&#039;Allerdings nützt das beste Versionsverwaltungstool nichts, wenn Sie nicht regelmäßig (getestete) Zwischenstände committen und damit dauerhaft abspeichern.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;In der Lehrveranstaltung [[Lehrveranstaltung:IAM_2006:Multimedia-Anwendungen/Programmierung|MMProg]], &lt;br /&gt;
für die dieses Tutorium entwickelt wurde, müssen sowohl Einzel- als auch Teamprojekte auf die zuvor beschriebene Weise realisiert werden.&amp;lt;/strong&amp;gt;&lt;br /&gt;
Daher soll das Laden eines bereits vorhandenen Projektes geübt werden. &lt;br /&gt;
&lt;br /&gt;
Für jedes Tutorium in diesem Wiki gibt es eine Musterlösung im Subversion-Repository „&amp;lt;code&amp;gt;https://glossar.hs-augsburg.de/beispiel&amp;lt;/code&amp;gt;“ des Wikis.&lt;br /&gt;
Die Musterlösung für das aktuelle Tutorium kopieren Sie folgendermaßen auf Ihren Rechner.&lt;br /&gt;
(Beachten Sie, dass Sie nur lesend auf das GlossWiki-Subversion-Repository zugreifen können. Das heißt, Sie können die Musterlösungen &lt;br /&gt;
nur lokal, aber nicht im GlossarWiki-Repository ändern.)&lt;br /&gt;
&lt;br /&gt;
Starten Sie WebStorm. Wenn der Startbildschirm mit den drei Möglichkeiten ein Projekt zu öffnen erschient, klicken Sie auf „&amp;lt;code&amp;gt;Check out from Version Control&amp;lt;/code&amp;gt;“.&lt;br /&gt;
Es öffnet sich ein Drop-Down-Menü mit diversen Versionsverwaltungssystemen ([[GitHub]], [[CVS]], [[Git]], [[Mercurial]] und [[Subversion]]) .&lt;br /&gt;
Sie wählen „&amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt;“ aus.&lt;br /&gt;
&lt;br /&gt;
Anderenfalls klicken Sie auf „&amp;lt;code&amp;gt;VCS&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Check out from Version Control&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen öffnet sich das schon bekannte Fenster mit einer Liste von verfügbaren Repositories.&lt;br /&gt;
Tragen Sie – sofern es nicht bereits vorhanden ist – mittels eines Klicks auf das Plus-Symbol&lt;br /&gt;
das Repository „&amp;lt;code&amp;gt;https://glossar.hs-augsburg.de/beispiel/&amp;lt;/code&amp;gt;“ in diese Liste ein.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie durch Klicks auf die Dreiecke vor dem jeweiligen Verzeichnis den Dateipfad&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;https://glossar.hs-augsburg.de/beispiel&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;tutorium&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;es5&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;hello_world&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;WK_HelloWorld01&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss sollte der Ordner „&amp;lt;code&amp;gt;WK_HelloWorld01&amp;lt;/code&amp;gt;“ selektiert sein.&lt;br /&gt;
Klicken Sie auf „&amp;lt;code&amp;gt;Checkout&amp;lt;/code&amp;gt;“, wählen Sie in dem Dateibrowser, der sich daraufhin öffnet,&lt;br /&gt;
einen geeignet Speicherort ({{zB}} neben aber nicht in(!) Ihrem eigenen Projekt „&amp;lt;code&amp;gt;HelloWorld01&amp;lt;/code&amp;gt;“)&lt;br /&gt;
und klicken Sie auf „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“. &lt;br /&gt;
&lt;br /&gt;
Daraufhin öffnet sich ein Fenster, in dem Sie festlegen sollen, in welchem Unterverzeichnis des zuvor gewählten Verzeichnisses&lt;br /&gt;
das Projekt lokal gespeichert soll („&amp;lt;code&amp;gt;Destination&amp;lt;/code&amp;gt;“). Wenn Sie zuvor das Elternverzeichnis gewählt haben, in dem auch Ihr Projekt&lt;br /&gt;
„&amp;lt;code&amp;gt;HelloWorld01&amp;lt;/code&amp;gt;“ liegt, sollten Sie den zweiten der angebotenen Pfade selektieren.&lt;br /&gt;
Anschließend klicken Sie abermals auf „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“, wählen das Format 1.8 und klicken zum dritten Mal  „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“. &lt;br /&gt;
Danach stellt Ihnen WebStorm noch zwei Fragen. Sie sollten das Projekt öffnen (erste Frage). Ob Sie im Gegenzug das zuvor geöffnete &lt;br /&gt;
Projekt schließen wollen oder nicht (zweite Frage), müssen Sie selbst entscheiden. &lt;br /&gt;
&lt;br /&gt;
Nun ist die Musterlösung lokal verfügbar. Sie können sie auf dieselbe Art wie ihr eigenes Projekt ansehen, ausführen und &#039;&#039;&#039;lokal&#039;&#039;&#039; ändern. &lt;br /&gt;
Ein Commit ist allerdings – wie bereits gesagt – nicht möglich. Versuchen Sie es ruhig.&lt;br /&gt;
&lt;br /&gt;
==Fortsetzung des Tutoriums==&lt;br /&gt;
&lt;br /&gt;
Sie sollten nun [[HTML5-Tutorium: JavaScript: Hello World 02|Teil 2 des Tutoriums]] bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li value=&amp;quot;3&amp;quot;&amp;gt; {{Quelle|Kowarschick, W.: Multimedia-Programmierung}}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Kategorie: HTML5-Tutorium: JavaScript: Hello World]][[Kategorie: HTML5-Beispiel]][[Kategorie:Kapitel:Multimedia-Programmierung:Beispiele]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yoshi</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=HTML5-Tutorium:_JavaScript:_Hello_World_01&amp;diff=41144</id>
		<title>HTML5-Tutorium: JavaScript: Hello World 01</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=HTML5-Tutorium:_JavaScript:_Hello_World_01&amp;diff=41144"/>
		<updated>2016-10-07T10:26:55Z</updated>

		<summary type="html">&lt;p&gt;Yoshi: /* Speichern der Web-Anwendung in einem Subversion-Repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{HTML5-Tutorium:JavaScript:HelloWorld:Menü}}&lt;br /&gt;
&#039;&#039;&#039;Musterlösung&#039;&#039;&#039;: [https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld01/index.html &amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;]&lt;br /&gt;
([https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld01/ SVN-Repository])&lt;br /&gt;
==Anwendungsfälle (Use Cases)==&lt;br /&gt;
Im ersten Teil dieses Tutoriums wird zunächst mit Hilfe der [[IDE]] (integrated development environment, Integrierte Entwicklungsumgebung) &lt;br /&gt;
[[WebStorm]] eine Web-Anwendung bestehend aus einem [[HTML]]-Dokument&lt;br /&gt;
erstellt.&lt;br /&gt;
&lt;br /&gt;
Das HTML-Dokument enthält als einzigen Inhalt eine Begrüßung der gesamten Welt.&lt;br /&gt;
&lt;br /&gt;
==WebStorm vorbereiten==&lt;br /&gt;
&lt;br /&gt;
Zur Erstellung der Anwendung wird [[Installation von WebStorm|WebStorm]] eingesetzt.&lt;br /&gt;
Zunächst müssen Sie diese IDE  [[Installation von WebStorm|installieren und konfigurieren]]. Es handelt sich um eine kommerzielle&lt;br /&gt;
Software, aber als Student erhalten Sie eine kostenlose Lizenz.&lt;br /&gt;
&lt;br /&gt;
==WebStorm starten==&lt;br /&gt;
&lt;br /&gt;
Nach dem Starten der IDE sehen Sie ein Menü mit drei Alternativen, ein Projekt zu bearbeiten: Sie können &lt;br /&gt;
eine neues Projekt erstellen, ein bestehendes Projekt öffnen oder ein bestehendes Projekt aus einem &lt;br /&gt;
Versionsverwaltungstool laden (&amp;lt;code&amp;gt;check out&amp;lt;/code&amp;gt;) und öffnen. &lt;br /&gt;
&lt;br /&gt;
Sie werden zunächst die erste Möglichkeit nutzen und ein neues Projekt erstellen. &lt;br /&gt;
Anschließend werden Sie die Musterlösung für dieses Projekt aus einem [[Subversion|SVN-Repository]] herunterladen.&lt;br /&gt;
&lt;br /&gt;
==Ein neues Projekt erstellen==&lt;br /&gt;
&lt;br /&gt;
Starten Sie WebStorm und klicken Sie auf „&amp;lt;code&amp;gt;Create New Project&amp;lt;/code&amp;gt;“.&lt;br /&gt;
Wählen Sie im linken Frame der Seite, die sich geöffnet hat, „&amp;lt;code&amp;gt;Empty Project&amp;lt;/code&amp;gt;“,&lt;br /&gt;
wählen Sie im Feld „&amp;lt;code&amp;gt;Location&amp;lt;/code&amp;gt;“ einen sinnvollen Pfad aus, wo auf Ihrem&lt;br /&gt;
Rechner Sie das Projekt speichern wollen ({{zB}} „&amp;lt;code&amp;gt;.../mmprog/hello_world/HelloWorld01&amp;lt;/code&amp;gt;“)&lt;br /&gt;
und klicken Sie anschließend auf „&amp;lt;code&amp;gt;Create&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Links sehen Sie nun ein senkrechtes Menü mit zwei Menüpunkten, „&amp;lt;code&amp;gt;Structure&amp;lt;/code&amp;gt;“&lt;br /&gt;
und „&amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt;“. (Wenn Sie dieses Menü nicht sehen, müssen Sie&lt;br /&gt;
auf das Icon unten links in der Leiste klicken. Damit wird das Menü eingeblendet.)&lt;br /&gt;
&lt;br /&gt;
Klicken Sie auf „&amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt;“. Es erscheint ein Dateibaum,&lt;br /&gt;
der alle Dateien Ihres Projektes enthält. Bislang gibt es nur das Wurzelverzeichnis mit dem Projektnamen&lt;br /&gt;
„&amp;lt;code&amp;gt;HelloWorld01&amp;lt;/code&amp;gt;“ sowie eine Systemdatei „&amp;lt;code&amp;gt;External Libraries&amp;lt;/code&amp;gt;“, die uns &lt;br /&gt;
derzeit nicht weiter interessiert.&lt;br /&gt;
&lt;br /&gt;
Klicken Sie mit der rechten Maus auf das Wurzelverzeichnis des Baumes und anschließend auf &amp;lt;code&amp;gt;New&amp;lt;/code&amp;gt;. &lt;br /&gt;
Es öffnet sich ein Drop-Down-Menü mit einer Auswahl an Dateien, die Sie erstellen können. &lt;br /&gt;
&lt;br /&gt;
Erstellen Sie eine HTML-Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ vom Typ „&amp;lt;code&amp;gt;HTML 5 file&amp;lt;/code&amp;gt;“.&lt;br /&gt;
In die HTML-Datei wurde von WebStorm folgender Code automatisch eingefügt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die erste Zeile legt den Typ der Datei fest. Diese Information benötigen dies Browser, damit &lt;br /&gt;
sie den nachfolgenden HTML-Code richtig interpretieren und [[Renderer|rendern]] können.&lt;br /&gt;
Mit „&amp;lt;code&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;/code&amp;gt;“ wird festgelegt, dass es sich um eine HTML5-Datei handelt. &lt;br /&gt;
Eine HTML-4.01-Datei, die die sich an die strengen HTML-4-Vorgaben hält („&amp;lt;code&amp;gt;strict&amp;lt;/code&amp;gt;“)&lt;br /&gt;
würde eine wesentlich komplexere Doctype-Angabe erfordern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE HTML PUBLIC&lt;br /&gt;
          &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot;&lt;br /&gt;
          &amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&lt;br /&gt;
&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es gibt noch diverse weitere HTML-Varianten. Wir werden uns allerdings auf HTML5 konzentrieren.&lt;br /&gt;
&lt;br /&gt;
Die zweite und die letzte Zeile des Dokuments („&amp;lt;code&amp;gt;&amp;amp;lt;html lang=&amp;quot;en&amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/code&amp;gt;“)&lt;br /&gt;
begrenzen den eigentlichen HTML-Code. Das [[Attribut]] „&amp;lt;code&amp;gt;lang&amp;lt;/code&amp;gt;“ zeigt dem Browser an,&lt;br /&gt;
in welcher Sprache das Dokument verfasst ist. Wenn ein deutsches HTML-Dokument erstellt werden&lt;br /&gt;
soll, müssen Sie den Wert „&amp;lt;code&amp;gt;en&amp;lt;/code&amp;gt;“ (Englisch) in „&amp;lt;code&amp;gt;de&amp;lt;/code&amp;gt;“ (Deutsch) ändern.&lt;br /&gt;
Da es sich bei „Hello World“ jedoch um einen englischen Text handelt, ändern wir den Attributwert nicht.&lt;br /&gt;
&lt;br /&gt;
Innerhalb des öffnenden und des schließenden HTML-[[Tag]]s müssen die beiden wesentlichen Bereiche&lt;br /&gt;
eines HTML-Dokuments mit Inhalt gefüllt werden.&lt;br /&gt;
&lt;br /&gt;
Im Body-Bereich stehen die eigentlichen Inhalte, die dem Leser im Contentbereich&lt;br /&gt;
des Browsers angezeigt werden sollen. Da WebStorm keine Ahnung hat, was für Inhalte&lt;br /&gt;
präsentiert werden sollen, ist dieser Bereich noch leer.&lt;br /&gt;
&lt;br /&gt;
Im Head-Bereich stehen dagegen Informationen, die für den Browser zwar interessant sind, die &lt;br /&gt;
aber nicht gerendert und daher im Content-Bereich des Browsers nicht dargestellt werden müssen. Typische&lt;br /&gt;
Vertreter sind der Titel des Dokuments, der im Browser-Tab angezeigt wird, sowie die Zeichenkodierung&lt;br /&gt;
(UTF-8, ISO-8859-1, ASCII, ...). In HTML5 werden Zeichen standardmäßig in [[UTF-8]] kodiert.&lt;br /&gt;
In HTML 4 war noch [[ISO 8859-1]] Standard. In ISO 8859-1 (ISO Latin 1) gibt es maximal 256 Zeichen. &lt;br /&gt;
Davon sind 191 spezifiziert.&amp;lt;ref&amp;gt;[http://www.iso.org/iso/catalogue_detail?csnumber=28245 ISO/IEC 8859-1:1998]&amp;lt;/ref&amp;gt;&lt;br /&gt;
Mit UTF-8 können dagegen theoretisch über 4 Billionen Zeichen kodiert werden, praktisch werden aber (derzeit) &lt;br /&gt;
nur etwas mehr als eine Million Kodierungen als korrekt angesehen.&amp;lt;ref&amp;gt;[https://tools.ietf.org/html/rfc3629 Request for Comments 3629, UTF-8, &lt;br /&gt;
a transformation format of ISO 10646]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Die HTML-Datei mit Inhalten füllen==&lt;br /&gt;
&lt;br /&gt;
Im nächsten Schritt wird die von WebStorm erzeugte HTML-Datei mit Inhalten gefüllt.&lt;br /&gt;
Es wird ein Titel in Head-Bereich eingetragen. Im Body-Bereich fügen Sie bitte&lt;br /&gt;
eine Hauptüberschrift (heading, „&amp;lt;code&amp;gt;&amp;amp;lt;h1&amp;amp;gt;&amp;lt;/code&amp;gt;...&amp;lt;code&amp;gt;&amp;amp;lt;/h1&amp;amp;gt;&amp;lt;/code&amp;gt;“)  sowie&lt;br /&gt;
anschließend einen Absatz (paragraph, „&amp;lt;code&amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;lt;/code&amp;gt;...&amp;lt;code&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt;“)&lt;br /&gt;
mit sinnvollem Text ein.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;HelloWorld01&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;Hello, World!&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Welcome to Multimedia Programming!&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gewöhnen Sie sich an, ineinander verschachtelte Elemente der HTML-Datei ganz akribisch einzurücken.&#039;&#039;&#039;&lt;br /&gt;
Ein schließendes Tag steht entweder in derselben Zeile wie das öffnende Tag oder beide sind exakt gleich weit eingerückt.&lt;br /&gt;
Tag-Blöcke, die &#039;&#039;&#039;innerhalb von anderen Tags&#039;&#039;&#039; platziert werden, werden um &#039;&#039;&#039;zwei Leerzeichen&#039;&#039;&#039; weiter &#039;&#039;&#039;eingerückt&#039;&#039;&#039;, als ihre&lt;br /&gt;
Elterntags. Vier Leerzeichen, wie oft von der IDE vorgegeben, sind für größere, tief verschachtelte Dateien zu viel. (Eventuell ist&lt;br /&gt;
aber auch die Datei zu groß und daher zu tief verschachtelt. So etwas vermeiden Sie, wenn Sie strukturiert arbeiten.) &lt;br /&gt;
Eine Datei mit Programmcode sollte in der Regel nicht mehr als &lt;br /&gt;
80 Zeichen breit sein. Sonst leidet die Lesbarkeit zu sehr.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verwenden Sie im Programmcode niemals Tabulatorzeichen, sondern immer Leerzeichen.&#039;&#039;&#039; Für wie viele Leerzeichen ein&lt;br /&gt;
Tabulatorzeichen steht, ist nicht genormt. Das heißt, wenn eine Programmcode-Datei mit Tabulatorzeichen in einem&lt;br /&gt;
Text-Editor korrekt strukturiert wird, kann die Struktur derselben Datei in einem anderen Editor oder im Browser ({{zB}} bei einem Web-Zugriff&lt;br /&gt;
auf ein Repository eines Versionsverwaltungssystems) fehlerhaft sein.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fügen Sie nicht willkürlich Leerzeilen in den Code ein.&#039;&#039;&#039; Leerzeilen dienen ebenso wie Leerzeichen der Strukturierung&lt;br /&gt;
und können – geschickt eingesetzt – die [[Lesbarkeit]] des Codes verbessern oder – unstrukturiert eingestreut – verschlechtern.&lt;br /&gt;
&lt;br /&gt;
Alle drei der obigen Tipps sind für den Compiler oder den Interpreter eines Programmcodes vollkommen unerheblich.&lt;br /&gt;
Diese Werkzeuge kommen mit jedem syntaktisch korrektem Code zurecht. Die Tipps sind ausschließlich für Personen&lt;br /&gt;
wichtig, die den Code lesen müssen (Programmierer, Mitarbeiter der Qualitätssicherung, Studenten, &#039;&#039;&#039;Prüfer&#039;&#039;&#039; etc.). &lt;br /&gt;
Menschen können schlecht strukturierten Code viel schlechter lesen, als gut strukturierten Code.&lt;br /&gt;
&lt;br /&gt;
Folgende Variante des obigen Codes ist ebenfalls syntaktisch korrekt und wird vom Browser &lt;br /&gt;
in derselben Weise interpretiert und dargestellt. Aber lesbar ist diese Variante nur noch sehr eingeschränkt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;  &amp;lt;html lang&lt;br /&gt;
                         =&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;lt;meta&lt;br /&gt;
&lt;br /&gt;
  charset=                               &amp;quot;UTF-8&amp;quot;&amp;gt;&amp;lt;title&lt;br /&gt;
&amp;gt;HelloWorld01&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&lt;br /&gt;
&lt;br /&gt;
           &amp;gt;&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1   &amp;gt;Hello,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  World!&amp;lt;/h1&amp;gt;   &amp;lt;p&amp;gt;Welcome to Multimedia Programming!&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
                                                  &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BTW (By the way): Auch die Einrückungen des HTML5-Templates von WebStorm sind &lt;br /&gt;
nicht ganz korrekt. Eigentlich sollte der Code folgendermaßen aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;HelloWorld01&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Hello, World!&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Welcome to Multimedia Programming!&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings ist es durchaus sinnvoll, nicht nur das &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Element sondern auch das &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;-Element und das &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Element&lt;br /&gt;
am Zeilenanfang beginnen zu lassen, da diese Elemente in jeder HTML-Datei mit Sicherheit jeweils genau einmal und&lt;br /&gt;
jedes mal auch an derselben Stellen (am Datei-Anfang, am Datei-Ende sowie einmal in der Datei-„Mitte“) vorkommen.&lt;br /&gt;
Dadurch wird die Datei um zwei Zeichen schmäler, was ebenfalls der Lesbarkeit zugute kommt.&lt;br /&gt;
&lt;br /&gt;
Fazit: Keine Regel ohne Ausnahme, aber Ausnahmen sollten begründet sein.&lt;br /&gt;
&lt;br /&gt;
==Start der Web-Anwendung==&lt;br /&gt;
&lt;br /&gt;
Um die zuvor erzeugte HTML-Datei in einem [[Browser]] ansehen zu können, &lt;br /&gt;
muss sie in das Dokument-Verzeichnis eines [[Web-Server]]s gelegt werden.&lt;br /&gt;
Dies ist normalerweise etwas umständlich, wenn der Web-Server nicht auf dem&lt;br /&gt;
Entwicklungsrechner läuft. Eine Möglichkeit wäre nun, auf dem Entwicklungsrechner,&lt;br /&gt;
also auf Ihrem Laptop oder PC, einen Server wie [[Apache]] oder [[Tomcat]] zu installieren.&lt;br /&gt;
Das ist aber für einfache HTML-Seiten nicht notwendig, {{dh}} für HTML-Seiten, die keinen [[Python]]-, [[PHP]]-, [[Java]]-, [[JavaScript]]- oder sonstigen Code&lt;br /&gt;
enthalten, der ausgeführt werden muss, &#039;&#039;&#039;bevor&#039;&#039;&#039; die Seite an den [[Client]] (Browser) &lt;br /&gt;
ausgeliefert wird. &lt;br /&gt;
&lt;br /&gt;
In diesem Tutorium werden nur HTML-Seiten erstellt, die [[JavaScript]]-Code enthalten. &lt;br /&gt;
Dieser Code soll nicht vom Server sondern vom Client ausgeführt werden,&lt;br /&gt;
&#039;&#039;&#039;nachdem&#039;&#039;&#039; die HTML-Seite (samt JavaScript-Code) an den Client übermittelt wurde.&lt;br /&gt;
Daher reicht uns ein ganz einfacher Server, der nichts weiter macht, als HTML-Seiten auszuliefern. &lt;br /&gt;
Ein derartiger Server ist in WebStorm bereits enthalten. Daher ist das Testen der Web-Anwendung ganz einfach.&lt;br /&gt;
&lt;br /&gt;
Klicken Sie im Dateibaum von WebStorm mit der rechten Maustaste auf „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“&lt;br /&gt;
und klicken Sie dann auf „&amp;lt;code&amp;gt;Run &#039;index.html&#039;&amp;lt;/code&amp;gt;“. Wenn man diesen Befehl erstmals ausgeführt hat,&lt;br /&gt;
erscheint in der Hauptmenüleiste von WebStorm ein Drop-Down-Menü mit ausführbaren Dateien sowie rechts&lt;br /&gt;
daneben ein grünes Dreieck als Icon, mit dem die im Menü selektierte Datei direkt gestartet werden kann.&lt;br /&gt;
&lt;br /&gt;
Der Startbefehl hat zur Folge, dass ein lokaler Web-Server gestartet und die selektierte HTML-Datei in einem Browser&lt;br /&gt;
geöffnet wird. Welcher Browser dies ist, kann in WebStorm folgendermaßen festgelegt werden.&lt;br /&gt;
&lt;br /&gt;
# Im Dateibaum „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ selektieren.&lt;br /&gt;
# „&amp;lt;code&amp;gt;Run&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Edit Configurations...&amp;lt;/code&amp;gt;“ → Klick auf „&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;“ hinter dem Label „&amp;lt;code&amp;gt;Browser&amp;lt;/code&amp;gt;“ → Defaultbrowser festlegen&lt;br /&gt;
#Menü mit Klick auf „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“ verlassen.&lt;br /&gt;
&lt;br /&gt;
Wenn man anschließend in WebStorm Änderungen an der im Browser geöffneten Datei vornimmt, muss man nicht jedes mal die&lt;br /&gt;
Datei neu starten. Es reicht, im Browser den Reloadbutton zu drücken.&lt;br /&gt;
&lt;br /&gt;
Der von WebStorm gestartete Web-Server bedient diverse Browser, die sich auf dem Entwicklungsrechner befinden.&lt;br /&gt;
Wenn man dieselbe HTML-Datei in einem anderen Browser testen will, kann man dazu den URI im ersten Browser kopieren und in die URI-Leiste&lt;br /&gt;
des zweiten Browsers einfügen. WebStorm bemerkt, dass der URI in einem anderen Browser geöffnet werden soll und stellt dazu eine Sicherheitsanfrage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula&amp;quot;&amp;gt;&amp;lt;code&amp;gt;Copy authorization URL to clipboard&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man dies bestätigt enthält das Clipboard anschließend einen&lt;br /&gt;
URI, die man mit „&amp;lt;code&amp;gt;Strg-v&amp;lt;/code&amp;gt;“ als Ersatz für den zuerst eingefügte URI in den neuen Browser kopieren kann. &lt;br /&gt;
Dieser URI wird dann angezeigt und kann ebenfalls per Reload aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Man könnte die Seite sogar von einem anderen Device, wie {{zB}} einen Smartphone aus aufrufen. &lt;br /&gt;
Dies ist jedoch im WebStorm-Server standardmäßig aus Sicherheitsgründen&lt;br /&gt;
unterbunden.&lt;br /&gt;
&lt;br /&gt;
Schneller geht der Test mit einem anderen Browser, indem man die zu testende Datei im WebStorm-Editor-Fenster öffnet und mit der Maus in die&lt;br /&gt;
rechte obere Ecke dieses Fensters fährt. Irgendwann poppt in dieser Ecke in Menü mit fünf Browser-Icons auf. Durch einen Klick auf ein&lt;br /&gt;
Icon kann man die geöffnete Datei im gewünschten Browser testen.&lt;br /&gt;
&lt;br /&gt;
==Speichern der Web-Anwendung in einem Subversion-Repository==&lt;br /&gt;
&lt;br /&gt;
Nun ist es an der Zeit, die erste Version unserer Web-Anwendung in einem [[Repository]] (= digitales Archiv) eines&lt;br /&gt;
[[Versionsverwaltungssystem]]s (&#039;&#039;version control system&#039;&#039;, VCS) zu speichern. Hier wird &lt;br /&gt;
[[Subversion]] verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung&#039;&#039;&#039;: &amp;lt;i&amp;gt;Ich weiß, dass [[Git]] viel „cooler“ und „mächtiger“ ist als [[Subversion]]. Wenn Sie nicht&lt;br /&gt;
an der Lehrveranstaltung [[Lehrveranstaltung:IAM_2006:Multimedia-Anwendungen/Programmierung|Multimedia-Programmierung]] (MMProg)&lt;br /&gt;
teilnehmen, können Sie an Stelle von Subversion selbstverständlich auch [https://github.com/ GitHub] oder ein anderes Versionsverwaltungssystem verwenden, &lt;br /&gt;
um Ihre Projekte zu verwalten. Sie können aber auch Ihren eigenen Subversion-Server installieren, um die Tutorien „in voller Schönheit“ bearbeiten zu können: https://subversion.apache.org/packages.html. (Sie könnten sogar ganz darauf verzichten und Ihre Tutoriumslösungen nicht in einem&lt;br /&gt;
Versionsverwaltungssystem sichern. Davon rate ich aber ab.)&amp;lt;/i&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;i&amp;gt;Im Praktikum zur Lehrveranstaltung wird jedoch Subversion verwendet, da die Administration von Dutzenden &lt;br /&gt;
von Subversion-Accounts für den Dozenten wesentlich einfacher ist als die Verwaltung von entsprechenden Git-Accounts.&lt;br /&gt;
&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um Ihr Projekt in einem Subversion-Repository zu speichern, müssen Sie folgende Schritte ausführen:&lt;br /&gt;
&amp;lt;!--# Klick auf „&amp;lt;code&amp;gt;VCS&amp;lt;/code&amp;gt;“ in der Hauptmenüleiste&lt;br /&gt;
# Klick auf „&amp;lt;code&amp;gt;Enable Version Control Integration&amp;lt;/code&amp;gt;“--&amp;gt;&lt;br /&gt;
# „&amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt;“ auswählen&lt;br /&gt;
# Klick auf „&amp;lt;code&amp;gt;VCS&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Import into Version Control&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Share Project (Subversion)&amp;lt;/code&amp;gt;“&lt;br /&gt;
# Klick auf das Plus-Zeichen neben „&amp;lt;code&amp;gt;Point to repository location&amp;lt;/code&amp;gt;“&lt;br /&gt;
# Tragen Sie den URI Ihres Subversion-Repositories ein. Für MMProg-Teilnehmer lautet der URI „&amp;lt;code&amp;gt;https://praktikum.multimedia.hs-augsburg.de/svn/ACCOUNT/&amp;lt;/code&amp;gt;“, wobei die Zeichenkette „&amp;lt;code&amp;gt;ACCOUNT&amp;lt;/code&amp;gt;“ durch den eigenen RZ-Account ersetzt werden muss.&lt;br /&gt;
# Im darunterliegenden Fester erscheint ein neuer Eintrag mit dem URI des Repositories. Öffnen Sie diesen (Klick auf das Dreieckssymbol).&lt;br /&gt;
# Wenn Sie nach einer Kennung und einem Passwort gefragt werden, geben Sie die Daten Ihres Rechzentrumsaccounts an. Aktivieren Sie „&amp;lt;code&amp;gt;Save credentials&amp;lt;/code&amp;gt;“, ansonsten werden Sei bei jedem Zugriff auf das Repository erneut nach den Zugangsdaten gefragt. → „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“&lt;br /&gt;
#*Falls es bei MAC OS Probleme gibt, befolgen Sie folgende Schritte:&lt;br /&gt;
#**Klicken Sie links oben auf &amp;quot;Webstorm&amp;quot; dann &amp;quot;Preferences&amp;quot; dann &amp;quot;Version Control&amp;quot; dann &amp;quot;Subversion&amp;quot;&lt;br /&gt;
#**unter Reiter &amp;quot;Network&amp;quot; wählen Sie &amp;quot;TLSv1&amp;quot;&lt;br /&gt;
#**unter Reiter &amp;quot;General&amp;quot; klicken Sie auf Button &amp;quot;Clear Auth Cache&amp;quot;&lt;br /&gt;
#**danach starten Sie Webstorm neu&lt;br /&gt;
#*Falls es bei Windoes Probleme gibt, befolgen Sie folgende Schritte:&lt;br /&gt;
#** Laden Sie Apache Subversion command line tools herunter: https://www.visualsvn.com/downloads/&lt;br /&gt;
#** Entpacken Sie den heruntergeladenen Ordner&lt;br /&gt;
#** In Webstorm gehen Sie dann auf &amp;quot;File&amp;quot; -&amp;gt; &amp;quot;Settings&amp;quot; -&amp;gt; &amp;quot;Version Control&amp;quot; -&amp;gt; &amp;quot;Subversion&amp;quot;&lt;br /&gt;
#** Wählen Sie unter &amp;quot;use command line client&amp;quot; im heruntergeladenen Ordner unter &amp;quot;bin&amp;quot; die &amp;quot;svn.exe&amp;quot; als neuen command line client aus.&lt;br /&gt;
# Fügen Sie ins Repository einen neuen Ordner namens „&amp;lt;code&amp;gt;mmprog&amp;lt;/code&amp;gt;“ ein:&lt;br /&gt;
## Rechtsklick auf den URI &lt;br /&gt;
## Klick auf „&amp;lt;code&amp;gt;New&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Remote Folder...&amp;lt;/code&amp;gt;“&lt;br /&gt;
## Geben Sie „&amp;lt;code&amp;gt;mmprog&amp;lt;/code&amp;gt;“ als Namen ein („&amp;lt;code&amp;gt;Remote folder name&amp;lt;/code&amp;gt;“)&lt;br /&gt;
## Klicken Sie auf „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“.&lt;br /&gt;
# Fügen sie auf dieselbe Weise den Unterordner „&amp;lt;code&amp;gt;praktikum&amp;lt;/code&amp;gt;“ in den Ordner „&amp;lt;code&amp;gt;mmprog&amp;lt;/code&amp;gt;“ ein.&lt;br /&gt;
# Selektieren Sie im Dateibaum des Repositories den neu angelegten Ordner „&amp;lt;code&amp;gt;praktikum&amp;lt;/code&amp;gt;“ durch Linksklick.&lt;br /&gt;
# Wählen Sie unter „&amp;lt;code&amp;gt;Define share target&amp;lt;/code&amp;gt;“ den zweiten Eintrag ({{dh}} denjenigen URI, der auf „&amp;lt;code&amp;gt;HelloWorld01&amp;lt;/code&amp;gt;“ endet (sofern Sie Ihr Projekt wie vorgeschlagen benannt haben).&lt;br /&gt;
# Klicken Sie auf „&amp;lt;code&amp;gt;Share&amp;lt;/code&amp;gt;“, um Ihr neu erstelltes Projekt im Repository anzulegen. &lt;br /&gt;
# Sie werden evtl.  gefragt, welches Subversion-Working-Copy-Format verwendet werden soll. Wählen Sie 1.8 (außer, Sie haben einen Uralt-Subversion-Server am Laufen).&lt;br /&gt;
# Klicken Sie auf „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“. &lt;br /&gt;
&lt;br /&gt;
Wenn daraufhin die Frage aufpoppt, ob Sie die Datei „&amp;lt;code&amp;gt;vcs.xml&amp;lt;/code&amp;gt;“ ebenfalls unter Versionskontrolle stellen wollen,&lt;br /&gt;
markieren Sie „&amp;lt;code&amp;gt;Remember, don&#039;t ask again&amp;lt;/code&amp;gt;“ und beantworten die Frage mit „&amp;lt;code&amp;gt;Yes&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist nun im gewählten Ordner des Subversion-Repositories angelegt worden, aber es wurden noch keine Daten auf den Server übertragen.&lt;br /&gt;
Die WebStorm-Ansicht hat sich ebenfalls geändert: Im Dateibaum des WebStorm-Projektes wurde die Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ grün eingefärbt&lt;br /&gt;
und in die Hauptmenü-Leiste von WebStorm sind zwei neue VCS-Icons eingetragen worden. Die beiden Icons ermöglichen eine schnellen Zugriff&lt;br /&gt;
auf die beiden wichtigsten Subversion-Befehle:&lt;br /&gt;
&lt;br /&gt;
* VCS, grüner Pfeil nach unten: &#039;&#039;Update Project&#039;&#039;&lt;br /&gt;
* VCS, grüner Pfeil nach oben: &#039;&#039;Commit Project&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mittels &#039;&#039;Commit Project&#039;&#039; werden Änderungen, die auf dem Entwicklungsrechner lokal vorgenommen wurden, ins Subversion-Repository übertragen. &lt;br /&gt;
Mittels &#039;&#039;Update Project&#039;&#039; werden Änderungen, die im Repository ({{iAllg}} auf einem anderen Rechner und/oder von einem anderen Entwickler) vorgenommen wurden, ins lokale Verzeichnis des Entwicklungsrechners übernommen. Es gibt noch diverse weitere Subversion-Befehle. Diese sind über den Dateibaum zugänglich:&lt;br /&gt;
&lt;br /&gt;
* Rechtsklick auf den Projektnamen im Dateibaum → Klick auf „&amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt;“&lt;br /&gt;
&lt;br /&gt;
Alle Dateien, die noch nicht im Repository enthalten sind (zurzeit sind noch überhaupt keine Daten darin enthalten), werden aufgelistet.&lt;br /&gt;
Neben der von Ihnen erstellten Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ gibt es noch einen Ordner namens „&amp;lt;code&amp;gt;.idea&amp;lt;/code&amp;gt;“, der WebStrom-spezifische Projekt-Dateien enthält.&lt;br /&gt;
Sie könnten theoretisch bestimmte Dateien deselektieren, um sie nicht ins Repository zu übertragen. Das wäre hier aber kontraproduktiv.&lt;br /&gt;
&lt;br /&gt;
Tragen Sie in das Feld „&amp;lt;code&amp;gt;Commit Message&amp;lt;/code&amp;gt;“ einen sinnvollen Änderungstext ein, wie&lt;br /&gt;
{{zB}} „&amp;lt;code&amp;gt;HelloWorld01 created.&amp;lt;/code&amp;gt;“ ein.&lt;br /&gt;
Klicken Sie dann auf „&amp;lt;code&amp;gt;Commit&amp;lt;/code&amp;gt;“ (dt.: &#039;&#039;übergeben&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Üblicherweise werden in Projekten englische Dateinamen, Variablenbezeichner, Kommentare (einschließlich Subversion-Kommentaren) &lt;br /&gt;
verwendet, um internationale Programmierer um Rat fragen (Diskussionsforen) oder sogar als Teammitglieder einstellen zu können.&lt;br /&gt;
&lt;br /&gt;
Die Farbe der Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ ändert sich bei einem erfolgreichen Commit abermals. Sie wird wieder schwarz.&lt;br /&gt;
Das bedeutet: Der Inhalt dieser Datei stimmt mit dem Inhalt der im Repository gespeicherten Version überein. &lt;br /&gt;
Sobald der Inhalt der lokalen Version der Datei geändert wird, wird der Dateiname blau eingefärbt.&lt;br /&gt;
Neue Dateien werden – wie bereits gesehen – grün eingefärbt.&lt;br /&gt;
Bei einem erneuten Commit werden alle geänderten Dateien abermals ins Subversion-Repository eingetragen.&lt;br /&gt;
Allerdings werden die Vorgängerversionen nicht gelöscht. Das heißt, im Repository sind alle Versionen &lt;br /&gt;
einer jeden Datei dauerhaft zugänglich. Auf diese können Sie {{zB}} mittels&lt;br /&gt;
&lt;br /&gt;
* Rechtsklick auf eine Datei im Dateibaum → Klick auf „&amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt;“ → Klick auf „&amp;lt;code&amp;gt;Show History&amp;lt;/code&amp;gt;“ &lt;br /&gt;
&lt;br /&gt;
zugreifen. Das heißt, es ist unnötig und sogar kontraproduktiv, lokale Versionen einer Datei anzulegen: „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“, „&amp;lt;code&amp;gt;index.html.v01&amp;lt;/code&amp;gt;“, „&amp;lt;code&amp;gt;index.html.v02&amp;lt;/code&amp;gt;“, ... &lt;br /&gt;
&lt;br /&gt;
Um verschiedene Versionen im Versionskontrollsystem unterscheiden zu können, sind die Kommentare, die Sie beim&lt;br /&gt;
Commit angeben, von fundamentaler Bedeutung. Vergessen Sie diese daher nicht und versuchen Sie jeweils die wesentlichen&lt;br /&gt;
Änderungen, die Sie an einer Datei vorgenommen haben, möglichst kurz und prägnant zu beschreiben (mittels eines Einzeilers).&lt;br /&gt;
&lt;br /&gt;
==Projekte aus einem Subversion-Repository laden==&lt;br /&gt;
&lt;br /&gt;
Projekte, die in einem Subversion-Repository gespeichert sind, können mit einem beliebigen [[Subversion/HowTo|Subversion-Client]] auf Ihren Rechner laden.&lt;br /&gt;
Sofern Sie Schreibrechte für das Repository haben, können Sie danach Ihre Änderungen auch wieder per Commit ins Repository einspielen.&lt;br /&gt;
&lt;br /&gt;
Damit ist Subversion (wie die meisten anderen Versionsverwaltungssysteme auch) sehr gut für Teamprojekte geeignet: &lt;br /&gt;
Zunächst muss ein Versionsverwaltungssysteme ({{dh}} Subversion-Repository) verfügbar sein,&lt;br /&gt;
auf das alle Teammitglieder lesend und schreibend zugreifen können.  Ein Teammitglied fügt ein neues Projekt in dieses System ein.&lt;br /&gt;
Alle anderen Teammitglieder laden dieses Projekt auf ihren jeweiligen Entwicklungsrechner. Jedes Mal, wenn ein Teammitglied eine&lt;br /&gt;
signifikante Änderung am Projekt vorgenommen hat, testet er diese ausgiebig, bereinigt evtl. noch vorhandene Fehler&lt;br /&gt;
und com­mit­tet diese Änderungen dann (nicht früher). Wenn sich jeder Entwickler mit seiner eigenen Kennung mit dem Versionsverwaltungssystem&lt;br /&gt;
verbindet, kann in der Änderungshistorie jederzeit nachgesehen werden, wer für welche Änderung verantwortlich ist.&lt;br /&gt;
Das ist insbesondere dann wichtig, wenn zwei Entwickler ohne Absprache denselben Code gleichzeitig ändern und committen&lt;br /&gt;
wollen. Dann kann es nämlich zu einem sogenannten Mergekonflikt kommen: Der Entwickler, der seine Änderungen&lt;br /&gt;
als Zweiter committen will, würde damit die Änderungen, die der erste Entwickler bereits committet hat, einfach überschreiben.&lt;br /&gt;
Das wird vom Versionsverwaltungssystem verhindert. Der zweite Entwickler muss den Mergekonflikt von Hand – aber mit Unterstützung des&lt;br /&gt;
Versionsverwaltungssystems – beheben.&lt;br /&gt;
&lt;br /&gt;
Um Mergekonflikte nach Möglichkeit zu vermeiden, ist die Modularisierung von Softwareprojekten, die im Teamarbeit erstellt werden,&lt;br /&gt;
von zentraler Bedeutung. Aber auch für Einzelentwickler ist der Einsatz eines Versionsverwaltungssystems vorteilhaft,&lt;br /&gt;
da er für alle wesentlichen Projektversionen stets einen Backup zur Verfügung hat. Da ein Versionsverwaltungstool &lt;br /&gt;
üblicherweise auf einem externen Server läuft, ist dieses Backup sogar räumlich vom Entwicklungsrechner getrennt.&lt;br /&gt;
&#039;&#039;&#039;Allerdings nützt das beste Versionsverwaltungstool nichts, wenn Sie nicht regelmäßig (getestete) Zwischenstände committen und damit dauerhaft abspeichern.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;In der Lehrveranstaltung [[Lehrveranstaltung:IAM_2006:Multimedia-Anwendungen/Programmierung|MMProg]], &lt;br /&gt;
für die dieses Tutorium entwickelt wurde, müssen sowohl Einzel- als auch Teamprojekte auf die zuvor beschriebene Weise realisiert werden.&amp;lt;/strong&amp;gt;&lt;br /&gt;
Daher soll das Laden eines bereits vorhandenen Projektes geübt werden. &lt;br /&gt;
&lt;br /&gt;
Für jedes Tutorium in diesem Wiki gibt es eine Musterlösung im Subversion-Repository „&amp;lt;code&amp;gt;https://glossar.hs-augsburg.de/beispiel&amp;lt;/code&amp;gt;“ des Wikis.&lt;br /&gt;
Die Musterlösung für das aktuelle Tutorium kopieren Sie folgendermaßen auf Ihren Rechner.&lt;br /&gt;
(Beachten Sie, dass Sie nur lesend auf das GlossWiki-Subversion-Repository zugreifen können. Das heißt, Sie können die Musterlösungen &lt;br /&gt;
nur lokal, aber nicht im GlossarWiki-Repository ändern.)&lt;br /&gt;
&lt;br /&gt;
Starten Sie WebStorm. Wenn der Startbildschirm mit den drei Möglichkeiten ein Projekt zu öffnen erschient, klicken Sie auf „&amp;lt;code&amp;gt;Check out from Version Control&amp;lt;/code&amp;gt;“.&lt;br /&gt;
Es öffnet sich ein Drop-Down-Menü mit diversen Versionsverwaltungssystemen ([[GitHub]], [[CVS]], [[Git]], [[Mercurial]] und [[Subversion]]) .&lt;br /&gt;
Sie wählen „&amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt;“ aus.&lt;br /&gt;
&lt;br /&gt;
Anderenfalls klicken Sie auf „&amp;lt;code&amp;gt;VCS&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Check out from Version Control&amp;lt;/code&amp;gt;“ → „&amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen öffnet sich das schon bekannte Fenster mit einer Liste von verfügbaren Repositories.&lt;br /&gt;
Tragen Sie – sofern es nicht bereits vorhanden ist – mittels eines Klicks auf das Plus-Symbol&lt;br /&gt;
das Repository „&amp;lt;code&amp;gt;https://glossar.hs-augsburg.de/beispiel/&amp;lt;/code&amp;gt;“ in diese Liste ein.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie durch Klicks auf die Dreiecke vor dem jeweiligen Verzeichnis den Dateipfad&lt;br /&gt;
&amp;lt;div class=&amp;quot;formula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;https://glossar.hs-augsburg.de/beispiel&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;tutorium&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;es5&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;hello_world&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;WK_HelloWorld01&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss sollte der Ordner „&amp;lt;code&amp;gt;WK_HelloWorld01&amp;lt;/code&amp;gt;“ selektiert sein.&lt;br /&gt;
Klicken Sie auf „&amp;lt;code&amp;gt;Checkout&amp;lt;/code&amp;gt;“, wählen Sie in dem Dateibrowser, der sich daraufhin öffnet,&lt;br /&gt;
einen geeignet Speicherort ({{zB}} neben aber nicht in(!) Ihrem eigenen Projekt „&amp;lt;code&amp;gt;HelloWorld01&amp;lt;/code&amp;gt;“)&lt;br /&gt;
und klicken Sie auf „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“. &lt;br /&gt;
&lt;br /&gt;
Daraufhin öffnet sich ein Fenster, in dem Sie festlegen sollen, in welchem Unterverzeichnis des zuvor gewählten Verzeichnisses&lt;br /&gt;
das Projekt lokal gespeichert soll („&amp;lt;code&amp;gt;Destination&amp;lt;/code&amp;gt;“). Wenn Sie zuvor das Elternverzeichnis gewählt haben, in dem auch Ihr Projekt&lt;br /&gt;
„&amp;lt;code&amp;gt;HelloWorld01&amp;lt;/code&amp;gt;“ liegt, sollten Sie den zweiten der angebotenen Pfade selektieren.&lt;br /&gt;
Anschließend klicken Sie abermals auf „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“, wählen das Format 1.8 und klicken zum dritten Mal  „&amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;“. &lt;br /&gt;
Danach stellt Ihnen WebStorm noch zwei Fragen. Sie sollten das Projekt öffnen (erste Frage). Ob Sie im Gegenzug das zuvor geöffnete &lt;br /&gt;
Projekt schließen wollen oder nicht (zweite Frage), müssen Sie selbst entscheiden. &lt;br /&gt;
&lt;br /&gt;
Nun ist die Musterlösung lokal verfügbar. Sie können sie auf dieselbe Art wie ihr eigenes Projekt ansehen, ausführen und &#039;&#039;&#039;lokal&#039;&#039;&#039; ändern. &lt;br /&gt;
Ein Commit ist allerdings – wie bereits gesagt – nicht möglich. Versuchen Sie es ruhig.&lt;br /&gt;
&lt;br /&gt;
==Fortsetzung des Tutoriums==&lt;br /&gt;
&lt;br /&gt;
Sie sollten nun [[HTML5-Tutorium: JavaScript: Hello World 02|Teil 2 des Tutoriums]] bearbeiten.&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li value=&amp;quot;3&amp;quot;&amp;gt; {{Quelle|Kowarschick, W.: Multimedia-Programmierung}}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Kategorie: HTML5-Tutorium: JavaScript: Hello World]][[Kategorie: HTML5-Beispiel]][[Kategorie:Kapitel:Multimedia-Programmierung:Beispiele]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yoshi</name></author>
	</entry>
</feed>