<?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=Anmize8</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=Anmize8"/>
	<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/Spezial:Beitr%C3%A4ge/Anmize8"/>
	<updated>2026-07-17T21:21:44Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=35432</id>
		<title>JavaScript-Tutorium:Browser</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=35432"/>
		<updated>2014-11-09T10:49:12Z</updated>

		<summary type="html">&lt;p&gt;Anmize8: /* Löschen von Elementen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten bei der JavaScript-Entwicklung im Browser zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Einführung=&lt;br /&gt;
&lt;br /&gt;
==Native vs. Host==&lt;br /&gt;
&lt;br /&gt;
In einer JavaScript-Umgebung existieren immer zwei unterschiedliche Arten von Objekten und Funktionen.&lt;br /&gt;
&#039;&#039;&#039;Native Objekte&#039;&#039;&#039; werden von der JavaScript-Engine zur Verfügung gestellt und sind durch den ECMAScript-Standard abgedeckt.&lt;br /&gt;
&#039;&#039;&#039;Host-Objekte&#039;&#039;&#039; sind hingegen nicht zwingend standardisiert und werden von der Umgebung bereitgestellt.&lt;br /&gt;
Im Browser handelt es sich bei Host-Objekten um Schnittstellen für den Zugriff auf den Browser selbst und externe Geräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==HTML5-Standard==&lt;br /&gt;
&lt;br /&gt;
Das bedeuteut, dass obwohl die Sprache selbst dem ECMAScript-Standard folgt, musste man bis vor wenigen Jahren &lt;br /&gt;
noch davon ausgehen dass sich die verfügbaren APIs je nach Browser sehr stark unterscheiden können. &lt;br /&gt;
Durch die steigende Entwicklungsgeschwindigkeit der Browser-Hersteller und den allgemein akzeptierten &lt;br /&gt;
[https://html.spec.whatwg.org/multipage/ HTML5-Standard] verbessert sich diese Situation jedoch zunehmend. &lt;br /&gt;
&lt;br /&gt;
Heutzutage kann man davon ausgehen, dass jeweils die neuesten Versionen von Firefox, Chrome und Internet Explorer&lt;br /&gt;
die DOM-API und viele der neu verfassten HTML5-APIs bereits standardkonform unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inline Code vs. externe Dateien==&lt;br /&gt;
&lt;br /&gt;
Eine im Browser angezeigte Web-Seite besteht meist aus HTML, CSS und JavaScript, wobei nur HTML zwingend verlangt ist.&lt;br /&gt;
Der JavaScript-Code kümmert sich normalerweise um die dynamischen Aspekte, wie Interaktionen und das Nachladen von Inhalten.&lt;br /&gt;
&lt;br /&gt;
Beim Besuch einer Website lädt der Browser das HTML-Dokument unter der angegeben URL herunter und evaluiert es.&lt;br /&gt;
Das Dokument enthält dann wiederum optional Verweise auf CSS-Dateien, Bilder, JavaScript-Dateien und andere Medien.&lt;br /&gt;
Neben Verweisen auf externen JavaScript-Code kann das Dokument auch Inline-Code-Blöcke enthalten. &lt;br /&gt;
Ob es sich um externe Dateien oder Inline-Code handelt wirkt sich auf die Ladezeiten und das Caching des Browser aus, &lt;br /&gt;
die enthaltenen Anweisungen und Ausdrücke werden jedoch nicht davon beeinflusst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039; Die Reihenfolge der eingebunden Code-Blöcke und angegebenen Dateiverweise ist allerdings wichtig,&lt;br /&gt;
da diese ebenso die Reihenfolge der Code-Ausführung darstellt.&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Kontext==&lt;br /&gt;
&lt;br /&gt;
Für jede geladene Web-Seite, unabhängig davon ob sie im separaten Fenster oder als ein weiterer Tab angezeigt wird,&lt;br /&gt;
erzeugt der Browser einen separaten und isolierten JavaScript-Kontext, in dem der geladene Code ausgeführt wird.&lt;br /&gt;
Das bedeutet dass alle Objekte und Funktionen nur so lange am Leben sind bis die Seite neu geladen oder verlassen wird.&lt;br /&gt;
Ein Zugriff auf andere Seiten in anderen Fenstern oder Tabs ist aus Sicherheitsgründen nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Window=&lt;br /&gt;
&lt;br /&gt;
Das globale Objekt &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; referenziert alle im Browser verfügbaren Objekte und Werte als Eigenschaften (native und host).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.Object);&lt;br /&gt;
console.log(window.XMLHttpRequest);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf globale Eigenschaften ist es nicht notwendig explizit &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; zu schreiben. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Date == window.Date);&lt;br /&gt;
console.log(new Date());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht innerhalb von Funktionen deklarierten Variablen werden automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var globaleVariable = &#039;global&#039;;&lt;br /&gt;
var globaleFunktion = function() {};&lt;br /&gt;
console.log(window.globaleVariable);&lt;br /&gt;
console.log(window.globaleFunktion);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modifikation von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Da es sich um ein normales Objekt handelt können die meisten Eigenschaften modifiziert und auch gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Veränderungen von globalen Eigenschaften sind nicht sinnvoll und können schwerwiegende Fehler verursachen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.Object = {};&lt;br /&gt;
var objekt = new Object();&lt;br /&gt;
&lt;br /&gt;
delete window.Array;&lt;br /&gt;
var array = new Array();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt wird vom Browser mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Window&amp;lt;/code&amp;gt; erzeugt, welche auch global verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.constructor == window.Window);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Popups und Frames==&lt;br /&gt;
&lt;br /&gt;
Neben dem globalen Fenster-Objekt kann eine Web-Seite beliebig viele weitere &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekte enthalten.&lt;br /&gt;
Dabei handelt es sich dann entweder um durch Code erzeugte Popups oder aber um Frames (besser bekannt als iframes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.open(&#039;https://www.google.com&#039;, &#039;Google im Popup&#039;, &#039;width=400,height=300,resizable=yes&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frames können entweder durch das entsprechende HTML oder aber auch wie im Code gezeigt programmatisch erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
==Browser-Schnittstellen==&lt;br /&gt;
&lt;br /&gt;
Abgesehen von den nativen Objekten notwendigen Objekte enthält &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; wichtige Browser- und Geräte-Schinttstellen.&lt;br /&gt;
Dazu zählen zum Beispiel Funktionen um Dialoge im Browser zu öffnen oder aber sogar um Game-Controller zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name = window.prompt(&#039;Wie ist Ihr Name?&#039;);&lt;br /&gt;
window.alert(&#039;Hello &#039; + name);&lt;br /&gt;
window.alert(&#039;Die aktuelle Seite ist &#039; + window.innerWidth + &#039;px breit&#039;);&lt;br /&gt;
&lt;br /&gt;
console.log(window.Gamepad);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Liste der verfügbaren Eigenschaften finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/de/docs/DOM/window dieser] MDN-Seite.&lt;br /&gt;
In den folgenden Abschnitten werden exemplarisch ein paar wichtige Objekte im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Beispiel für Browser-Schnittstellen=&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; ist ein globales Objekt welches die aktuelle URL und ihre Bestandteile enthält und diese auch verändern kann.&lt;br /&gt;
Das Objekt wird analog zum &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Location&amp;lt;/code&amp;gt; erstellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.location.constructor == window.Location);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen der URL===&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaft &amp;lt;code&amp;gt;href&amp;lt;/code&amp;gt; enhtält die gesamte aktuelle URL. Alternativ kann auch &amp;lt;code&amp;gt;location.toString()&amp;lt;/code&amp;gt; genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.href);&lt;br /&gt;
console.log(location.toString());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einzelne Bestandteile der URL ermitteln zu können werden viele separate Eigenschaften bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.protocol);&lt;br /&gt;
console.log(location.host);&lt;br /&gt;
console.log(location.port);&lt;br /&gt;
console.log(location.pathname);&lt;br /&gt;
console.log(location.hash);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verändern der URL===&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften können nicht nur lesend genutzt werden, sondern auch um Änderungen an der aktuellen URL vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
Mit der Ausname von &amp;lt;code&amp;gt;location.hash&amp;lt;/code&amp;gt; führen Änderungen der Eigenschaften zum Verlassen der aktuellen Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.protocol = &#039;http&#039;;&lt;br /&gt;
location.port = &#039;8080&#039;;&lt;br /&gt;
location.hash = &#039;#anker&#039;;&lt;br /&gt;
location.href = &#039;https://www.google.com&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es ein paar Funktionen um die URL zu modifizieren oder aber die Seite neuzuladen:&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.assign(&#039;https://www.google.com&#039;);&lt;br /&gt;
location.reload(true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
Das globale &amp;lt;code&amp;gt;history&amp;lt;/code&amp;gt;-Objekt ermöglicht den programmatischen Zugriff auf den Browser-Verlauf.&lt;br /&gt;
Es werden Funktionen zur Verfügung gestellt um im Verlauf beliebig viele Schritte zurück und vorwärts zu gehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
history.back();&lt;br /&gt;
history.forward();&lt;br /&gt;
history.go(-3);&lt;br /&gt;
history.go(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Aus Sicherheitsgründen ist es nicht erlaubt auf Informationen einzelner Einträge im Verlauf zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
==Navigator==&lt;br /&gt;
&lt;br /&gt;
Für detaillierte Informationen über den aktuellen Client bzw. Browser existiert das &amp;lt;code&amp;gt;navigator&amp;lt;/code&amp;gt;-Objekt.&lt;br /&gt;
Die meistgenutzte Eigenschaft &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; ermöglicht das Feststellen des Browser-Herstellers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(navigator.userAgent);&lt;br /&gt;
console.log(navigator.battery);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Document Object Model=&lt;br /&gt;
&lt;br /&gt;
Im Browser können einem Fenster beliebig viele Dokumentenobjekte zugeordnet werden, mindestens aber ein Hauptdokument. &lt;br /&gt;
Das automatisch erstellte Hauptdokument wird über die globale Variable &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; zur Verfügung gestellt.&lt;br /&gt;
Die Schnittstelle für den Dokumentenzugriff wird durch das [http://www.w3.org/DOM/ Document Object Model] spezifiziert.&lt;br /&gt;
&lt;br /&gt;
==Objektmodell==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekt repräsentiert ein vom Browser interpretiertes HTML-Dokument als Objektmodell mit einer Baumstruktur.&lt;br /&gt;
Dabei werden Tags, Texte und Kommentare in Knoten umgewandelt, wobei Tag-Knoten wiederum Unterknoten haben können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&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;p&amp;gt;&lt;br /&gt;
      Text&lt;br /&gt;
      &amp;lt;!-- Kommentar --&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;Eingabe&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das oben dargestellte Markup wird bei der Interpretation durch den Browser in folgendes Objektmodell übersetzt:&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Knoten mit den Unterknoten &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;-Knoten mit dem Unterknoten &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;-Knoten mit einem Text-Unterknoten&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Knoten mit den Unterknoten &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;-Knoten mit einem Text-Unterknoten und einem Kommentar-Unterknoten&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;-Knoten&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Achtet man bei HTML auf eine korrekte Einrückung so ist das resultierende Objektmodell meist klar erkennbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Markup-Korrekturen===&lt;br /&gt;
&lt;br /&gt;
Es ist zu beachten, dass es sich beim Objektmodell &#039;&#039;&#039;nicht&#039;&#039;&#039; um ein eindeutiges Abbild des originalen Markups handelt.&lt;br /&gt;
Der Unterschied wird besonders deutlich wenn man das Resultat von folgendem invalidem HTML untersucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&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;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Tabelle&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Objektmodell fügt zwischen dem &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt;- und dem &amp;lt;code&amp;gt;tr&amp;lt;/code&amp;gt;-Knoten einen &amp;lt;code&amp;gt;tbody&amp;lt;/code&amp;gt;-Knoten ein damit das HTML valide wird.&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Im Browser kann man das Objektmodell einer Seite mit dem (DOM) Inspector der Entwicklerwerkzeuge betrachten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufbau von Dokumenten==&lt;br /&gt;
&lt;br /&gt;
===Node-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jeder Knoten innerhalb eines Dokumentenobjekts ist direkt oder indirekt abgeleitet vom &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Konstruktor/-Prototypen.&lt;br /&gt;
Mit Ausnahme des Dokumentenobjekts selbst wird allen Knoten ein Dokument zugeordnet durch die &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt;-Eigenschaft.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren hat jeder Knoten einen bestimmten numerischen Typen, welcher in der Eigenschaft &amp;lt;code&amp;gt;nodeType&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
Die folgende Liste enthält die gängigsten Typen von Dokumentenknoten denen man bei der Arbeit mit Dokumenten begegnet:&lt;br /&gt;
&lt;br /&gt;
* 1: ELEMENT_NODE&lt;br /&gt;
* 3: TEXT_NODE&lt;br /&gt;
* 8: COMMENT_NODE&lt;br /&gt;
* 9: DOCUMENT_NODE&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Referenz der Eigenschaften von Node-Objekten finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Web/API/Node dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
===Document-Objekte===&lt;br /&gt;
&lt;br /&gt;
Ein Dokument wird mit dem &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Konstruktor erzeugt und ist selbst keinem Dokument, jedoch einem Fenster zugeordnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.defaultView);&lt;br /&gt;
console.log(window == document.defaultView);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Dokument selbst repräsentiert kein HTML-Element, verweist aber auf das &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Element mit der Eigenschaft &amp;lt;code&amp;gt;documentElement&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;
console.log(document.documentElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktionen eines Dokuments ist es möglich neue &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekte zu erstellen, einzufügen und diese zu suchen.&lt;br /&gt;
===Element-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jedes HTML-Tag wird in einen Knoten übersetzt welcher mit dem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Konstruktor erzeugt wird.&lt;br /&gt;
Element-Objekte besitzen Schnittstellen um auf Eigenschaften eines HTML-Tags zuzugreifen und diese zu modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement.tagName);&lt;br /&gt;
console.log(document.documentElement.innerHTML);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie Dokumente können Element-Objekten weitere Node-Objekte als Unterknoten angehängt und nach ihnen gesucht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Comment-Objekte===&lt;br /&gt;
&lt;br /&gt;
HTML-Kommentare werden in Comment-Objekte umgewandelt welche mit dem &amp;lt;code&amp;gt;Comment&amp;lt;/code&amp;gt;-Konstruktor erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Text-Objekte===&lt;br /&gt;
&lt;br /&gt;
Texte werden in &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt;-Objekte umgewandelt, wobei auf diese auch durch übergeordnete Elemente zugegriffen werden kann.&lt;br /&gt;
Normalerweise wird bei der Anwendungsprogrammierung mit JavaScript nicht direkt mit Text-Knoten gearbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Neue Element-Objekte werden über die Schnittstelle eines &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekts unter der Angabe eines Tag-Namens erzeugt.&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
console.log(absatz.tagName);&lt;br /&gt;
console.log(absatz.nodeType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Erstellung wird das neue Element dem aufgerufenen Dokument als zugehörig markiert durch die Eigenschaft &amp;lt;code&amp;gt;ownerDocument&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;
&lt;br /&gt;
var block = document.createElement(&#039;div&#039;);&lt;br /&gt;
console.log(block.ownerDocument);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Schnittstelle eines Dokuments nicht mit HTML-Standards gekoppelt ist, können beliebige Tag-Namen vergeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var meinElement = document.createElement(&#039;mein-element&#039;);&lt;br /&gt;
console.log(meinElement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Suchen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Besonders wichtig bei der Arbeit mit Dokumenten ist die Suche von einzelnen oder mehreren Elementen.&lt;br /&gt;
Aufgrund dessen haben sich die Schnittstellen für die Suche im Browser über die letzten Jahre rapide verbessert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorgefertige Kriterien===&lt;br /&gt;
&lt;br /&gt;
Die Suche nach einem eindeutigen Element kann mithilfe einer ID ausgeführt werden, insofern das HTML-Element eine besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var inhalt = document.getElementById(&#039;inhalt&#039;);&lt;br /&gt;
console.log(inhalt);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einer Suche wird entweder das Dokument selbst oder aber ein beliebiges Element als Ausgangspunkt verwendet.Es wird dann jeweils immer nur unterhalb des Ausgangsknotens gesucht, was sich positiv auf die Performance auswirken kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var inhalt = document.getElementById(&#039;inhalt&#039;);&lt;br /&gt;
var kommentare = inhalt.getElementById(&#039;kommentare&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Werden Elemente einer bestimmten Art gesucht so kann der Tag-Name oder aber die HTML-Klasse als Kriterium genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var elemente = document.getElementsByTagName(&#039;body&#039;);&lt;br /&gt;
console.log(elemente);&lt;br /&gt;
&lt;br /&gt;
var kommentare = document.getElementsByClassName(&#039;kommentar&#039;);&lt;br /&gt;
console.log(kommentare.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Art von Suche wird eine &amp;lt;code&amp;gt;NodeList&amp;lt;/code&amp;gt; als Ergebnis zurückgeliefert, ein Array-artiges Objekt von Node-Elementen.Einzelne Elemente dieser Liste können entweder über eine Funktion oder aber über einen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.getElementsByTagName(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
console.log(absaetze.item(0));&lt;br /&gt;
console.log(absaetze.item(0) == absaetze[0]);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verweise===&lt;br /&gt;
Jedes Element verweist im Sinne einer Baumstruktur auf seine übergeordneten und untergeordneten Knoten und seine Nachbaren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.getElementsByTagName(&#039;body&#039;).item(0);&lt;br /&gt;
for (var i = 0; i &amp;lt; body.childNodes.length; i++) {&lt;br /&gt;
  console.log(body.childNodes[i]);&lt;br /&gt;
}&lt;br /&gt;
console.log(body.parentNode);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Referenzen können genutzt werden um sich durch das Dokument zu bewegen und bestimmte Elemente zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var container = [];&lt;br /&gt;
var absaetze = document.getElementsByTagName(&#039;p&#039;);&lt;br /&gt;
for (var i = 0; i &amp;lt; absaetze.length; i++) {&lt;br /&gt;
  container.push(absaetze[i].parentNode);&lt;br /&gt;
}&lt;br /&gt;
console.log(container);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CSS-Selektoren===&lt;br /&gt;
&lt;br /&gt;
Die Suche mithilfe von vorgefertigen Kriterien und Verweisen auf benachbarte Elemente hat gewisse Limitierungen.&lt;br /&gt;
Aufgrund dessen enstand durch bekannte Bibliotheken wie jQuery das Konzept von Query-Selektoren, welche heute als &lt;br /&gt;
[http://www.w3.org/TR/CSS2/selector.html CSS-Selektoren] standardisiert werden und in vielen Browser verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Eine CSS-Selektorgruppe beschreibt eine beliebige Menge an Kriterien, die auf ein oder mehrere HTML-Elemente zutrifft.&lt;br /&gt;
Der Name wurde so gewählt da CSS-Selektoren ebenso in Stylesheets genutzt werden um eine Menge an Elementen auszuwählen.&lt;br /&gt;
Aufgrund der Kombinierbarkeit einzelner CSS-Selektoren ergibt sich eine sehr mächtige Suchfunktionalität.&lt;br /&gt;
&lt;br /&gt;
Im Browser gibt zwei verschiedene Funktionen um Elemente mithilfe von CSS-Selektoren zu suchen:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelector&amp;lt;/code&amp;gt; liefert das erste Element zurück welches die Kriterien erfüllt&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelectorAll&amp;lt;/code&amp;gt; liefert alle Elemente zurück welche die Kriterien erfüllen in Form einer &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Liste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Mögliche Kriterien====&lt;br /&gt;
&lt;br /&gt;
Das einfachste Kriterium für einen CSS-Selektor ist die Angabe eines Tag-Namen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.querySelectorAll(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Angabe einer ID eines HTML-Elements erfolgt durch eine vorangestellte Raute (&amp;lt;code&amp;gt;#&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;
var inhalt = document.querySelector(&#039;#inhalt&#039;);&lt;br /&gt;
console.log(inhalt);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klassen-Selektoren werden durch einen vorangestellten Punkt (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) gekennzeichnet. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kommentare = document.querySelectorAll(&#039;.kommentar&#039;);&lt;br /&gt;
console.log(kommentare);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von eckigen Klammern (&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;) werden beliebige Attribute als Kriterium definiert.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var textFelder = document.querySelectorAll(&#039;[type=&amp;quot;text&amp;quot;]&#039;);&lt;br /&gt;
console.log(textFelder);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird kein Attributwert vergeben, wird lediglich auf die Existenz des Attributs geprüft.&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var versteckteElemente = document.querySelectorAll(&#039;[hidden]&#039;);&lt;br /&gt;
console.log(versteckteElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Mächtigkeit von CSS-Selektoren ergibt sich vor allem durch die beliebige Kombinationsmöglichkeiten von Selektoren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wichtigeKommentare = document.querySelectorAll(&#039;.kommentar.wichtig&#039;);&lt;br /&gt;
console.log(wichtigeKommentare);&lt;br /&gt;
var versteckteAbsaetze = document.querySelectorAll(&#039;p[hidden]&#039;);&lt;br /&gt;
console.log(textFelder);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist sogar möglich Kriterien für übergeordnete Elemente zu definieren indem man die Selektoren durch Leerzeichen trennt.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var versteckteElementeInnerhalbVonKommentaren = document.querySelectorAll(&#039;.kommentar [hidden]&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Komplexität einer CSS-Selektorgruppe beeinflusst die Performance einer Suche.&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine vollständige Erklärung der Funktionsweise von CSS-Selektoren ist nicht Ziel dieses Tutoriums.&lt;br /&gt;
Diese Einführung dient lediglich dazu ein grundsätzliches Verständnis für den Umgang mit Selektoren zu vermitteln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hinzufügen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Neu erstellte Elemente können im Dokument als untergeordnete Knoten mithilfe von &amp;lt;code&amp;gt;appendChild()&amp;lt;/code&amp;gt; eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
document.documentElement.appendChild(absatz);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dazu muss immer der künftig übergeordnete Knoten angesprochen werden wenn das Element an einer bestimmten Stelle landen soll.&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var absatz = document.querySelector(&#039;p&#039;);&lt;br /&gt;
var unterAbsatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
absatz.appendChild(unterAbsatz);    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modifizieren von Elementen==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der entsprechenden DOM-Schnittstellen können Text, Attribute sowie das Styling von Elementen beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
===Ändern von Text===&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt mit nur einem &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt;-Unterknoten stellt seinen Text über der Eigenschaft &amp;lt;code&amp;gt;textContent&amp;lt;/code&amp;gt; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var p = document.querySelector(&#039;p&#039;);&lt;br /&gt;
console.log(p.textContent);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Text kann über diese Eigenschaft nicht nur gelesen sondern ebenso beliebig modifiziert werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var p = document.querySelector(&#039;p&#039;);&lt;br /&gt;
p.textContent = &#039;Hallo Welt&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von HTML===&lt;br /&gt;
&lt;br /&gt;
Eine wesentlich mächtigere Weise um den Inhalt eines Elements zu beeinflussen stellt die Eigenschaft &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; dar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;Hallo Welt&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neben einfachen Text-Änderungen lässt sich mithilfe dieser Eigenschaft das gesamte enthaltene HTML beeinflussen.Anstatt also mithilfe der DOM-Schnittstelle einzelne Elemente zu erzeugen kann einfach Markup als Wert zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;p&amp;gt;Hallo &amp;lt;strong&amp;gt;Welt!&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von Attributen===&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die Attribute eines HTML-Elements gibt es die Funktionen &amp;lt;code&amp;gt;getAttribute()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;setAttribute()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Beide akzeptieren als erstes Argument den Namen des Attributs, der Setter akzeptiert außerdem einen zu setzenden Wert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
absatz.innerHTML = &#039;Tolle Website!&#039;;&lt;br /&gt;
absatz.setAttribute(&#039;class&#039;, &#039;kommentar&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(p);&lt;br /&gt;
&lt;br /&gt;
console.log(p.getAttribute(&#039;class&#039;));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kann mithilfe der Funktion &amp;lt;code&amp;gt;hasAttribute()&amp;lt;/code&amp;gt; nach der Existenz eines Attributs gefragt werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var eingabefeld = document.querySelector(&#039;input[type=text]&#039;);&lt;br /&gt;
console.log(&#039;Ist das Eingabefeld Pflicht? &#039; + eingabefeld.hasAttribute(&#039;required&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine besondere Häufigkeit bei Attributsänderungen ist das Hinzufügen und/oder Entfernen von Klassen.&lt;br /&gt;
Dafür gibt es in neueren Browsern die Liste &amp;lt;code&amp;gt;classList&amp;lt;/code&amp;gt; auf jedem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt, welche die Arbeit erleichtert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.querySelector(&#039;p&#039;);&lt;br /&gt;
absatz.classList.push(&#039;wichtig&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von CSS-Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
Neben dem Document Object Model existiert außerdem der [http://dev.w3.org/csswg/cssom/ CSS Object Model Standard] &lt;br /&gt;
welcher die Schnittstelle für den Zugriff auf CSS-Eigenschaften von DOM-Objekten standardisiert.&lt;br /&gt;
&lt;br /&gt;
Ein jedes DOM-Element vom Typ &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; besitzt eine Eigenschaft &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; welche alle CSS-Eigenschaften beherbergt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
console.log(body.style.color);&lt;br /&gt;
console.log(body.style.padding);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften spiegeln die in Stylesheets definierten Regeln wieder, jedoch inklusive dem kaskadierenden Charakter.Das heisst dass ein Element-Objekt nicht zwingend selbst eine &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt; besitzt, diese jedoch für die Anzeige vererbt bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaften können ebenso beliebig modifiziert werden, was zu einer sofortigen Anpassung der Darstellung führt. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.style.backgroundColor = &#039;#AAF&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Löschen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Ebenso wie neue Elemente einem Dokument hinzugefügt werden können, so können diese oder bestehende auch gelöscht werden.&lt;br /&gt;
Dazu muss man den übergeordneten Knoten ansteuern und mithilfe von &amp;lt;code&amp;gt;removeChild()&amp;lt;/code&amp;gt; die Entfernung durchführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var liste = document.querySelector(&#039;ul&#039;);&lt;br /&gt;
var listenelement = liste.querySelector(&#039;li&#039;);&lt;br /&gt;
liste.removeChild(listenelement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ist einem der übergeordnete Knoten nicht bekannt so kann man diesen mithilfe der Knotenverweise ermitteln.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var entferneKnoten = function(knoten) {&lt;br /&gt;
  if (!knoten.parentNode) {&lt;br /&gt;
    throw new Error(&#039;no parent node&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  knoten.parentNode.removeChild(knoten);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var listenelement = document.querySelector(&#039;li&#039;);&lt;br /&gt;
entferneKnoten(listenelement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=DOM Events=&lt;br /&gt;
&lt;br /&gt;
==Ereignisorientierte Programmierung==&lt;br /&gt;
&lt;br /&gt;
Für die Verarbeitung von stets verfügbaren Informationen eignet sich eine sequentiell ablaufende Folge von Instruktionen.&lt;br /&gt;
Ergeben sich Informationen jedoch nicht deterministisch zur Laufzeit bietet sich die ereignisorientierte Programmierung an.&lt;br /&gt;
Hierbei wird nicht mehr aktiv auf eine Information gewartet, das Programm wird benachrichtigt wenn ein Ereignis eintritt.&lt;br /&gt;
Somit gibt es nicht nur einen einzelnen Kontrollfluss, sondern beliebig viele welche sogar auch parallel ablaufen können.&lt;br /&gt;
&lt;br /&gt;
==Ereignisse im Browser==&lt;br /&gt;
&lt;br /&gt;
Bei der Betrachtung von und der Interaktion mit Websites im Browser ergeben sich sehr viele unterschiedliche Ereignisse.&lt;br /&gt;
Zunächst wird die HTML-Seite geladen und gerendert, danach geschieht dies für alle anderen referenzierten Medien.&lt;br /&gt;
Diese Vorgänge lösen bereits nicht deterministische Ereignisse aus welche alleine durch den Browser verursacht werden.&lt;br /&gt;
So gibt es für die meisten Medien ein Ereignis welches beschreibt dass diese fertig geladen und gerendert wurden.&lt;br /&gt;
&lt;br /&gt;
Sobald der Browser beginnt eine Web-Seite zu rendern können Ereignisse von Seiten des Benutzers eintreten.&lt;br /&gt;
Nahezu jede Benutzerinteraktion löst im Browser ein Ereignis aus welches wiederum in weiteren Aktionen resultiert.&lt;br /&gt;
Klickt der Benutzer auf einen Link so ist das ein Ereignis welches zur Folge hat dass die geklickte URL geladen wird.&lt;br /&gt;
Wird ein Scroll-Balken vom Benutzer bewegt ergibt sich daraus ein Ereignis welches den Browser in Folge scrollen lässt.&lt;br /&gt;
&lt;br /&gt;
Zu den wichtigsten Arten von durch den Benutzer ausgelösten Ereignissen zählen: &lt;br /&gt;
&lt;br /&gt;
* Mausbewegungen und -klicks&lt;br /&gt;
* Tastatureingaben&lt;br /&gt;
* Scrolling&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Auflistung der möglichen Ereignisse im Browser finden Sie auf [https://developer.mozilla.org/en-US/docs/Web/Events dieser] MDN-Seite. &lt;br /&gt;
Nebem dem Browser und dem Benutzer gibt es auch andere Auslöser wie zum Beispiel mit der Website verbundene Server/Backends. &lt;br /&gt;
&lt;br /&gt;
==Aufbau eines Ereignisses==&lt;br /&gt;
&lt;br /&gt;
Im Sinne einer standardisierten Ereignisverarbeitung besitzt ein im Browser auftretendes Ereignis immer drei folgende Merkmale: &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Name:&#039;&#039;&#039; eine Zeichenkette die das Ereignis in der Regel in der Gegenwart beschreibt, z.B. &amp;quot;click&amp;quot; oder &amp;quot;mousemove&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Daten:&#039;&#039;&#039; ein Objekt mit einer pro Ereignis festgelegten Struktur, welches die wichtigsten Ereignisdaten enthält&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Ziel:&#039;&#039;&#039; ein Objekt das als Ziel des Ereignis festgelegt wird; in der Regel handelt es sich um DOM-Elemente&lt;br /&gt;
&lt;br /&gt;
Beispiel für ein solches Ereignis: Eine &#039;&#039;&#039;Tastatureingabe&#039;&#039;&#039; in einem &#039;&#039;&#039;Formularfeld&#039;&#039;&#039;, bei dem das Zeichen &#039;&#039;&#039;@&#039;&#039;&#039; eingegeben wird. &lt;br /&gt;
&lt;br /&gt;
==Phasen der Ereignispropagierung==&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei dem ursprünglichen Ziel eines Ereignisses um ein DOM-Objekt werden in der Regel drei Phasen durchlaufen.&lt;br /&gt;
&lt;br /&gt;
===Capturing-Phase===&lt;br /&gt;
&lt;br /&gt;
In Phase 1, der sogenannten &#039;&#039;&#039;Capturing-Phase&#039;&#039;&#039; wird zuerst ein Ereignis mit dem obersten Knoten im Dokument als Ziel erzeugt.&lt;br /&gt;
Dabei handelt es sich in der Regel um das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt, welches alle andere DOM-Objekte als Unterknoten enthält.&lt;br /&gt;
Das wird schrittweise wiederholt für jeden untergeordneten Knoten auf dem Pfad zum eigentlichen Ziel des Ereignisses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
+ window (optional)         - Ereignis mit window als aktueller Ziel&lt;br /&gt;
  + document                - Ereignis mit body als aktueller Ziel&lt;br /&gt;
    + body                  - Ereignis mit body als aktueller Ziel&lt;br /&gt;
      + p (ursprüngliches Ziel)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Bei manchen Ereignissen wird das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als oberstes Objekt in die Hierarchie der Ziele mit aufgenommen.&lt;br /&gt;
&lt;br /&gt;
===Target-Phase===&lt;br /&gt;
&lt;br /&gt;
Ist der Browser nun beim ursprünglichen Ziel angelangt wird in Phase 2 gewechselt, der sogenannten &#039;&#039;&#039;Target-Phase&#039;&#039;&#039;.&lt;br /&gt;
Dabei wird ein einzelnes Ereignis erzeugt, für welches das ursprüngliche DOM-Objekt als Ziel verwendet wird.&lt;br /&gt;
&lt;br /&gt;
===Bubbling-Phase===&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss der Ereignispropagierung wechselt der Browser in Phase 3, der sogenannten &#039;&#039;&#039;Bubbling-Phase&#039;&#039;&#039;.&lt;br /&gt;
Hierbei wird der Pfad der Capturing-Phase in umgekehrter Richtung durchlaufen und jeweils wieder ein Ereignis erzeugt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In Bibliotheken wie jQuery hat man nur Zugriff auf die Bubbling-Phase, nicht auf die Capturing-Phase.&lt;br /&gt;
&lt;br /&gt;
===Browser-Unterschiede===&lt;br /&gt;
&lt;br /&gt;
Die Capturing- und Bubbling-Phasen bilden in ihrer Implementierung die Tatsache ab dass &lt;br /&gt;
wenn ein Ereignis auf einem Element stattfindet, dieses Ereignis ebenso für das Element umgebende Elemente gültig ist.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Wird ein Mensch in einem Krankenhaus geboren, so wird dieser auch in einer Stadt geboren, in einem Land geboren.&lt;br /&gt;
&lt;br /&gt;
Einer der beiden oben beschriebenen Phasen wäre allerdings vollkommen ausreichend für die Ereignisvearbeitung.&lt;br /&gt;
Aufgrund von unterschiedlichen Implementierungen der Browser-Hersteller existieren heutzutage jedoch beide gleichzeitig.&lt;br /&gt;
&lt;br /&gt;
===Globale Ereignisse===&lt;br /&gt;
&lt;br /&gt;
Beschreibt ein Ereignis ein globales Geschehen wird oftmals das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als Ereignisziel verwendet.&lt;br /&gt;
In diesen Fällen ist es möglich dass weder Capturing- noch eine Bubbling-Phase durchlaufen werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Das Ergeinis &amp;quot;DOMContentLoaded&amp;quot; beschreibt, dass eine Seite abgesehen siner externen Medien fertig geladen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisverarbeitung==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der DOM-Schnittstelle erhält man die Möglichkeit Ereignisse selbst zu verarbeiten und darauf zu reagieren.&lt;br /&gt;
&lt;br /&gt;
===Anmeldung===&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt; kann auf jedem DOM-Objekt, dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt und dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt aufgerufen werden.&lt;br /&gt;
Dabei ist das Objekt auf dem die Funktion aufgerufen das &#039;&#039;&#039;Ziel&#039;&#039;&#039; des Ereignisses welches verarbeiten werden soll.&lt;br /&gt;
&lt;br /&gt;
Die Funktion akzeptiert außerdem die folgenden drei Argumente: &lt;br /&gt;
* den &#039;&#039;&#039;Namen des Ereignisses&#039;&#039;&#039; das man verarbeiten möchte in Form eines Strings&lt;br /&gt;
* die &#039;&#039;&#039;Callback-Funktion&#039;&#039;&#039; welche das Ereignis-Objekt erwartet und den Code zur Verarbeitung enthält&lt;br /&gt;
* ein optionales &#039;&#039;&#039;Flag&#039;&#039;&#039; das bestimmt ob das Ereignis in der Capturing- oder Bubbling-Phase verarbeitet werden soll&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist das Flag &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, was bedeutet dass das Ereignis in der Bubbling-Phase verarbeitet wird.&lt;br /&gt;
Durch einen Aufruf wird für ein Ereignis auf einem Ziel ein sogenannter Event-Listener in Form einer Funktion angemeldet.&lt;br /&gt;
Jedes Mal wenn das Ereignis auftritt wird die Callback-Funktion aufgerufen und das entsprechende Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichWennSeiteGeladenIst = function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite ist nun fertig geladen&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
}&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, informiereMichWennSeiteGeladenIst, false);&lt;br /&gt;
&lt;br /&gt;
document.querySelector(&#039;body&#039;).innerHTML = &#039;&amp;lt;p&amp;gt;&amp;lt;a id=&amp;quot;link1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
var link = document.querySelector(&#039;#link1&#039;);&lt;br /&gt;
var informiereMichWennLinkGeklicktWird = function(event) {&lt;br /&gt;
  console.log(&#039;Der Link wurde geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
link.addEventListener(&#039;click&#039;, informiereMichWennLinkGeklicktWird);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Phasen der Ereignispropagierung kann man Ereignisse global verarbeiten unabhängig davon wo sie stattgefunden haben.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.querySelector(&#039;body&#039;).innerHTML = &#039;&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 2&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
var informiereMichWennGeklicktWird = function(event) {&lt;br /&gt;
  console.log(&#039;Benutzer hat irgendwo auf der Seite geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;click&#039;, informiereMichWennGeklicktWird);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Callbacks===&lt;br /&gt;
&lt;br /&gt;
Ein Callback ist eine Rückruffunktion welche an ein andere Funktion übergeben wird und zu späteren Zeitpunkten ggf. ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichWennMausBewegtWird = function() {&lt;br /&gt;
  console.log(&#039;Benutzer hat geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, informiereMichWennMausBewegtWird);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist jedoch nicht garantiert dass eine übergebene Callback-Funktion überhaupt jemals ausgeführt wird.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichFallsEsOktoberIst = function(event) {&lt;br /&gt;
  console.log(&#039;Es ist Oktober&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var istEsOktober = function(callback) {&lt;br /&gt;
  if (new Date().getMonth() == 9) callback();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
istEsOktober(informiereMichFallsEsOktoberIst);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Callback-Mechanismen unterstützen den Umgang mit nicht deterministischen und asynchronen Ereignissen in JavaScript.&lt;br /&gt;
&lt;br /&gt;
===Ereignis-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jeder Event-Listener-Callback-Funktion wird beim Aufruf ein für ein Ereignis spezifisches Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
  console.log(event.screenX);&lt;br /&gt;
  console.log(event.screenY);&lt;br /&gt;
  console.log(event.button);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Dieses Objekt enthält neben spezifischen auch generelle Ereignisinformationen wie zum Beispiel das Ereignis-Ziel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinsichtlich der drei Phasen die ein Ereignis durchlaufen kann unterscheidet man zwischen ursprünglichem und aktuellem Ziel.Das aktuelle Ziel ist das auf welchem das Ereignis aktuell ausgelöst wird und das ursprüngliche das wo es stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target); // ursprüngliches Ziel&lt;br /&gt;
  console.log(event.currentTarget); // aktuelles Ziel&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Ziel &amp;lt;code&amp;gt;currentTarget&amp;lt;/code&amp;gt; entspricht also immer dem Objekt auf dem man den Event-Handler angemeldet hat.&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abmeldung===&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;removeEventListener&amp;lt;/code&amp;gt; kann ein zuvor angemeldeter Event-Listener wieder von einem Objekt entfernt werden.&lt;br /&gt;
Diese Funktion benötigt im Gegensatz zu &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt;nur zwei Argumente: Den Ereignis-Namen und die Event-Listener-Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeMausBewegungen = function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, loggeMausBewegungen);&lt;br /&gt;
document.removeEventListener(&#039;mousemove&#039;, loggeMausBewegungen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Standardverhalten===&lt;br /&gt;
&lt;br /&gt;
Nachdem alle Ereignisse erzeugt und verarbeitet wurden führt der Browser gegegebenfalls eine sogenannte &amp;quot;Default Action&amp;quot; aus.&lt;br /&gt;
Im Wesentlichen ist eine solche Aktion das Standardverhalten des Browsers als Reaktion auf das eingetretene Ereignis.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* Benutzer klickt auf einen Link -&amp;gt; der Browser lädt die URL&lt;br /&gt;
* Benutzer führt Tastatureingaben in einem Feld aus -&amp;gt; der Browser fügt die Zeichen dem Feld hinzu&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer Event-Listener-Funktion ist es möglich mithilfe von &amp;lt;code&amp;gt;preventDefault()&amp;lt;/code&amp;gt; das Standardverhalten zu unterdrücken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  event.preventDefault();&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der oben dargestellte Code führt zum Beispiel dazu dass kein Klick auf einen Link die enthaltene URL aufruft.&lt;br /&gt;
&lt;br /&gt;
==Wichtige Events==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Ereignisse sind die wichtigsten in der täglichen browser-seitingen Anwendungsentwicklung mit JavaScript.&lt;br /&gt;
&lt;br /&gt;
===DOMContentLoaded===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis beschreibt dass das HTML geladen und interpretiert wurde und das DOM und CSSOM erzeugt und gerendert wurde.&lt;br /&gt;
Es wird keine Aussage darüber gemacht ob weitere externe referenzierte Inhalte bereits geladen wurden, wie z.B. Bilder.&lt;br /&gt;
Das Ereignis wird direkt und ausschliesslich auf dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt als Ereignisziel ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Mit der Seite kann interagiert werden&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===load===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis besagt dass die gesamte Web-Seite inklusive aller externen referenziereten Inhalte gerendert wurden.&lt;br /&gt;
Im Gegensatz zu &amp;lt;code&amp;gt;DOMContentLoaded&amp;lt;/code&amp;gt; wird dieses Ereignis direkt und ausschliesslich auf dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener(&#039;load&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite wurde vollständig geladen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===click===&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn der Benutzer (mit der Maus) auf ein sichtbares DOM-Element klickt wird dieses Ereignis ausgelöst.&lt;br /&gt;
Bei der Propagierung dieses Ereignisses werden wie alle drei Ereignisphasen (Capturing, Bubbling, Target) komplett durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat auf etwas geklickt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mousemove, mouseover, mouseout===&lt;br /&gt;
Bei Mausbewegungen über DOM-Element wird konstant das Ereignis &amp;lt;code&amp;gt;mousemove&amp;lt;/code&amp;gt; mit den entsprechenden Koordinaten erzeugt.&lt;br /&gt;
Das Ereignis &amp;lt;code&amp;gt;mouseover&amp;lt;/code&amp;gt; wird erzeugt wenn die Maus in das Element eindringt, &amp;lt;code&amp;gt;mouseout&amp;lt;/code&amp;gt; wenn das Element wieder verlassen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseover&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus über etwas bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseout&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus von etwas weg bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===keydown, keyup, keypress===&lt;br /&gt;
&lt;br /&gt;
Bei Tastatureingaben auf einem DOM-Element durch den Benutzer werden die Ereignisse &amp;lt;code&amp;gt;keydown&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyup&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;keypress&amp;lt;/code&amp;gt; ausgelöst.&lt;br /&gt;
Die drei unterschiedlichen Ereignisse beschreiben die unterschiedlichen Phasen einer einzelnen Tastatureingabe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;keydown&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste gedrückt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keypress&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste betätigt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keyup&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste losgelassen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anmize8</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=35426</id>
		<title>JavaScript-Tutorium:Browser</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=35426"/>
		<updated>2014-11-09T09:12:06Z</updated>

		<summary type="html">&lt;p&gt;Anmize8: /* Abfragen der URL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten bei der JavaScript-Entwicklung im Browser zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Einführung=&lt;br /&gt;
&lt;br /&gt;
==Native vs. Host==&lt;br /&gt;
&lt;br /&gt;
In einer JavaScript-Umgebung existieren immer zwei unterschiedliche Arten von Objekten und Funktionen.&lt;br /&gt;
&#039;&#039;&#039;Native Objekte&#039;&#039;&#039; werden von der JavaScript-Engine zur Verfügung gestellt und sind durch den ECMAScript-Standard abgedeckt.&lt;br /&gt;
&#039;&#039;&#039;Host-Objekte&#039;&#039;&#039; sind hingegen nicht zwingend standardisiert und werden von der Umgebung bereitgestellt.&lt;br /&gt;
Im Browser handelt es sich bei Host-Objekten um Schnittstellen für den Zugriff auf den Browser selbst und externe Geräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==HTML5-Standard==&lt;br /&gt;
&lt;br /&gt;
Das bedeuteut, dass obwohl die Sprache selbst dem ECMAScript-Standard folgt, musste man bis vor wenigen Jahren &lt;br /&gt;
noch davon ausgehen dass sich die verfügbaren APIs je nach Browser sehr stark unterscheiden können. &lt;br /&gt;
Durch die steigende Entwicklungsgeschwindigkeit der Browser-Hersteller und den allgemein akzeptierten &lt;br /&gt;
[https://html.spec.whatwg.org/multipage/ HTML5-Standard] verbessert sich diese Situation jedoch zunehmend. &lt;br /&gt;
&lt;br /&gt;
Heutzutage kann man davon ausgehen, dass jeweils die neuesten Versionen von Firefox, Chrome und Internet Explorer&lt;br /&gt;
die DOM-API und viele der neu verfassten HTML5-APIs bereits standardkonform unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inline Code vs. externe Dateien==&lt;br /&gt;
&lt;br /&gt;
Eine im Browser angezeigte Web-Seite besteht meist aus HTML, CSS und JavaScript, wobei nur HTML zwingend verlangt ist.&lt;br /&gt;
Der JavaScript-Code kümmert sich normalerweise um die dynamischen Aspekte, wie Interaktionen und das Nachladen von Inhalten.&lt;br /&gt;
&lt;br /&gt;
Beim Besuch einer Website lädt der Browser das HTML-Dokument unter der angegeben URL herunter und evaluiert es.&lt;br /&gt;
Das Dokument enthält dann wiederum optional Verweise auf CSS-Dateien, Bilder, JavaScript-Dateien und andere Medien.&lt;br /&gt;
Neben Verweisen auf externen JavaScript-Code kann das Dokument auch Inline-Code-Blöcke enthalten. &lt;br /&gt;
Ob es sich um externe Dateien oder Inline-Code handelt wirkt sich auf die Ladezeiten und das Caching des Browser aus, &lt;br /&gt;
die enthaltenen Anweisungen und Ausdrücke werden jedoch nicht davon beeinflusst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039; Die Reihenfolge der eingebunden Code-Blöcke und angegebenen Dateiverweise ist allerdings wichtig,&lt;br /&gt;
da diese ebenso die Reihenfolge der Code-Ausführung darstellt.&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Kontext==&lt;br /&gt;
&lt;br /&gt;
Für jede geladene Web-Seite, unabhängig davon ob sie im separaten Fenster oder als ein weiterer Tab angezeigt wird,&lt;br /&gt;
erzeugt der Browser einen separaten und isolierten JavaScript-Kontext, in dem der geladene Code ausgeführt wird.&lt;br /&gt;
Das bedeutet dass alle Objekte und Funktionen nur so lange am Leben sind bis die Seite neu geladen oder verlassen wird.&lt;br /&gt;
Ein Zugriff auf andere Seiten in anderen Fenstern oder Tabs ist aus Sicherheitsgründen nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Window=&lt;br /&gt;
&lt;br /&gt;
Das globale Objekt &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; referenziert alle im Browser verfügbaren Objekte und Werte als Eigenschaften (native und host).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.Object);&lt;br /&gt;
console.log(window.XMLHttpRequest);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf globale Eigenschaften ist es nicht notwendig explizit &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; zu schreiben. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Date == window.Date);&lt;br /&gt;
console.log(new Date());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht innerhalb von Funktionen deklarierten Variablen werden automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var globaleVariable = &#039;global&#039;;&lt;br /&gt;
var globaleFunktion = function() {};&lt;br /&gt;
console.log(window.globaleVariable);&lt;br /&gt;
console.log(window.globaleFunktion);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modifikation von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Da es sich um ein normales Objekt handelt können die meisten Eigenschaften modifiziert und auch gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Veränderungen von globalen Eigenschaften sind nicht sinnvoll und können schwerwiegende Fehler verursachen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.Object = {};&lt;br /&gt;
var objekt = new Object();&lt;br /&gt;
&lt;br /&gt;
delete window.Array;&lt;br /&gt;
var array = new Array();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt wird vom Browser mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Window&amp;lt;/code&amp;gt; erzeugt, welche auch global verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.constructor == window.Window);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Popups und Frames==&lt;br /&gt;
&lt;br /&gt;
Neben dem globalen Fenster-Objekt kann eine Web-Seite beliebig viele weitere &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekte enthalten.&lt;br /&gt;
Dabei handelt es sich dann entweder um durch Code erzeugte Popups oder aber um Frames (besser bekannt als iframes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.open(&#039;https://www.google.com&#039;, &#039;Google im Popup&#039;, &#039;width=400,height=300,resizable=yes&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frames können entweder durch das entsprechende HTML oder aber auch wie im Code gezeigt programmatisch erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
==Browser-Schnittstellen==&lt;br /&gt;
&lt;br /&gt;
Abgesehen von den nativen Objekten notwendigen Objekte enthält &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; wichtige Browser- und Geräte-Schinttstellen.&lt;br /&gt;
Dazu zählen zum Beispiel Funktionen um Dialoge im Browser zu öffnen oder aber sogar um Game-Controller zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name = window.prompt(&#039;Wie ist Ihr Name?&#039;);&lt;br /&gt;
window.alert(&#039;Hello &#039; + name);&lt;br /&gt;
window.alert(&#039;Die aktuelle Seite ist &#039; + window.innerWidth + &#039;px breit&#039;);&lt;br /&gt;
&lt;br /&gt;
console.log(window.Gamepad);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Liste der verfügbaren Eigenschaften finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/de/docs/DOM/window dieser] MDN-Seite.&lt;br /&gt;
In den folgenden Abschnitten werden exemplarisch ein paar wichtige Objekte im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Beispiel für Browser-Schnittstellen=&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; ist ein globales Objekt welches die aktuelle URL und ihre Bestandteile enthält und diese auch verändern kann.&lt;br /&gt;
Das Objekt wird analog zum &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Location&amp;lt;/code&amp;gt; erstellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.location.constructor == window.Location);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen der URL===&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaft &amp;lt;code&amp;gt;href&amp;lt;/code&amp;gt; enhtält die gesamte aktuelle URL. Alternativ kann auch &amp;lt;code&amp;gt;location.toString()&amp;lt;/code&amp;gt; genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.href);&lt;br /&gt;
console.log(location.toString());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einzelne Bestandteile der URL ermitteln zu können werden viele separate Eigenschaften bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.protocol);&lt;br /&gt;
console.log(location.host);&lt;br /&gt;
console.log(location.port);&lt;br /&gt;
console.log(location.pathname);&lt;br /&gt;
console.log(location.hash);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verändern der URL===&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften können nicht nur lesend genutzt werden, sondern auch um Änderungen an der aktuellen URL vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
Mit der Ausname von &amp;lt;code&amp;gt;location.hash&amp;lt;/code&amp;gt; führen Änderungen der Eigenschaften zum Verlassen der aktuellen Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.protocol = &#039;http&#039;;&lt;br /&gt;
location.port = &#039;8080&#039;;&lt;br /&gt;
location.hash = &#039;#anker&#039;;&lt;br /&gt;
location.href = &#039;https://www.google.com&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es ein paar Funktionen um die URL zu modifizieren oder aber die Seite neuzuladen:&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.assign(&#039;https://www.google.com&#039;);&lt;br /&gt;
location.reload(true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
Das globale &amp;lt;code&amp;gt;history&amp;lt;/code&amp;gt;-Objekt ermöglicht den programmatischen Zugriff auf den Browser-Verlauf.&lt;br /&gt;
Es werden Funktionen zur Verfügung gestellt um im Verlauf beliebig viele Schritte zurück und vorwärts zu gehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
history.back();&lt;br /&gt;
history.forward();&lt;br /&gt;
history.go(-3);&lt;br /&gt;
history.go(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Aus Sicherheitsgründen ist es nicht erlaubt auf Informationen einzelner Einträge im Verlauf zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
==Navigator==&lt;br /&gt;
&lt;br /&gt;
Für detaillierte Informationen über den aktuellen Client bzw. Browser existiert das &amp;lt;code&amp;gt;navigator&amp;lt;/code&amp;gt;-Objekt.&lt;br /&gt;
Die meistgenutzte Eigenschaft &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; ermöglicht das Feststellen des Browser-Herstellers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(navigator.userAgent);&lt;br /&gt;
console.log(navigator.battery);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Document Object Model=&lt;br /&gt;
&lt;br /&gt;
Im Browser können einem Fenster beliebig viele Dokumentenobjekte zugeordnet werden, mindestens aber ein Hauptdokument. &lt;br /&gt;
Das automatisch erstellte Hauptdokument wird über die globale Variable &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; zur Verfügung gestellt.&lt;br /&gt;
Die Schnittstelle für den Dokumentenzugriff wird durch das [http://www.w3.org/DOM/ Document Object Model] spezifiziert.&lt;br /&gt;
&lt;br /&gt;
==Objektmodell==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekt repräsentiert ein vom Browser interpretiertes HTML-Dokument als Objektmodell mit einer Baumstruktur.&lt;br /&gt;
Dabei werden Tags, Texte und Kommentare in Knoten umgewandelt, wobei Tag-Knoten wiederum Unterknoten haben können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&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;p&amp;gt;&lt;br /&gt;
      Text&lt;br /&gt;
      &amp;lt;!-- Kommentar --&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;Eingabe&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das oben dargestellte Markup wird bei der Interpretation durch den Browser in folgendes Objektmodell übersetzt:&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Knoten mit den Unterknoten &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;-Knoten mit dem Unterknoten &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;-Knoten mit einem Text-Unterknoten&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Knoten mit den Unterknoten &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;-Knoten mit einem Text-Unterknoten und einem Kommentar-Unterknoten&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;-Knoten&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Achtet man bei HTML auf eine korrekte Einrückung so ist das resultierende Objektmodell meist klar erkennbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Markup-Korrekturen===&lt;br /&gt;
&lt;br /&gt;
Es ist zu beachten, dass es sich beim Objektmodell &#039;&#039;&#039;nicht&#039;&#039;&#039; um ein eindeutiges Abbild des originalen Markups handelt.&lt;br /&gt;
Der Unterschied wird besonders deutlich wenn man das Resultat von folgendem invalidem HTML untersucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&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;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Tabelle&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Objektmodell fügt zwischen dem &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt;- und dem &amp;lt;code&amp;gt;tr&amp;lt;/code&amp;gt;-Knoten einen &amp;lt;code&amp;gt;tbody&amp;lt;/code&amp;gt;-Knoten ein damit das HTML valide wird.&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Im Browser kann man das Objektmodell einer Seite mit dem (DOM) Inspector der Entwicklerwerkzeuge betrachten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufbau von Dokumenten==&lt;br /&gt;
&lt;br /&gt;
===Node-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jeder Knoten innerhalb eines Dokumentenobjekts ist direkt oder indirekt abgeleitet vom &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Konstruktor/-Prototypen.&lt;br /&gt;
Mit Ausnahme des Dokumentenobjekts selbst wird allen Knoten ein Dokument zugeordnet durch die &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt;-Eigenschaft.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren hat jeder Knoten einen bestimmten numerischen Typen, welcher in der Eigenschaft &amp;lt;code&amp;gt;nodeType&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
Die folgende Liste enthält die gängigsten Typen von Dokumentenknoten denen man bei der Arbeit mit Dokumenten begegnet:&lt;br /&gt;
&lt;br /&gt;
* 1: ELEMENT_NODE&lt;br /&gt;
* 3: TEXT_NODE&lt;br /&gt;
* 8: COMMENT_NODE&lt;br /&gt;
* 9: DOCUMENT_NODE&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Referenz der Eigenschaften von Node-Objekten finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Web/API/Node dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
===Document-Objekte===&lt;br /&gt;
&lt;br /&gt;
Ein Dokument wird mit dem &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Konstruktor erzeugt und ist selbst keinem Dokument, jedoch einem Fenster zugeordnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.defaultView);&lt;br /&gt;
console.log(window == document.defaultView);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Dokument selbst repräsentiert kein HTML-Element, verweist aber auf das &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Element mit der Eigenschaft &amp;lt;code&amp;gt;documentElement&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;
console.log(document.documentElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktionen eines Dokuments ist es möglich neue &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekte zu erstellen, einzufügen und diese zu suchen.&lt;br /&gt;
===Element-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jedes HTML-Tag wird in einen Knoten übersetzt welcher mit dem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Konstruktor erzeugt wird.&lt;br /&gt;
Element-Objekte besitzen Schnittstellen um auf Eigenschaften eines HTML-Tags zuzugreifen und diese zu modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement.tagName);&lt;br /&gt;
console.log(document.documentElement.innerHTML);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie Dokumente können Element-Objekten weitere Node-Objekte als Unterknoten angehängt und nach ihnen gesucht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Comment-Objekte===&lt;br /&gt;
&lt;br /&gt;
HTML-Kommentare werden in Comment-Objekte umgewandelt welche mit dem &amp;lt;code&amp;gt;Comment&amp;lt;/code&amp;gt;-Konstruktor erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Text-Objekte===&lt;br /&gt;
&lt;br /&gt;
Texte werden in &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt;-Objekte umgewandelt, wobei auf diese auch durch übergeordnete Elemente zugegriffen werden kann.&lt;br /&gt;
Normalerweise wird bei der Anwendungsprogrammierung mit JavaScript nicht direkt mit Text-Knoten gearbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Neue Element-Objekte werden über die Schnittstelle eines &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekts unter der Angabe eines Tag-Namens erzeugt.&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
console.log(absatz.tagName);&lt;br /&gt;
console.log(absatz.nodeType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Erstellung wird das neue Element dem aufgerufenen Dokument als zugehörig markiert durch die Eigenschaft &amp;lt;code&amp;gt;ownerDocument&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;
&lt;br /&gt;
var block = document.createElement(&#039;div&#039;);&lt;br /&gt;
console.log(block.ownerDocument);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Schnittstelle eines Dokuments nicht mit HTML-Standards gekoppelt ist, können beliebige Tag-Namen vergeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var meinElement = document.createElement(&#039;mein-element&#039;);&lt;br /&gt;
console.log(meinElement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Suchen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Besonders wichtig bei der Arbeit mit Dokumenten ist die Suche von einzelnen oder mehreren Elementen.&lt;br /&gt;
Aufgrund dessen haben sich die Schnittstellen für die Suche im Browser über die letzten Jahre rapide verbessert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorgefertige Kriterien===&lt;br /&gt;
&lt;br /&gt;
Die Suche nach einem eindeutigen Element kann mithilfe einer ID ausgeführt werden, insofern das HTML-Element eine besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var inhalt = document.getElementById(&#039;inhalt&#039;);&lt;br /&gt;
console.log(inhalt);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einer Suche wird entweder das Dokument selbst oder aber ein beliebiges Element als Ausgangspunkt verwendet.Es wird dann jeweils immer nur unterhalb des Ausgangsknotens gesucht, was sich positiv auf die Performance auswirken kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var inhalt = document.getElementById(&#039;inhalt&#039;);&lt;br /&gt;
var kommentare = inhalt.getElementById(&#039;kommentare&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Werden Elemente einer bestimmten Art gesucht so kann der Tag-Name oder aber die HTML-Klasse als Kriterium genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var elemente = document.getElementsByTagName(&#039;body&#039;);&lt;br /&gt;
console.log(elemente);&lt;br /&gt;
&lt;br /&gt;
var kommentare = document.getElementsByClassName(&#039;kommentar&#039;);&lt;br /&gt;
console.log(kommentare.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Art von Suche wird eine &amp;lt;code&amp;gt;NodeList&amp;lt;/code&amp;gt; als Ergebnis zurückgeliefert, ein Array-artiges Objekt von Node-Elementen.Einzelne Elemente dieser Liste können entweder über eine Funktion oder aber über einen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.getElementsByTagName(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
console.log(absaetze.item(0));&lt;br /&gt;
console.log(absaetze.item(0) == absaetze[0]);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verweise===&lt;br /&gt;
Jedes Element verweist im Sinne einer Baumstruktur auf seine übergeordneten und untergeordneten Knoten und seine Nachbaren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.getElementsByTagName(&#039;body&#039;).item(0);&lt;br /&gt;
for (var i = 0; i &amp;lt; body.childNodes.length; i++) {&lt;br /&gt;
  console.log(body.childNodes[i]);&lt;br /&gt;
}&lt;br /&gt;
console.log(body.parentNode);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Referenzen können genutzt werden um sich durch das Dokument zu bewegen und bestimmte Elemente zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var container = [];&lt;br /&gt;
var absaetze = document.getElementsByTagName(&#039;p&#039;);&lt;br /&gt;
for (var i = 0; i &amp;lt; absaetze.length; i++) {&lt;br /&gt;
  container.push(absaetze[i].parentNode);&lt;br /&gt;
}&lt;br /&gt;
console.log(container);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CSS-Selektoren===&lt;br /&gt;
&lt;br /&gt;
Die Suche mithilfe von vorgefertigen Kriterien und Verweisen auf benachbarte Elemente hat gewisse Limitierungen.&lt;br /&gt;
Aufgrund dessen enstand durch bekannte Bibliotheken wie jQuery das Konzept von Query-Selektoren, welche heute als &lt;br /&gt;
[http://www.w3.org/TR/CSS2/selector.html CSS-Selektoren] standardisiert werden und in vielen Browser verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Eine CSS-Selektorgruppe beschreibt eine beliebige Menge an Kriterien, die auf ein oder mehrere HTML-Elemente zutrifft.&lt;br /&gt;
Der Name wurde so gewählt da CSS-Selektoren ebenso in Stylesheets genutzt werden um eine Menge an Elementen auszuwählen.&lt;br /&gt;
Aufgrund der Kombinierbarkeit einzelner CSS-Selektoren ergibt sich eine sehr mächtige Suchfunktionalität.&lt;br /&gt;
&lt;br /&gt;
Im Browser gibt zwei verschiedene Funktionen um Elemente mithilfe von CSS-Selektoren zu suchen:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelector&amp;lt;/code&amp;gt; liefert das erste Element zurück welches die Kriterien erfüllt&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelectorAll&amp;lt;/code&amp;gt; liefert alle Elemente zurück welche die Kriterien erfüllen in Form einer &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Liste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Mögliche Kriterien====&lt;br /&gt;
&lt;br /&gt;
Das einfachste Kriterium für einen CSS-Selektor ist die Angabe eines Tag-Namen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.querySelectorAll(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Angabe einer ID eines HTML-Elements erfolgt durch eine vorangestellte Raute (&amp;lt;code&amp;gt;#&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;
var inhalt = document.querySelector(&#039;#inhalt&#039;);&lt;br /&gt;
console.log(inhalt);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klassen-Selektoren werden durch einen vorangestellten Punkt (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) gekennzeichnet. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kommentare = document.querySelectorAll(&#039;.kommentar&#039;);&lt;br /&gt;
console.log(kommentare);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von eckigen Klammern (&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;) werden beliebige Attribute als Kriterium definiert.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var textFelder = document.querySelectorAll(&#039;[type=&amp;quot;text&amp;quot;]&#039;);&lt;br /&gt;
console.log(textFelder);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird kein Attributwert vergeben, wird lediglich auf die Existenz des Attributs geprüft.&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var versteckteElemente = document.querySelectorAll(&#039;[hidden]&#039;);&lt;br /&gt;
console.log(versteckteElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Mächtigkeit von CSS-Selektoren ergibt sich vor allem durch die beliebige Kombinationsmöglichkeiten von Selektoren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wichtigeKommentare = document.querySelectorAll(&#039;.kommentar.wichtig&#039;);&lt;br /&gt;
console.log(wichtigeKommentare);&lt;br /&gt;
var versteckteAbsaetze = document.querySelectorAll(&#039;p[hidden]&#039;);&lt;br /&gt;
console.log(textFelder);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist sogar möglich Kriterien für übergeordnete Elemente zu definieren indem man die Selektoren durch Leerzeichen trennt.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var versteckteElementeInnerhalbVonKommentaren = document.querySelectorAll(&#039;.kommentar [hidden]&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Komplexität einer CSS-Selektorgruppe beeinflusst die Performance einer Suche.&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine vollständige Erklärung der Funktionsweise von CSS-Selektoren ist nicht Ziel dieses Tutoriums.&lt;br /&gt;
Diese Einführung dient lediglich dazu ein grundsätzliches Verständnis für den Umgang mit Selektoren zu vermitteln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hinzufügen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Neu erstellte Elemente können im Dokument als untergeordnete Knoten mithilfe von &amp;lt;code&amp;gt;appendChild()&amp;lt;/code&amp;gt; eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
document.documentElement.appendChild(absatz);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dazu muss immer der künftig übergeordnete Knoten angesprochen werden wenn das Element an einer bestimmten Stelle landen soll.&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var absatz = document.querySelector(&#039;p&#039;);&lt;br /&gt;
var unterAbsatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
absatz.appendChild(unterAbsatz);    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modifizieren von Elementen==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der entsprechenden DOM-Schnittstellen können Text, Attribute sowie das Styling von Elementen beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
===Ändern von Text===&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt mit nur einem &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt;-Unterknoten stellt seinen Text über der Eigenschaft &amp;lt;code&amp;gt;textContent&amp;lt;/code&amp;gt; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var p = document.querySelector(&#039;p&#039;);&lt;br /&gt;
console.log(p.textContent);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Text kann über diese Eigenschaft nicht nur gelesen sondern ebenso beliebig modifiziert werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var p = document.querySelector(&#039;p&#039;);&lt;br /&gt;
p.textContent = &#039;Hallo Welt&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von HTML===&lt;br /&gt;
&lt;br /&gt;
Eine wesentlich mächtigere Weise um den Inhalt eines Elements zu beeinflussen stellt die Eigenschaft &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; dar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;Hallo Welt&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neben einfachen Text-Änderungen lässt sich mithilfe dieser Eigenschaft das gesamte enthaltene HTML beeinflussen.Anstatt also mithilfe der DOM-Schnittstelle einzelne Elemente zu erzeugen kann einfach Markup als Wert zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;p&amp;gt;Hallo &amp;lt;strong&amp;gt;Welt!&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von Attributen===&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die Attribute eines HTML-Elements gibt es die Funktionen &amp;lt;code&amp;gt;getAttribute()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;setAttribute()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Beide akzeptieren als erstes Argument den Namen des Attributs, der Setter akzeptiert außerdem einen zu setzenden Wert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
absatz.innerHTML = &#039;Tolle Website!&#039;;&lt;br /&gt;
absatz.setAttribute(&#039;class&#039;, &#039;kommentar&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(p);&lt;br /&gt;
&lt;br /&gt;
console.log(p.getAttribute(&#039;class&#039;));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kann mithilfe der Funktion &amp;lt;code&amp;gt;hasAttribute()&amp;lt;/code&amp;gt; nach der Existenz eines Attributs gefragt werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var eingabefeld = document.querySelector(&#039;input[type=text]&#039;);&lt;br /&gt;
console.log(&#039;Ist das Eingabefeld Pflicht? &#039; + eingabefeld.hasAttribute(&#039;required&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine besondere Häufigkeit bei Attributsänderungen ist das Hinzufügen und/oder Entfernen von Klassen.&lt;br /&gt;
Dafür gibt es in neueren Browsern die Liste &amp;lt;code&amp;gt;classList&amp;lt;/code&amp;gt; auf jedem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt, welche die Arbeit erleichtert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.querySelector(&#039;p&#039;);&lt;br /&gt;
absatz.classList.push(&#039;wichtig&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von CSS-Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
Neben dem Document Object Model existiert außerdem der [http://dev.w3.org/csswg/cssom/ CSS Object Model Standard] &lt;br /&gt;
welcher die Schnittstelle für den Zugriff auf CSS-Eigenschaften von DOM-Objekten standardisiert.&lt;br /&gt;
&lt;br /&gt;
Ein jedes DOM-Element vom Typ &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; besitzt eine Eigenschaft &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; welche alle CSS-Eigenschaften beherbergt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
console.log(body.style.color);&lt;br /&gt;
console.log(body.style.padding);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften spiegeln die in Stylesheets definierten Regeln wieder, jedoch inklusive dem kaskadierenden Charakter.Das heisst dass ein Element-Objekt nicht zwingend selbst eine &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt; besitzt, diese jedoch für die Anzeige vererbt bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaften können ebenso beliebig modifiziert werden, was zu einer sofortigen Anpassung der Darstellung führt. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.style.backgroundColor = &#039;#AAF&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Löschen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Ebenso wie neue Elemente einem Dokument hinzugefügt werden können, so können diese oder bestehende auch gelöscht werden.&lt;br /&gt;
Dazu muss man den übergeordneten Knoten ansteuern und mithilfe von &amp;lt;code&amp;gt;removeChild()&amp;lt;/code&amp;gt; die Entfernung durchführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var liste = document.querySelector(&#039;ul&#039;);&lt;br /&gt;
var listenelement = liste.querySelector(&#039;li&#039;);&lt;br /&gt;
liste.removeChild(listenelement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ist einem der übergeordnete Knoten nicht bekannt so kann diesen mithilfe der Knotenverweise ermitteln.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var entferneKnoten = function(knoten) {&lt;br /&gt;
  if (!knoten.parentNode) {&lt;br /&gt;
    throw new Error(&#039;no parent node&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  knoten.parentNode.removeChild(knoten);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var listenelement = document.querySelector(&#039;li&#039;);&lt;br /&gt;
entferneKnoten(listenelement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=DOM Events=&lt;br /&gt;
&lt;br /&gt;
==Ereignisorientierte Programmierung==&lt;br /&gt;
&lt;br /&gt;
Für die Verarbeitung von stets verfügbaren Informationen eignet sich eine sequentiell ablaufende Folge von Instruktionen.&lt;br /&gt;
Ergeben sich Informationen jedoch nicht deterministisch zur Laufzeit bietet sich die ereignisorientierte Programmierung an.&lt;br /&gt;
Hierbei wird nicht mehr aktiv auf eine Information gewartet, das Programm wird benachrichtigt wenn ein Ereignis eintritt.&lt;br /&gt;
Somit gibt es nicht nur einen einzelnen Kontrollfluss, sondern beliebig viele welche sogar auch parallel ablaufen können.&lt;br /&gt;
&lt;br /&gt;
==Ereignisse im Browser==&lt;br /&gt;
&lt;br /&gt;
Bei der Betrachtung von und der Interaktion mit Websites im Browser ergeben sich sehr viele unterschiedliche Ereignisse.&lt;br /&gt;
Zunächst wird die HTML-Seite geladen und gerendert, danach geschieht dies für alle anderen referenzierten Medien.&lt;br /&gt;
Diese Vorgänge lösen bereits nicht deterministische Ereignisse aus welche alleine durch den Browser verursacht werden.&lt;br /&gt;
So gibt es für die meisten Medien ein Ereignis welches beschreibt dass diese fertig geladen und gerendert wurden.&lt;br /&gt;
&lt;br /&gt;
Sobald der Browser beginnt eine Web-Seite zu rendern können Ereignisse von Seiten des Benutzers eintreten.&lt;br /&gt;
Nahezu jede Benutzerinteraktion löst im Browser ein Ereignis aus welches wiederum in weiteren Aktionen resultiert.&lt;br /&gt;
Klickt der Benutzer auf einen Link so ist das ein Ereignis welches zur Folge hat dass die geklickte URL geladen wird.&lt;br /&gt;
Wird ein Scroll-Balken vom Benutzer bewegt ergibt sich daraus ein Ereignis welches den Browser in Folge scrollen lässt.&lt;br /&gt;
&lt;br /&gt;
Zu den wichtigsten Arten von durch den Benutzer ausgelösten Ereignissen zählen: &lt;br /&gt;
&lt;br /&gt;
* Mausbewegungen und -klicks&lt;br /&gt;
* Tastatureingaben&lt;br /&gt;
* Scrolling&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Auflistung der möglichen Ereignisse im Browser finden Sie auf [https://developer.mozilla.org/en-US/docs/Web/Events dieser] MDN-Seite. &lt;br /&gt;
Nebem dem Browser und dem Benutzer gibt es auch andere Auslöser wie zum Beispiel mit der Website verbundene Server/Backends. &lt;br /&gt;
&lt;br /&gt;
==Aufbau eines Ereignisses==&lt;br /&gt;
&lt;br /&gt;
Im Sinne einer standardisierten Ereignisverarbeitung besitzt ein im Browser auftretendes Ereignis immer drei folgende Merkmale: &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Name:&#039;&#039;&#039; eine Zeichenkette die das Ereignis in der Regel in der Gegenwart beschreibt, z.B. &amp;quot;click&amp;quot; oder &amp;quot;mousemove&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Daten:&#039;&#039;&#039; ein Objekt mit einer pro Ereignis festgelegten Struktur, welches die wichtigsten Ereignisdaten enthält&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Ziel:&#039;&#039;&#039; ein Objekt das als Ziel des Ereignis festgelegt wird; in der Regel handelt es sich um DOM-Elemente&lt;br /&gt;
&lt;br /&gt;
Beispiel für ein solches Ereignis: Eine &#039;&#039;&#039;Tastatureingabe&#039;&#039;&#039; in einem &#039;&#039;&#039;Formularfeld&#039;&#039;&#039;, bei dem das Zeichen &#039;&#039;&#039;@&#039;&#039;&#039; eingegeben wird. &lt;br /&gt;
&lt;br /&gt;
==Phasen der Ereignispropagierung==&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei dem ursprünglichen Ziel eines Ereignisses um ein DOM-Objekt werden in der Regel drei Phasen durchlaufen.&lt;br /&gt;
&lt;br /&gt;
===Capturing-Phase===&lt;br /&gt;
&lt;br /&gt;
In Phase 1, der sogenannten &#039;&#039;&#039;Capturing-Phase&#039;&#039;&#039; wird zuerst ein Ereignis mit dem obersten Knoten im Dokument als Ziel erzeugt.&lt;br /&gt;
Dabei handelt es sich in der Regel um das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt, welches alle andere DOM-Objekte als Unterknoten enthält.&lt;br /&gt;
Das wird schrittweise wiederholt für jeden untergeordneten Knoten auf dem Pfad zum eigentlichen Ziel des Ereignisses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
+ window (optional)         - Ereignis mit window als aktueller Ziel&lt;br /&gt;
  + document                - Ereignis mit body als aktueller Ziel&lt;br /&gt;
    + body                  - Ereignis mit body als aktueller Ziel&lt;br /&gt;
      + p (ursprüngliches Ziel)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Bei manchen Ereignissen wird das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als oberstes Objekt in die Hierarchie der Ziele mit aufgenommen.&lt;br /&gt;
&lt;br /&gt;
===Target-Phase===&lt;br /&gt;
&lt;br /&gt;
Ist der Browser nun beim ursprünglichen Ziel angelangt wird in Phase 2 gewechselt, der sogenannten &#039;&#039;&#039;Target-Phase&#039;&#039;&#039;.&lt;br /&gt;
Dabei wird ein einzelnes Ereignis erzeugt, für welches das ursprüngliche DOM-Objekt als Ziel verwendet wird.&lt;br /&gt;
&lt;br /&gt;
===Bubbling-Phase===&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss der Ereignispropagierung wechselt der Browser in Phase 3, der sogenannten &#039;&#039;&#039;Bubbling-Phase&#039;&#039;&#039;.&lt;br /&gt;
Hierbei wird der Pfad der Capturing-Phase in umgekehrter Richtung durchlaufen und jeweils wieder ein Ereignis erzeugt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In Bibliotheken wie jQuery hat man nur Zugriff auf die Bubbling-Phase, nicht auf die Capturing-Phase.&lt;br /&gt;
&lt;br /&gt;
===Browser-Unterschiede===&lt;br /&gt;
&lt;br /&gt;
Die Capturing- und Bubbling-Phasen bilden in ihrer Implementierung die Tatsache ab dass &lt;br /&gt;
wenn ein Ereignis auf einem Element stattfindet, dieses Ereignis ebenso für das Element umgebende Elemente gültig ist.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Wird ein Mensch in einem Krankenhaus geboren, so wird dieser auch in einer Stadt geboren, in einem Land geboren.&lt;br /&gt;
&lt;br /&gt;
Einer der beiden oben beschriebenen Phasen wäre allerdings vollkommen ausreichend für die Ereignisvearbeitung.&lt;br /&gt;
Aufgrund von unterschiedlichen Implementierungen der Browser-Hersteller existieren heutzutage jedoch beide gleichzeitig.&lt;br /&gt;
&lt;br /&gt;
===Globale Ereignisse===&lt;br /&gt;
&lt;br /&gt;
Beschreibt ein Ereignis ein globales Geschehen wird oftmals das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als Ereignisziel verwendet.&lt;br /&gt;
In diesen Fällen ist es möglich dass weder Capturing- noch eine Bubbling-Phase durchlaufen werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Das Ergeinis &amp;quot;DOMContentLoaded&amp;quot; beschreibt, dass eine Seite abgesehen siner externen Medien fertig geladen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisverarbeitung==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der DOM-Schnittstelle erhält man die Möglichkeit Ereignisse selbst zu verarbeiten und darauf zu reagieren.&lt;br /&gt;
&lt;br /&gt;
===Anmeldung===&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt; kann auf jedem DOM-Objekt, dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt und dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt aufgerufen werden.&lt;br /&gt;
Dabei ist das Objekt auf dem die Funktion aufgerufen das &#039;&#039;&#039;Ziel&#039;&#039;&#039; des Ereignisses welches verarbeiten werden soll.&lt;br /&gt;
&lt;br /&gt;
Die Funktion akzeptiert außerdem die folgenden drei Argumente: &lt;br /&gt;
* den &#039;&#039;&#039;Namen des Ereignisses&#039;&#039;&#039; das man verarbeiten möchte in Form eines Strings&lt;br /&gt;
* die &#039;&#039;&#039;Callback-Funktion&#039;&#039;&#039; welche das Ereignis-Objekt erwartet und den Code zur Verarbeitung enthält&lt;br /&gt;
* ein optionales &#039;&#039;&#039;Flag&#039;&#039;&#039; das bestimmt ob das Ereignis in der Capturing- oder Bubbling-Phase verarbeitet werden soll&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist das Flag &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, was bedeutet dass das Ereignis in der Bubbling-Phase verarbeitet wird.&lt;br /&gt;
Durch einen Aufruf wird für ein Ereignis auf einem Ziel ein sogenannter Event-Listener in Form einer Funktion angemeldet.&lt;br /&gt;
Jedes Mal wenn das Ereignis auftritt wird die Callback-Funktion aufgerufen und das entsprechende Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichWennSeiteGeladenIst = function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite ist nun fertig geladen&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
}&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, informiereMichWennSeiteGeladenIst, false);&lt;br /&gt;
&lt;br /&gt;
document.querySelector(&#039;body&#039;).innerHTML = &#039;&amp;lt;p&amp;gt;&amp;lt;a id=&amp;quot;link1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
var link = document.querySelector(&#039;#link1&#039;);&lt;br /&gt;
var informiereMichWennLinkGeklicktWird = function(event) {&lt;br /&gt;
  console.log(&#039;Der Link wurde geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
link.addEventListener(&#039;click&#039;, informiereMichWennLinkGeklicktWird);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Phasen der Ereignispropagierung kann man Ereignisse global verarbeiten unabhängig davon wo sie stattgefunden haben.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.querySelector(&#039;body&#039;).innerHTML = &#039;&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 2&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
var informiereMichWennGeklicktWird = function(event) {&lt;br /&gt;
  console.log(&#039;Benutzer hat irgendwo auf der Seite geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;click&#039;, informiereMichWennGeklicktWird);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Callbacks===&lt;br /&gt;
&lt;br /&gt;
Ein Callback ist eine Rückruffunktion welche an ein andere Funktion übergeben wird und zu späteren Zeitpunkten ggf. ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichWennMausBewegtWird = function() {&lt;br /&gt;
  console.log(&#039;Benutzer hat geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, informiereMichWennMausBewegtWird);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist jedoch nicht garantiert dass eine übergebene Callback-Funktion überhaupt jemals ausgeführt wird.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichFallsEsOktoberIst = function(event) {&lt;br /&gt;
  console.log(&#039;Es ist Oktober&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var istEsOktober = function(callback) {&lt;br /&gt;
  if (new Date().getMonth() == 9) callback();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
istEsOktober(informiereMichFallsEsOktoberIst);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Callback-Mechanismen unterstützen den Umgang mit nicht deterministischen und asynchronen Ereignissen in JavaScript.&lt;br /&gt;
&lt;br /&gt;
===Ereignis-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jeder Event-Listener-Callback-Funktion wird beim Aufruf ein für ein Ereignis spezifisches Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
  console.log(event.screenX);&lt;br /&gt;
  console.log(event.screenY);&lt;br /&gt;
  console.log(event.button);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Dieses Objekt enthält neben spezifischen auch generelle Ereignisinformationen wie zum Beispiel das Ereignis-Ziel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinsichtlich der drei Phasen die ein Ereignis durchlaufen kann unterscheidet man zwischen ursprünglichem und aktuellem Ziel.Das aktuelle Ziel ist das auf welchem das Ereignis aktuell ausgelöst wird und das ursprüngliche das wo es stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target); // ursprüngliches Ziel&lt;br /&gt;
  console.log(event.currentTarget); // aktuelles Ziel&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Ziel &amp;lt;code&amp;gt;currentTarget&amp;lt;/code&amp;gt; entspricht also immer dem Objekt auf dem man den Event-Handler angemeldet hat.&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abmeldung===&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;removeEventListener&amp;lt;/code&amp;gt; kann ein zuvor angemeldeter Event-Listener wieder von einem Objekt entfernt werden.&lt;br /&gt;
Diese Funktion benötigt im Gegensatz zu &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt;nur zwei Argumente: Den Ereignis-Namen und die Event-Listener-Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeMausBewegungen = function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, loggeMausBewegungen);&lt;br /&gt;
document.removeEventListener(&#039;mousemove&#039;, loggeMausBewegungen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Standardverhalten===&lt;br /&gt;
&lt;br /&gt;
Nachdem alle Ereignisse erzeugt und verarbeitet wurden führt der Browser gegegebenfalls eine sogenannte &amp;quot;Default Action&amp;quot; aus.&lt;br /&gt;
Im Wesentlichen ist eine solche Aktion das Standardverhalten des Browsers als Reaktion auf das eingetretene Ereignis.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* Benutzer klickt auf einen Link -&amp;gt; der Browser lädt die URL&lt;br /&gt;
* Benutzer führt Tastatureingaben in einem Feld aus -&amp;gt; der Browser fügt die Zeichen dem Feld hinzu&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer Event-Listener-Funktion ist es möglich mithilfe von &amp;lt;code&amp;gt;preventDefault()&amp;lt;/code&amp;gt; das Standardverhalten zu unterdrücken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  event.preventDefault();&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der oben dargestellte Code führt zum Beispiel dazu dass kein Klick auf einen Link die enthaltene URL aufruft.&lt;br /&gt;
&lt;br /&gt;
==Wichtige Events==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Ereignisse sind die wichtigsten in der täglichen browser-seitingen Anwendungsentwicklung mit JavaScript.&lt;br /&gt;
&lt;br /&gt;
===DOMContentLoaded===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis beschreibt dass das HTML geladen und interpretiert wurde und das DOM und CSSOM erzeugt und gerendert wurde.&lt;br /&gt;
Es wird keine Aussage darüber gemacht ob weitere externe referenzierte Inhalte bereits geladen wurden, wie z.B. Bilder.&lt;br /&gt;
Das Ereignis wird direkt und ausschliesslich auf dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt als Ereignisziel ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Mit der Seite kann interagiert werden&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===load===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis besagt dass die gesamte Web-Seite inklusive aller externen referenziereten Inhalte gerendert wurden.&lt;br /&gt;
Im Gegensatz zu &amp;lt;code&amp;gt;DOMContentLoaded&amp;lt;/code&amp;gt; wird dieses Ereignis direkt und ausschliesslich auf dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener(&#039;load&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite wurde vollständig geladen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===click===&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn der Benutzer (mit der Maus) auf ein sichtbares DOM-Element klickt wird dieses Ereignis ausgelöst.&lt;br /&gt;
Bei der Propagierung dieses Ereignisses werden wie alle drei Ereignisphasen (Capturing, Bubbling, Target) komplett durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat auf etwas geklickt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mousemove, mouseover, mouseout===&lt;br /&gt;
Bei Mausbewegungen über DOM-Element wird konstant das Ereignis &amp;lt;code&amp;gt;mousemove&amp;lt;/code&amp;gt; mit den entsprechenden Koordinaten erzeugt.&lt;br /&gt;
Das Ereignis &amp;lt;code&amp;gt;mouseover&amp;lt;/code&amp;gt; wird erzeugt wenn die Maus in das Element eindringt, &amp;lt;code&amp;gt;mouseout&amp;lt;/code&amp;gt; wenn das Element wieder verlassen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseover&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus über etwas bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseout&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus von etwas weg bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===keydown, keyup, keypress===&lt;br /&gt;
&lt;br /&gt;
Bei Tastatureingaben auf einem DOM-Element durch den Benutzer werden die Ereignisse &amp;lt;code&amp;gt;keydown&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyup&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;keypress&amp;lt;/code&amp;gt; ausgelöst.&lt;br /&gt;
Die drei unterschiedlichen Ereignisse beschreiben die unterschiedlichen Phasen einer einzelnen Tastatureingabe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;keydown&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste gedrückt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keypress&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste betätigt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keyup&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste losgelassen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anmize8</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=35425</id>
		<title>JavaScript-Tutorium:Browser</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=JavaScript-Tutorium:Browser&amp;diff=35425"/>
		<updated>2014-11-09T09:11:31Z</updated>

		<summary type="html">&lt;p&gt;Anmize8: /* Erstellen von Elementen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ziel=&lt;br /&gt;
&lt;br /&gt;
Ziel dieses Tutoriums ist es die Grundlagen und Besonderheiten bei der JavaScript-Entwicklung im Browser zu vermitteln. Zur Veranschaulichung sind viele Code-Beispiele gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Einführung=&lt;br /&gt;
&lt;br /&gt;
==Native vs. Host==&lt;br /&gt;
&lt;br /&gt;
In einer JavaScript-Umgebung existieren immer zwei unterschiedliche Arten von Objekten und Funktionen.&lt;br /&gt;
&#039;&#039;&#039;Native Objekte&#039;&#039;&#039; werden von der JavaScript-Engine zur Verfügung gestellt und sind durch den ECMAScript-Standard abgedeckt.&lt;br /&gt;
&#039;&#039;&#039;Host-Objekte&#039;&#039;&#039; sind hingegen nicht zwingend standardisiert und werden von der Umgebung bereitgestellt.&lt;br /&gt;
Im Browser handelt es sich bei Host-Objekten um Schnittstellen für den Zugriff auf den Browser selbst und externe Geräte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==HTML5-Standard==&lt;br /&gt;
&lt;br /&gt;
Das bedeuteut, dass obwohl die Sprache selbst dem ECMAScript-Standard folgt, musste man bis vor wenigen Jahren &lt;br /&gt;
noch davon ausgehen dass sich die verfügbaren APIs je nach Browser sehr stark unterscheiden können. &lt;br /&gt;
Durch die steigende Entwicklungsgeschwindigkeit der Browser-Hersteller und den allgemein akzeptierten &lt;br /&gt;
[https://html.spec.whatwg.org/multipage/ HTML5-Standard] verbessert sich diese Situation jedoch zunehmend. &lt;br /&gt;
&lt;br /&gt;
Heutzutage kann man davon ausgehen, dass jeweils die neuesten Versionen von Firefox, Chrome und Internet Explorer&lt;br /&gt;
die DOM-API und viele der neu verfassten HTML5-APIs bereits standardkonform unterstützen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inline Code vs. externe Dateien==&lt;br /&gt;
&lt;br /&gt;
Eine im Browser angezeigte Web-Seite besteht meist aus HTML, CSS und JavaScript, wobei nur HTML zwingend verlangt ist.&lt;br /&gt;
Der JavaScript-Code kümmert sich normalerweise um die dynamischen Aspekte, wie Interaktionen und das Nachladen von Inhalten.&lt;br /&gt;
&lt;br /&gt;
Beim Besuch einer Website lädt der Browser das HTML-Dokument unter der angegeben URL herunter und evaluiert es.&lt;br /&gt;
Das Dokument enthält dann wiederum optional Verweise auf CSS-Dateien, Bilder, JavaScript-Dateien und andere Medien.&lt;br /&gt;
Neben Verweisen auf externen JavaScript-Code kann das Dokument auch Inline-Code-Blöcke enthalten. &lt;br /&gt;
Ob es sich um externe Dateien oder Inline-Code handelt wirkt sich auf die Ladezeiten und das Caching des Browser aus, &lt;br /&gt;
die enthaltenen Anweisungen und Ausdrücke werden jedoch nicht davon beeinflusst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039; Die Reihenfolge der eingebunden Code-Blöcke und angegebenen Dateiverweise ist allerdings wichtig,&lt;br /&gt;
da diese ebenso die Reihenfolge der Code-Ausführung darstellt.&lt;br /&gt;
&lt;br /&gt;
==JavaScript-Kontext==&lt;br /&gt;
&lt;br /&gt;
Für jede geladene Web-Seite, unabhängig davon ob sie im separaten Fenster oder als ein weiterer Tab angezeigt wird,&lt;br /&gt;
erzeugt der Browser einen separaten und isolierten JavaScript-Kontext, in dem der geladene Code ausgeführt wird.&lt;br /&gt;
Das bedeutet dass alle Objekte und Funktionen nur so lange am Leben sind bis die Seite neu geladen oder verlassen wird.&lt;br /&gt;
Ein Zugriff auf andere Seiten in anderen Fenstern oder Tabs ist aus Sicherheitsgründen nicht erlaubt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Window=&lt;br /&gt;
&lt;br /&gt;
Das globale Objekt &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; referenziert alle im Browser verfügbaren Objekte und Werte als Eigenschaften (native und host).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.Object);&lt;br /&gt;
console.log(window.XMLHttpRequest);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf globale Eigenschaften ist es nicht notwendig explizit &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; zu schreiben. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(Date == window.Date);&lt;br /&gt;
console.log(new Date());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle nicht innerhalb von Funktionen deklarierten Variablen werden automatisch an das globale Objekt angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var globaleVariable = &#039;global&#039;;&lt;br /&gt;
var globaleFunktion = function() {};&lt;br /&gt;
console.log(window.globaleVariable);&lt;br /&gt;
console.log(window.globaleFunktion);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Modifikation von Eigenschaften==&lt;br /&gt;
&lt;br /&gt;
Da es sich um ein normales Objekt handelt können die meisten Eigenschaften modifiziert und auch gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Veränderungen von globalen Eigenschaften sind nicht sinnvoll und können schwerwiegende Fehler verursachen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.Object = {};&lt;br /&gt;
var objekt = new Object();&lt;br /&gt;
&lt;br /&gt;
delete window.Array;&lt;br /&gt;
var array = new Array();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt wird vom Browser mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Window&amp;lt;/code&amp;gt; erzeugt, welche auch global verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.constructor == window.Window);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Popups und Frames==&lt;br /&gt;
&lt;br /&gt;
Neben dem globalen Fenster-Objekt kann eine Web-Seite beliebig viele weitere &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekte enthalten.&lt;br /&gt;
Dabei handelt es sich dann entweder um durch Code erzeugte Popups oder aber um Frames (besser bekannt als iframes).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.open(&#039;https://www.google.com&#039;, &#039;Google im Popup&#039;, &#039;width=400,height=300,resizable=yes&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Frames können entweder durch das entsprechende HTML oder aber auch wie im Code gezeigt programmatisch erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
==Browser-Schnittstellen==&lt;br /&gt;
&lt;br /&gt;
Abgesehen von den nativen Objekten notwendigen Objekte enthält &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt; wichtige Browser- und Geräte-Schinttstellen.&lt;br /&gt;
Dazu zählen zum Beispiel Funktionen um Dialoge im Browser zu öffnen oder aber sogar um Game-Controller zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var name = window.prompt(&#039;Wie ist Ihr Name?&#039;);&lt;br /&gt;
window.alert(&#039;Hello &#039; + name);&lt;br /&gt;
window.alert(&#039;Die aktuelle Seite ist &#039; + window.innerWidth + &#039;px breit&#039;);&lt;br /&gt;
&lt;br /&gt;
console.log(window.Gamepad);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine komplette Liste der verfügbaren Eigenschaften finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/de/docs/DOM/window dieser] MDN-Seite.&lt;br /&gt;
In den folgenden Abschnitten werden exemplarisch ein paar wichtige Objekte im Detail beschrieben.&lt;br /&gt;
&lt;br /&gt;
=Beispiel für Browser-Schnittstellen=&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; ist ein globales Objekt welches die aktuelle URL und ihre Bestandteile enthält und diese auch verändern kann.&lt;br /&gt;
Das Objekt wird analog zum &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt mithilfe der Konstruktorfunktion &amp;lt;code&amp;gt;Location&amp;lt;/code&amp;gt; erstellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(window.location.constructor == window.Location);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abfragen der URL===&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaft &amp;lt;code&amp;gt;href&amp;lt;/code&amp;gt; enhtält die gesamte aktuelle URL. Alternativ kann auch &amp;lt;code&amp;gt;location.toString()&amp;lt;/code&amp;gt; genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.href);&lt;br /&gt;
console.log(location.toString()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um einzelne Bestandteile der URL ermitteln zu können werden viele separate Eigenschaften bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(location.protocol);&lt;br /&gt;
console.log(location.host);&lt;br /&gt;
console.log(location.port);&lt;br /&gt;
console.log(location.pathname);&lt;br /&gt;
console.log(location.hash);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verändern der URL===&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften können nicht nur lesend genutzt werden, sondern auch um Änderungen an der aktuellen URL vorzunehmen.&lt;br /&gt;
&lt;br /&gt;
Mit der Ausname von &amp;lt;code&amp;gt;location.hash&amp;lt;/code&amp;gt; führen Änderungen der Eigenschaften zum Verlassen der aktuellen Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.protocol = &#039;http&#039;;&lt;br /&gt;
location.port = &#039;8080&#039;;&lt;br /&gt;
location.hash = &#039;#anker&#039;;&lt;br /&gt;
location.href = &#039;https://www.google.com&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des Weiteren gibt es ein paar Funktionen um die URL zu modifizieren oder aber die Seite neuzuladen:&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
location.assign(&#039;https://www.google.com&#039;);&lt;br /&gt;
location.reload(true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
Das globale &amp;lt;code&amp;gt;history&amp;lt;/code&amp;gt;-Objekt ermöglicht den programmatischen Zugriff auf den Browser-Verlauf.&lt;br /&gt;
Es werden Funktionen zur Verfügung gestellt um im Verlauf beliebig viele Schritte zurück und vorwärts zu gehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
history.back();&lt;br /&gt;
history.forward();&lt;br /&gt;
history.go(-3);&lt;br /&gt;
history.go(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Aus Sicherheitsgründen ist es nicht erlaubt auf Informationen einzelner Einträge im Verlauf zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
==Navigator==&lt;br /&gt;
&lt;br /&gt;
Für detaillierte Informationen über den aktuellen Client bzw. Browser existiert das &amp;lt;code&amp;gt;navigator&amp;lt;/code&amp;gt;-Objekt.&lt;br /&gt;
Die meistgenutzte Eigenschaft &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; ermöglicht das Feststellen des Browser-Herstellers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(navigator.userAgent);&lt;br /&gt;
console.log(navigator.battery);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Document Object Model=&lt;br /&gt;
&lt;br /&gt;
Im Browser können einem Fenster beliebig viele Dokumentenobjekte zugeordnet werden, mindestens aber ein Hauptdokument. &lt;br /&gt;
Das automatisch erstellte Hauptdokument wird über die globale Variable &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; zur Verfügung gestellt.&lt;br /&gt;
Die Schnittstelle für den Dokumentenzugriff wird durch das [http://www.w3.org/DOM/ Document Object Model] spezifiziert.&lt;br /&gt;
&lt;br /&gt;
==Objektmodell==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekt repräsentiert ein vom Browser interpretiertes HTML-Dokument als Objektmodell mit einer Baumstruktur.&lt;br /&gt;
Dabei werden Tags, Texte und Kommentare in Knoten umgewandelt, wobei Tag-Knoten wiederum Unterknoten haben können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&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;p&amp;gt;&lt;br /&gt;
      Text&lt;br /&gt;
      &amp;lt;!-- Kommentar --&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;Eingabe&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das oben dargestellte Markup wird bei der Interpretation durch den Browser in folgendes Objektmodell übersetzt:&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Knoten mit den Unterknoten &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;-Knoten mit dem Unterknoten &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;-Knoten mit einem Text-Unterknoten&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Knoten mit den Unterknoten &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;-Knoten mit einem Text-Unterknoten und einem Kommentar-Unterknoten&lt;br /&gt;
* Ein &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;-Knoten&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Achtet man bei HTML auf eine korrekte Einrückung so ist das resultierende Objektmodell meist klar erkennbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Markup-Korrekturen===&lt;br /&gt;
&lt;br /&gt;
Es ist zu beachten, dass es sich beim Objektmodell &#039;&#039;&#039;nicht&#039;&#039;&#039; um ein eindeutiges Abbild des originalen Markups handelt.&lt;br /&gt;
Der Unterschied wird besonders deutlich wenn man das Resultat von folgendem invalidem HTML untersucht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Titel&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;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Tabelle&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Objektmodell fügt zwischen dem &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt;- und dem &amp;lt;code&amp;gt;tr&amp;lt;/code&amp;gt;-Knoten einen &amp;lt;code&amp;gt;tbody&amp;lt;/code&amp;gt;-Knoten ein damit das HTML valide wird.&#039;&#039;&#039;Tipp:&#039;&#039;&#039; Im Browser kann man das Objektmodell einer Seite mit dem (DOM) Inspector der Entwicklerwerkzeuge betrachten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aufbau von Dokumenten==&lt;br /&gt;
&lt;br /&gt;
===Node-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jeder Knoten innerhalb eines Dokumentenobjekts ist direkt oder indirekt abgeleitet vom &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Konstruktor/-Prototypen.&lt;br /&gt;
Mit Ausnahme des Dokumentenobjekts selbst wird allen Knoten ein Dokument zugeordnet durch die &amp;lt;code&amp;gt;ownerDocument&amp;lt;/code&amp;gt;-Eigenschaft.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren hat jeder Knoten einen bestimmten numerischen Typen, welcher in der Eigenschaft &amp;lt;code&amp;gt;nodeType&amp;lt;/code&amp;gt; gespeichert wird.&lt;br /&gt;
Die folgende Liste enthält die gängigsten Typen von Dokumentenknoten denen man bei der Arbeit mit Dokumenten begegnet:&lt;br /&gt;
&lt;br /&gt;
* 1: ELEMENT_NODE&lt;br /&gt;
* 3: TEXT_NODE&lt;br /&gt;
* 8: COMMENT_NODE&lt;br /&gt;
* 9: DOCUMENT_NODE&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Referenz der Eigenschaften von Node-Objekten finden Sie auf &lt;br /&gt;
[https://developer.mozilla.org/en-US/docs/Web/API/Node dieser] MDN-Seite.&lt;br /&gt;
&lt;br /&gt;
===Document-Objekte===&lt;br /&gt;
&lt;br /&gt;
Ein Dokument wird mit dem &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Konstruktor erzeugt und ist selbst keinem Dokument, jedoch einem Fenster zugeordnet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.defaultView);&lt;br /&gt;
console.log(window == document.defaultView);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Dokument selbst repräsentiert kein HTML-Element, verweist aber auf das &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Element mit der Eigenschaft &amp;lt;code&amp;gt;documentElement&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;
console.log(document.documentElement);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktionen eines Dokuments ist es möglich neue &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekte zu erstellen, einzufügen und diese zu suchen.&lt;br /&gt;
===Element-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jedes HTML-Tag wird in einen Knoten übersetzt welcher mit dem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Konstruktor erzeugt wird.&lt;br /&gt;
Element-Objekte besitzen Schnittstellen um auf Eigenschaften eines HTML-Tags zuzugreifen und diese zu modifizieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
console.log(document.documentElement.tagName);&lt;br /&gt;
console.log(document.documentElement.innerHTML);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ebenso wie Dokumente können Element-Objekten weitere Node-Objekte als Unterknoten angehängt und nach ihnen gesucht werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Comment-Objekte===&lt;br /&gt;
&lt;br /&gt;
HTML-Kommentare werden in Comment-Objekte umgewandelt welche mit dem &amp;lt;code&amp;gt;Comment&amp;lt;/code&amp;gt;-Konstruktor erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Text-Objekte===&lt;br /&gt;
&lt;br /&gt;
Texte werden in &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt;-Objekte umgewandelt, wobei auf diese auch durch übergeordnete Elemente zugegriffen werden kann.&lt;br /&gt;
Normalerweise wird bei der Anwendungsprogrammierung mit JavaScript nicht direkt mit Text-Knoten gearbeitet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Erstellen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Neue Element-Objekte werden über die Schnittstelle eines &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt;-Objekts unter der Angabe eines Tag-Namens erzeugt.&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
console.log(absatz.tagName);&lt;br /&gt;
console.log(absatz.nodeType);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei der Erstellung wird das neue Element dem aufgerufenen Dokument als zugehörig markiert durch die Eigenschaft &amp;lt;code&amp;gt;ownerDocument&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;
&lt;br /&gt;
var block = document.createElement(&#039;div&#039;);&lt;br /&gt;
console.log(block.ownerDocument);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Schnittstelle eines Dokuments nicht mit HTML-Standards gekoppelt ist, können beliebige Tag-Namen vergeben werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var meinElement = document.createElement(&#039;mein-element&#039;);&lt;br /&gt;
console.log(meinElement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Suchen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Besonders wichtig bei der Arbeit mit Dokumenten ist die Suche von einzelnen oder mehreren Elementen.&lt;br /&gt;
Aufgrund dessen haben sich die Schnittstellen für die Suche im Browser über die letzten Jahre rapide verbessert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vorgefertige Kriterien===&lt;br /&gt;
&lt;br /&gt;
Die Suche nach einem eindeutigen Element kann mithilfe einer ID ausgeführt werden, insofern das HTML-Element eine besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var inhalt = document.getElementById(&#039;inhalt&#039;);&lt;br /&gt;
console.log(inhalt);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einer Suche wird entweder das Dokument selbst oder aber ein beliebiges Element als Ausgangspunkt verwendet.Es wird dann jeweils immer nur unterhalb des Ausgangsknotens gesucht, was sich positiv auf die Performance auswirken kann.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var inhalt = document.getElementById(&#039;inhalt&#039;);&lt;br /&gt;
var kommentare = inhalt.getElementById(&#039;kommentare&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Werden Elemente einer bestimmten Art gesucht so kann der Tag-Name oder aber die HTML-Klasse als Kriterium genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var elemente = document.getElementsByTagName(&#039;body&#039;);&lt;br /&gt;
console.log(elemente);&lt;br /&gt;
&lt;br /&gt;
var kommentare = document.getElementsByClassName(&#039;kommentar&#039;);&lt;br /&gt;
console.log(kommentare.length);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei dieser Art von Suche wird eine &amp;lt;code&amp;gt;NodeList&amp;lt;/code&amp;gt; als Ergebnis zurückgeliefert, ein Array-artiges Objekt von Node-Elementen.Einzelne Elemente dieser Liste können entweder über eine Funktion oder aber über einen Index abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.getElementsByTagName(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
console.log(absaetze.item(0));&lt;br /&gt;
console.log(absaetze.item(0) == absaetze[0]);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Verweise===&lt;br /&gt;
Jedes Element verweist im Sinne einer Baumstruktur auf seine übergeordneten und untergeordneten Knoten und seine Nachbaren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.getElementsByTagName(&#039;body&#039;).item(0);&lt;br /&gt;
for (var i = 0; i &amp;lt; body.childNodes.length; i++) {&lt;br /&gt;
  console.log(body.childNodes[i]);&lt;br /&gt;
}&lt;br /&gt;
console.log(body.parentNode);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Referenzen können genutzt werden um sich durch das Dokument zu bewegen und bestimmte Elemente zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var container = [];&lt;br /&gt;
var absaetze = document.getElementsByTagName(&#039;p&#039;);&lt;br /&gt;
for (var i = 0; i &amp;lt; absaetze.length; i++) {&lt;br /&gt;
  container.push(absaetze[i].parentNode);&lt;br /&gt;
}&lt;br /&gt;
console.log(container);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===CSS-Selektoren===&lt;br /&gt;
&lt;br /&gt;
Die Suche mithilfe von vorgefertigen Kriterien und Verweisen auf benachbarte Elemente hat gewisse Limitierungen.&lt;br /&gt;
Aufgrund dessen enstand durch bekannte Bibliotheken wie jQuery das Konzept von Query-Selektoren, welche heute als &lt;br /&gt;
[http://www.w3.org/TR/CSS2/selector.html CSS-Selektoren] standardisiert werden und in vielen Browser verfügbar sind.&lt;br /&gt;
&lt;br /&gt;
Eine CSS-Selektorgruppe beschreibt eine beliebige Menge an Kriterien, die auf ein oder mehrere HTML-Elemente zutrifft.&lt;br /&gt;
Der Name wurde so gewählt da CSS-Selektoren ebenso in Stylesheets genutzt werden um eine Menge an Elementen auszuwählen.&lt;br /&gt;
Aufgrund der Kombinierbarkeit einzelner CSS-Selektoren ergibt sich eine sehr mächtige Suchfunktionalität.&lt;br /&gt;
&lt;br /&gt;
Im Browser gibt zwei verschiedene Funktionen um Elemente mithilfe von CSS-Selektoren zu suchen:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelector&amp;lt;/code&amp;gt; liefert das erste Element zurück welches die Kriterien erfüllt&lt;br /&gt;
* &amp;lt;code&amp;gt;document.querySelectorAll&amp;lt;/code&amp;gt; liefert alle Elemente zurück welche die Kriterien erfüllen in Form einer &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;-Liste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Mögliche Kriterien====&lt;br /&gt;
&lt;br /&gt;
Das einfachste Kriterium für einen CSS-Selektor ist die Angabe eines Tag-Namen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absaetze = document.querySelectorAll(&#039;p&#039;);&lt;br /&gt;
console.log(absaetze);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Angabe einer ID eines HTML-Elements erfolgt durch eine vorangestellte Raute (&amp;lt;code&amp;gt;#&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;
var inhalt = document.querySelector(&#039;#inhalt&#039;);&lt;br /&gt;
console.log(inhalt);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Klassen-Selektoren werden durch einen vorangestellten Punkt (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;) gekennzeichnet. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var kommentare = document.querySelectorAll(&#039;.kommentar&#039;);&lt;br /&gt;
console.log(kommentare);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe von eckigen Klammern (&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;) werden beliebige Attribute als Kriterium definiert.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var textFelder = document.querySelectorAll(&#039;[type=&amp;quot;text&amp;quot;]&#039;);&lt;br /&gt;
console.log(textFelder);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wird kein Attributwert vergeben, wird lediglich auf die Existenz des Attributs geprüft.&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var versteckteElemente = document.querySelectorAll(&#039;[hidden]&#039;);&lt;br /&gt;
console.log(versteckteElemente);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Mächtigkeit von CSS-Selektoren ergibt sich vor allem durch die beliebige Kombinationsmöglichkeiten von Selektoren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wichtigeKommentare = document.querySelectorAll(&#039;.kommentar.wichtig&#039;);&lt;br /&gt;
console.log(wichtigeKommentare);&lt;br /&gt;
var versteckteAbsaetze = document.querySelectorAll(&#039;p[hidden]&#039;);&lt;br /&gt;
console.log(textFelder);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist sogar möglich Kriterien für übergeordnete Elemente zu definieren indem man die Selektoren durch Leerzeichen trennt.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var versteckteElementeInnerhalbVonKommentaren = document.querySelectorAll(&#039;.kommentar [hidden]&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Die Komplexität einer CSS-Selektorgruppe beeinflusst die Performance einer Suche.&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine vollständige Erklärung der Funktionsweise von CSS-Selektoren ist nicht Ziel dieses Tutoriums.&lt;br /&gt;
Diese Einführung dient lediglich dazu ein grundsätzliches Verständnis für den Umgang mit Selektoren zu vermitteln.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hinzufügen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Neu erstellte Elemente können im Dokument als untergeordnete Knoten mithilfe von &amp;lt;code&amp;gt;appendChild()&amp;lt;/code&amp;gt; eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
document.documentElement.appendChild(absatz);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dazu muss immer der künftig übergeordnete Knoten angesprochen werden wenn das Element an einer bestimmten Stelle landen soll.&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var absatz = document.querySelector(&#039;p&#039;);&lt;br /&gt;
var unterAbsatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
absatz.appendChild(unterAbsatz);    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modifizieren von Elementen==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der entsprechenden DOM-Schnittstellen können Text, Attribute sowie das Styling von Elementen beeinflusst werden.&lt;br /&gt;
&lt;br /&gt;
===Ändern von Text===&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt mit nur einem &amp;lt;code&amp;gt;Text&amp;lt;/code&amp;gt;-Unterknoten stellt seinen Text über der Eigenschaft &amp;lt;code&amp;gt;textContent&amp;lt;/code&amp;gt; zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var p = document.querySelector(&#039;p&#039;);&lt;br /&gt;
console.log(p.textContent);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Text kann über diese Eigenschaft nicht nur gelesen sondern ebenso beliebig modifiziert werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var p = document.querySelector(&#039;p&#039;);&lt;br /&gt;
p.textContent = &#039;Hallo Welt&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von HTML===&lt;br /&gt;
&lt;br /&gt;
Eine wesentlich mächtigere Weise um den Inhalt eines Elements zu beeinflussen stellt die Eigenschaft &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; dar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;Hallo Welt&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neben einfachen Text-Änderungen lässt sich mithilfe dieser Eigenschaft das gesamte enthaltene HTML beeinflussen.Anstatt also mithilfe der DOM-Schnittstelle einzelne Elemente zu erzeugen kann einfach Markup als Wert zugewiesen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.innerHTML = &#039;&amp;lt;p&amp;gt;Hallo &amp;lt;strong&amp;gt;Welt!&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von Attributen===&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff auf die Attribute eines HTML-Elements gibt es die Funktionen &amp;lt;code&amp;gt;getAttribute()&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;setAttribute()&amp;lt;/code&amp;gt;.&lt;br /&gt;
Beide akzeptieren als erstes Argument den Namen des Attributs, der Setter akzeptiert außerdem einen zu setzenden Wert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.createElement(&#039;p&#039;);&lt;br /&gt;
absatz.innerHTML = &#039;Tolle Website!&#039;;&lt;br /&gt;
absatz.setAttribute(&#039;class&#039;, &#039;kommentar&#039;);&lt;br /&gt;
document.querySelector(&#039;body&#039;).appendChild(p);&lt;br /&gt;
&lt;br /&gt;
console.log(p.getAttribute(&#039;class&#039;));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem kann mithilfe der Funktion &amp;lt;code&amp;gt;hasAttribute()&amp;lt;/code&amp;gt; nach der Existenz eines Attributs gefragt werden.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var eingabefeld = document.querySelector(&#039;input[type=text]&#039;);&lt;br /&gt;
console.log(&#039;Ist das Eingabefeld Pflicht? &#039; + eingabefeld.hasAttribute(&#039;required&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Eine besondere Häufigkeit bei Attributsänderungen ist das Hinzufügen und/oder Entfernen von Klassen.&lt;br /&gt;
Dafür gibt es in neueren Browsern die Liste &amp;lt;code&amp;gt;classList&amp;lt;/code&amp;gt; auf jedem &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt;-Objekt, welche die Arbeit erleichtert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var absatz = document.querySelector(&#039;p&#039;);&lt;br /&gt;
absatz.classList.push(&#039;wichtig&#039;);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ändern von CSS-Eigenschaften===&lt;br /&gt;
&lt;br /&gt;
Neben dem Document Object Model existiert außerdem der [http://dev.w3.org/csswg/cssom/ CSS Object Model Standard] &lt;br /&gt;
welcher die Schnittstelle für den Zugriff auf CSS-Eigenschaften von DOM-Objekten standardisiert.&lt;br /&gt;
&lt;br /&gt;
Ein jedes DOM-Element vom Typ &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; besitzt eine Eigenschaft &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; welche alle CSS-Eigenschaften beherbergt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
console.log(body.style.color);&lt;br /&gt;
console.log(body.style.padding);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaften spiegeln die in Stylesheets definierten Regeln wieder, jedoch inklusive dem kaskadierenden Charakter.Das heisst dass ein Element-Objekt nicht zwingend selbst eine &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt; besitzt, diese jedoch für die Anzeige vererbt bekommt.&lt;br /&gt;
&lt;br /&gt;
Die Eigenschaften können ebenso beliebig modifiziert werden, was zu einer sofortigen Anpassung der Darstellung führt. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var body = document.querySelector(&#039;body&#039;);&lt;br /&gt;
body.style.backgroundColor = &#039;#AAF&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Löschen von Elementen==&lt;br /&gt;
&lt;br /&gt;
Ebenso wie neue Elemente einem Dokument hinzugefügt werden können, so können diese oder bestehende auch gelöscht werden.&lt;br /&gt;
Dazu muss man den übergeordneten Knoten ansteuern und mithilfe von &amp;lt;code&amp;gt;removeChild()&amp;lt;/code&amp;gt; die Entfernung durchführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var liste = document.querySelector(&#039;ul&#039;);&lt;br /&gt;
var listenelement = liste.querySelector(&#039;li&#039;);&lt;br /&gt;
liste.removeChild(listenelement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Ist einem der übergeordnete Knoten nicht bekannt so kann diesen mithilfe der Knotenverweise ermitteln.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var entferneKnoten = function(knoten) {&lt;br /&gt;
  if (!knoten.parentNode) {&lt;br /&gt;
    throw new Error(&#039;no parent node&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  knoten.parentNode.removeChild(knoten);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var listenelement = document.querySelector(&#039;li&#039;);&lt;br /&gt;
entferneKnoten(listenelement);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=DOM Events=&lt;br /&gt;
&lt;br /&gt;
==Ereignisorientierte Programmierung==&lt;br /&gt;
&lt;br /&gt;
Für die Verarbeitung von stets verfügbaren Informationen eignet sich eine sequentiell ablaufende Folge von Instruktionen.&lt;br /&gt;
Ergeben sich Informationen jedoch nicht deterministisch zur Laufzeit bietet sich die ereignisorientierte Programmierung an.&lt;br /&gt;
Hierbei wird nicht mehr aktiv auf eine Information gewartet, das Programm wird benachrichtigt wenn ein Ereignis eintritt.&lt;br /&gt;
Somit gibt es nicht nur einen einzelnen Kontrollfluss, sondern beliebig viele welche sogar auch parallel ablaufen können.&lt;br /&gt;
&lt;br /&gt;
==Ereignisse im Browser==&lt;br /&gt;
&lt;br /&gt;
Bei der Betrachtung von und der Interaktion mit Websites im Browser ergeben sich sehr viele unterschiedliche Ereignisse.&lt;br /&gt;
Zunächst wird die HTML-Seite geladen und gerendert, danach geschieht dies für alle anderen referenzierten Medien.&lt;br /&gt;
Diese Vorgänge lösen bereits nicht deterministische Ereignisse aus welche alleine durch den Browser verursacht werden.&lt;br /&gt;
So gibt es für die meisten Medien ein Ereignis welches beschreibt dass diese fertig geladen und gerendert wurden.&lt;br /&gt;
&lt;br /&gt;
Sobald der Browser beginnt eine Web-Seite zu rendern können Ereignisse von Seiten des Benutzers eintreten.&lt;br /&gt;
Nahezu jede Benutzerinteraktion löst im Browser ein Ereignis aus welches wiederum in weiteren Aktionen resultiert.&lt;br /&gt;
Klickt der Benutzer auf einen Link so ist das ein Ereignis welches zur Folge hat dass die geklickte URL geladen wird.&lt;br /&gt;
Wird ein Scroll-Balken vom Benutzer bewegt ergibt sich daraus ein Ereignis welches den Browser in Folge scrollen lässt.&lt;br /&gt;
&lt;br /&gt;
Zu den wichtigsten Arten von durch den Benutzer ausgelösten Ereignissen zählen: &lt;br /&gt;
&lt;br /&gt;
* Mausbewegungen und -klicks&lt;br /&gt;
* Tastatureingaben&lt;br /&gt;
* Scrolling&lt;br /&gt;
&lt;br /&gt;
Eine vollständige Auflistung der möglichen Ereignisse im Browser finden Sie auf [https://developer.mozilla.org/en-US/docs/Web/Events dieser] MDN-Seite. &lt;br /&gt;
Nebem dem Browser und dem Benutzer gibt es auch andere Auslöser wie zum Beispiel mit der Website verbundene Server/Backends. &lt;br /&gt;
&lt;br /&gt;
==Aufbau eines Ereignisses==&lt;br /&gt;
&lt;br /&gt;
Im Sinne einer standardisierten Ereignisverarbeitung besitzt ein im Browser auftretendes Ereignis immer drei folgende Merkmale: &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Name:&#039;&#039;&#039; eine Zeichenkette die das Ereignis in der Regel in der Gegenwart beschreibt, z.B. &amp;quot;click&amp;quot; oder &amp;quot;mousemove&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Daten:&#039;&#039;&#039; ein Objekt mit einer pro Ereignis festgelegten Struktur, welches die wichtigsten Ereignisdaten enthält&lt;br /&gt;
* &#039;&#039;&#039;Ereignis-Ziel:&#039;&#039;&#039; ein Objekt das als Ziel des Ereignis festgelegt wird; in der Regel handelt es sich um DOM-Elemente&lt;br /&gt;
&lt;br /&gt;
Beispiel für ein solches Ereignis: Eine &#039;&#039;&#039;Tastatureingabe&#039;&#039;&#039; in einem &#039;&#039;&#039;Formularfeld&#039;&#039;&#039;, bei dem das Zeichen &#039;&#039;&#039;@&#039;&#039;&#039; eingegeben wird. &lt;br /&gt;
&lt;br /&gt;
==Phasen der Ereignispropagierung==&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei dem ursprünglichen Ziel eines Ereignisses um ein DOM-Objekt werden in der Regel drei Phasen durchlaufen.&lt;br /&gt;
&lt;br /&gt;
===Capturing-Phase===&lt;br /&gt;
&lt;br /&gt;
In Phase 1, der sogenannten &#039;&#039;&#039;Capturing-Phase&#039;&#039;&#039; wird zuerst ein Ereignis mit dem obersten Knoten im Dokument als Ziel erzeugt.&lt;br /&gt;
Dabei handelt es sich in der Regel um das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt, welches alle andere DOM-Objekte als Unterknoten enthält.&lt;br /&gt;
Das wird schrittweise wiederholt für jeden untergeordneten Knoten auf dem Pfad zum eigentlichen Ziel des Ereignisses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
+ window (optional)         - Ereignis mit window als aktueller Ziel&lt;br /&gt;
  + document                - Ereignis mit body als aktueller Ziel&lt;br /&gt;
    + body                  - Ereignis mit body als aktueller Ziel&lt;br /&gt;
      + p (ursprüngliches Ziel)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; Bei manchen Ereignissen wird das &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als oberstes Objekt in die Hierarchie der Ziele mit aufgenommen.&lt;br /&gt;
&lt;br /&gt;
===Target-Phase===&lt;br /&gt;
&lt;br /&gt;
Ist der Browser nun beim ursprünglichen Ziel angelangt wird in Phase 2 gewechselt, der sogenannten &#039;&#039;&#039;Target-Phase&#039;&#039;&#039;.&lt;br /&gt;
Dabei wird ein einzelnes Ereignis erzeugt, für welches das ursprüngliche DOM-Objekt als Ziel verwendet wird.&lt;br /&gt;
&lt;br /&gt;
===Bubbling-Phase===&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss der Ereignispropagierung wechselt der Browser in Phase 3, der sogenannten &#039;&#039;&#039;Bubbling-Phase&#039;&#039;&#039;.&lt;br /&gt;
Hierbei wird der Pfad der Capturing-Phase in umgekehrter Richtung durchlaufen und jeweils wieder ein Ereignis erzeugt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung:&#039;&#039;&#039; In Bibliotheken wie jQuery hat man nur Zugriff auf die Bubbling-Phase, nicht auf die Capturing-Phase.&lt;br /&gt;
&lt;br /&gt;
===Browser-Unterschiede===&lt;br /&gt;
&lt;br /&gt;
Die Capturing- und Bubbling-Phasen bilden in ihrer Implementierung die Tatsache ab dass &lt;br /&gt;
wenn ein Ereignis auf einem Element stattfindet, dieses Ereignis ebenso für das Element umgebende Elemente gültig ist.&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039; Wird ein Mensch in einem Krankenhaus geboren, so wird dieser auch in einer Stadt geboren, in einem Land geboren.&lt;br /&gt;
&lt;br /&gt;
Einer der beiden oben beschriebenen Phasen wäre allerdings vollkommen ausreichend für die Ereignisvearbeitung.&lt;br /&gt;
Aufgrund von unterschiedlichen Implementierungen der Browser-Hersteller existieren heutzutage jedoch beide gleichzeitig.&lt;br /&gt;
&lt;br /&gt;
===Globale Ereignisse===&lt;br /&gt;
&lt;br /&gt;
Beschreibt ein Ereignis ein globales Geschehen wird oftmals das &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt als Ereignisziel verwendet.&lt;br /&gt;
In diesen Fällen ist es möglich dass weder Capturing- noch eine Bubbling-Phase durchlaufen werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Das Ergeinis &amp;quot;DOMContentLoaded&amp;quot; beschreibt, dass eine Seite abgesehen siner externen Medien fertig geladen wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ereignisverarbeitung==&lt;br /&gt;
&lt;br /&gt;
Mithilfe der DOM-Schnittstelle erhält man die Möglichkeit Ereignisse selbst zu verarbeiten und darauf zu reagieren.&lt;br /&gt;
&lt;br /&gt;
===Anmeldung===&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt; kann auf jedem DOM-Objekt, dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt und dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt aufgerufen werden.&lt;br /&gt;
Dabei ist das Objekt auf dem die Funktion aufgerufen das &#039;&#039;&#039;Ziel&#039;&#039;&#039; des Ereignisses welches verarbeiten werden soll.&lt;br /&gt;
&lt;br /&gt;
Die Funktion akzeptiert außerdem die folgenden drei Argumente: &lt;br /&gt;
* den &#039;&#039;&#039;Namen des Ereignisses&#039;&#039;&#039; das man verarbeiten möchte in Form eines Strings&lt;br /&gt;
* die &#039;&#039;&#039;Callback-Funktion&#039;&#039;&#039; welche das Ereignis-Objekt erwartet und den Code zur Verarbeitung enthält&lt;br /&gt;
* ein optionales &#039;&#039;&#039;Flag&#039;&#039;&#039; das bestimmt ob das Ereignis in der Capturing- oder Bubbling-Phase verarbeitet werden soll&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist das Flag &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, was bedeutet dass das Ereignis in der Bubbling-Phase verarbeitet wird.&lt;br /&gt;
Durch einen Aufruf wird für ein Ereignis auf einem Ziel ein sogenannter Event-Listener in Form einer Funktion angemeldet.&lt;br /&gt;
Jedes Mal wenn das Ereignis auftritt wird die Callback-Funktion aufgerufen und das entsprechende Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichWennSeiteGeladenIst = function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite ist nun fertig geladen&#039;);&lt;br /&gt;
  console.log(event);&lt;br /&gt;
}&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, informiereMichWennSeiteGeladenIst, false);&lt;br /&gt;
&lt;br /&gt;
document.querySelector(&#039;body&#039;).innerHTML = &#039;&amp;lt;p&amp;gt;&amp;lt;a id=&amp;quot;link1&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
var link = document.querySelector(&#039;#link1&#039;);&lt;br /&gt;
var informiereMichWennLinkGeklicktWird = function(event) {&lt;br /&gt;
  console.log(&#039;Der Link wurde geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
link.addEventListener(&#039;click&#039;, informiereMichWennLinkGeklicktWird);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Phasen der Ereignispropagierung kann man Ereignisse global verarbeiten unabhängig davon wo sie stattgefunden haben.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.querySelector(&#039;body&#039;).innerHTML = &#039;&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 1&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Link 2&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
var informiereMichWennGeklicktWird = function(event) {&lt;br /&gt;
  console.log(&#039;Benutzer hat irgendwo auf der Seite geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;click&#039;, informiereMichWennGeklicktWird);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Callbacks===&lt;br /&gt;
&lt;br /&gt;
Ein Callback ist eine Rückruffunktion welche an ein andere Funktion übergeben wird und zu späteren Zeitpunkten ggf. ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichWennMausBewegtWird = function() {&lt;br /&gt;
  console.log(&#039;Benutzer hat geklickt&#039;);&lt;br /&gt;
};&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, informiereMichWennMausBewegtWird);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist jedoch nicht garantiert dass eine übergebene Callback-Funktion überhaupt jemals ausgeführt wird.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var informiereMichFallsEsOktoberIst = function(event) {&lt;br /&gt;
  console.log(&#039;Es ist Oktober&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var istEsOktober = function(callback) {&lt;br /&gt;
  if (new Date().getMonth() == 9) callback();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
istEsOktober(informiereMichFallsEsOktoberIst);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Callback-Mechanismen unterstützen den Umgang mit nicht deterministischen und asynchronen Ereignissen in JavaScript.&lt;br /&gt;
&lt;br /&gt;
===Ereignis-Objekte===&lt;br /&gt;
&lt;br /&gt;
Jeder Event-Listener-Callback-Funktion wird beim Aufruf ein für ein Ereignis spezifisches Ereignis-Objekt übergeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
  console.log(event.screenX);&lt;br /&gt;
  console.log(event.screenY);&lt;br /&gt;
  console.log(event.button);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Dieses Objekt enthält neben spezifischen auch generelle Ereignisinformationen wie zum Beispiel das Ereignis-Ziel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinsichtlich der drei Phasen die ein Ereignis durchlaufen kann unterscheidet man zwischen ursprünglichem und aktuellem Ziel.Das aktuelle Ziel ist das auf welchem das Ereignis aktuell ausgelöst wird und das ursprüngliche das wo es stattgefunden hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(event.target); // ursprüngliches Ziel&lt;br /&gt;
  console.log(event.currentTarget); // aktuelles Ziel&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das aktuelle Ziel &amp;lt;code&amp;gt;currentTarget&amp;lt;/code&amp;gt; entspricht also immer dem Objekt auf dem man den Event-Handler angemeldet hat.&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Abmeldung===&lt;br /&gt;
&lt;br /&gt;
Mithilfe der Funktion &amp;lt;code&amp;gt;removeEventListener&amp;lt;/code&amp;gt; kann ein zuvor angemeldeter Event-Listener wieder von einem Objekt entfernt werden.&lt;br /&gt;
Diese Funktion benötigt im Gegensatz zu &amp;lt;code&amp;gt;addEventListener&amp;lt;/code&amp;gt;nur zwei Argumente: Den Ereignis-Namen und die Event-Listener-Funktion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var loggeMausBewegungen = function(event) {&lt;br /&gt;
  console.log(event);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, loggeMausBewegungen);&lt;br /&gt;
document.removeEventListener(&#039;mousemove&#039;, loggeMausBewegungen);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Standardverhalten===&lt;br /&gt;
&lt;br /&gt;
Nachdem alle Ereignisse erzeugt und verarbeitet wurden führt der Browser gegegebenfalls eine sogenannte &amp;quot;Default Action&amp;quot; aus.&lt;br /&gt;
Im Wesentlichen ist eine solche Aktion das Standardverhalten des Browsers als Reaktion auf das eingetretene Ereignis.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* Benutzer klickt auf einen Link -&amp;gt; der Browser lädt die URL&lt;br /&gt;
* Benutzer führt Tastatureingaben in einem Feld aus -&amp;gt; der Browser fügt die Zeichen dem Feld hinzu&lt;br /&gt;
&lt;br /&gt;
Innerhalb einer Event-Listener-Funktion ist es möglich mithilfe von &amp;lt;code&amp;gt;preventDefault()&amp;lt;/code&amp;gt; das Standardverhalten zu unterdrücken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  event.preventDefault();&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der oben dargestellte Code führt zum Beispiel dazu dass kein Klick auf einen Link die enthaltene URL aufruft.&lt;br /&gt;
&lt;br /&gt;
==Wichtige Events==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Ereignisse sind die wichtigsten in der täglichen browser-seitingen Anwendungsentwicklung mit JavaScript.&lt;br /&gt;
&lt;br /&gt;
===DOMContentLoaded===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis beschreibt dass das HTML geladen und interpretiert wurde und das DOM und CSSOM erzeugt und gerendert wurde.&lt;br /&gt;
Es wird keine Aussage darüber gemacht ob weitere externe referenzierte Inhalte bereits geladen wurden, wie z.B. Bilder.&lt;br /&gt;
Das Ereignis wird direkt und ausschliesslich auf dem &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;-Objekt als Ereignisziel ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Mit der Seite kann interagiert werden&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===load===&lt;br /&gt;
&lt;br /&gt;
Dieses Ereignis besagt dass die gesamte Web-Seite inklusive aller externen referenziereten Inhalte gerendert wurden.&lt;br /&gt;
Im Gegensatz zu &amp;lt;code&amp;gt;DOMContentLoaded&amp;lt;/code&amp;gt; wird dieses Ereignis direkt und ausschliesslich auf dem &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;-Objekt ausgelöst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener(&#039;load&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Die Seite wurde vollständig geladen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===click===&lt;br /&gt;
&lt;br /&gt;
Jedes Mal wenn der Benutzer (mit der Maus) auf ein sichtbares DOM-Element klickt wird dieses Ereignis ausgelöst.&lt;br /&gt;
Bei der Propagierung dieses Ereignisses werden wie alle drei Ereignisphasen (Capturing, Bubbling, Target) komplett durchlaufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;click&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat auf etwas geklickt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mousemove, mouseover, mouseout===&lt;br /&gt;
Bei Mausbewegungen über DOM-Element wird konstant das Ereignis &amp;lt;code&amp;gt;mousemove&amp;lt;/code&amp;gt; mit den entsprechenden Koordinaten erzeugt.&lt;br /&gt;
Das Ereignis &amp;lt;code&amp;gt;mouseover&amp;lt;/code&amp;gt; wird erzeugt wenn die Maus in das Element eindringt, &amp;lt;code&amp;gt;mouseout&amp;lt;/code&amp;gt; wenn das Element wieder verlassen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;mousemove&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseover&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus über etwas bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;mouseout&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat die Maus von etwas weg bewegt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===keydown, keyup, keypress===&lt;br /&gt;
&lt;br /&gt;
Bei Tastatureingaben auf einem DOM-Element durch den Benutzer werden die Ereignisse &amp;lt;code&amp;gt;keydown&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;keyup&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;keypress&amp;lt;/code&amp;gt; ausgelöst.&lt;br /&gt;
Die drei unterschiedlichen Ereignisse beschreiben die unterschiedlichen Phasen einer einzelnen Tastatureingabe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;keydown&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste gedrückt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keypress&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste betätigt&#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;keyup&#039;, function(event) {&lt;br /&gt;
  console.log(&#039;Der Benutzer hat eine Taste losgelassen&#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anmize8</name></author>
	</entry>
</feed>