DOM
Transcription
DOM
Prof. Dr. Th. Letschert CS1024 Internetbasierte Systeme Bachelor of Science (Informatik) Clientseitige Verarbeitung II DOM : Document Object Model DOM http://www.w3.org/DOM DOM – Document Object Model DOM ist ein W3C-Standard Document Es geht um den Zugriff auf Dokumente Object Die Dokumente sind baumartig in Objekt-Hierarchien organisiert. Dokumente sind typischerweise HTML oder XML Model = universelle Schnittstelle Der Standard beschreibt ein „Modell“ von strukturierten Dokumenten, die sich als universelle, Sprach- und System-unabhängige Schnittstelle zum Dokument zeigt. IBS - DOM 2 DOM DOM – Um was geht es Dom definiert wir – lesend und/oder schreibend - auf Dokumente zugegriffen werden kann Die Definition ist Browser unabhängig Die Definition bezieht sich nicht nur auf HTML <script type="text/javascript"> function fib(x) { if (x < 1) return 0; if (x == 1 || x == 2) return 1; return fib(x-1) + fib(x-2); } Dokument / darin alle Formulare / davon das erste (Index 0) Dokument / darin Element mit Id „ausgabe“ / davon der HTML-code window.onload = function(){ document.forms[0].elements[0].onkeyup = function(){ document.getElementById("ausgabe").innerHTML = fib(document.forms[0].elements[0].value); } } </script> Dokument / darin alle Formulare / davon das erste (Index 0) / davon der Wert DOM Ausdrücke navigieren im Dokument Das Dokument wird dabei als Baum aufgefasst IBS - DOM 3 DOM DOM – Beispiel <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Dom Beispiel</title> </head> <body> <h3>DOM Beispiel</h3> <form action= "" > <input type= "password" name= "Passwort" /> <input type= "button" value= "OK" id= "okButton" /> </form> <script type= "text/javascript" > document.getElementById( "okButton").onclick = function() { alert( "Das soll ein Passwort sein: " + document.getElementsByName( "Passwort")[0].value ); }; </script> </body> </html> Was passiert hier? IBS - DOM 4 DOM DOM – Beispiel <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Dom Beispiel</title> </head> <body> <h3>DOM Beispiel</h3> <form action= "" > <input type= "password" name= "Passwort" /> <input type= "button" value= "OK" id= "okButton" /> </form> <script type= "text/javascript" > document.getElementById( "okButton").onclick = function() { return function (pwdElement) { alert( "Das soll ein Passwort sein: " + pwdElement.value ); } }(document.getElementsByName( "Passwort")[0]); </script> </body> </html> Warum funktioniert das NICHT ? IBS - DOM 5 DOM DOM – Beispiel <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Dom Beispiel</title> </head> <body> <h3>DOM Beispiel</h3> <form action= "" > <input type= "password" name= "Passwort" /> <input type= "button" value= "OK" id= "okButton" /> </form> <script type= "text/javascript" > document.getElementById( "okButton").onclick = function(pwdElement) { return function () { alert( "Das soll ein Passwort sein: " + pwdElement.value ); } }(document.getElementsByName( "Passwort")[0]); </script> </body> </html> Und wie ist es hiermit ? IBS - DOM 6 DOM DOM – Beispiel <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Dom Beispiel</title> </head> <body> <h3>DOM Beispiel</h3> <form action= "" > <input type= "password" name= "Passwort" /> <input type= "button" value= "OK" id= "okButton" /> </form> <script type= "text/javascript" > document.getElementById( "okButton").onclick = function(value) { return function () { alert( "Das soll ein Passwort sein: " + value ); } }(document.getElementsByName( "Passwort")[0].value); </script> </body> </html> Und das, geht das auch? IBS - DOM 7 DOM DOM – Document Object Model html head <html> <head> <titel>HTML</titel></head> <body> <H2 align="center">Selfhtml</H2> <p>Details können bei <a href="http://selfhtml.org">Selfhtml</a> nachgelesen werden! </p> </body> </html> body h2 align p Programm: manipuliert das Dokument via DOM-Schnittstelle a href DOM-Schnittstelle Dokument Sprachabhängige API, richtet sich nach der abstrakten DOM-Schnittstelle IBS - DOM 8 DOM und JavaScript DOM und JavaScript JavaScript implementiert eine DOM-API JavaScript Programme können auf das geladene HTML-Dokument über eine Implementierung der DOM-Schnittstelle zugreifen Beispiel <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>DOM Beispiel</title> </head> <body> <h2>Kapitel 1</h2> <p id="p1">Ganz wichtige Erläuterungen.</p> <p>Interssante Deatails</p> DOM-API: <h2>Kapitel 1</h2> document: Wurzelknoten <p>Bla Blabla.</p> getElementById: Zugriffsmethode <p>Blubber Blubber.</p> <script type="text/javascript"> document.getElementById("p1").onmouseover =function(){alert("Unbedingt beachten!");} </script> </body> </html> IBS - DOM API: Application Programming Interface DOM-API: konkrete Implementierung der abstrakten DOM-Schnittstelle 9 DOM und Firefox DOM - Inspector Firefox Addon DOM-Inspector IBS - DOM 10 DOM und Firefox Firefox Addon DOM-Inspector Beispiel IBS - DOM 11 DOM Dokumentenstruktur Knoten-Hierarchie: Dokument = Baum von Objekten Das Dokument wird als Baum von Knoten repräsentiert Manche Knoten haben Kinder, andere nicht Interface / Typ Auf Knoten kann über die Interfaces zugegriffen werden, die er implementiert Interfaces werden auch Typen genannt Ein Knoten implementiert i.d.R. mehrere Interfaces (er hat dann „mehrere Typen“) Interface- / Typ-Hierarchie Die Interfaces sind hierarchisch geordnet (Vererbung) Beispielsweise implementieren alle Knoten das Interface Node, der Wurzelknoten dazu noch das Interface Document Node Document HTML DOM ist XML-basiert, umfasst aber eine Spezialisierung für HTML HTMLDocument ... Element HTMLElement ... DOM Typ/Interface-Hierarchie IBS - DOM 12 DOM und JavaScript https://developer.mozilla.org/en/Gecko_DOM_Reference http://www.w3.org/TR/DOM-Level-3-Core/core.html http://www.w3schools.com/jsref Gecko Implementierung von JavaScript Java-/EMCA-Script Standard DOM-Standard IBS - DOM 13 DOM und JavaScript JavaScript Language Binding Language-Binding DOM inklusive der HTML-Spezialisierung ist eine abstrakte Schnittstelle Jede Programmiersprache, deren Programme via DOM auf Dokumente zugreifen können, müssen eine DOM-API umfassen Beispiel: DOM ~> Interface Document vs. JavaScript ~> Objekt document DOM definiert ein Interface Document siehe: http://www.w3.org/TR/DOM-Level-3-Core/core.html#i-Document DOM-Standard (sprachunabhängig) JavaScript Programme können auf ein Objekt document zugreifen siehe: http://www.w3schools.com/htmldom/ ECMA-Script Standard siehe: https://developer.mozilla.org/en/DOM/document ECMA-Script Implementierung IBS - DOM 14 DOM und JavaScript Methode getElementByID des Interface Document aus: DOM Interface Spezifikation Methode getElementByID des document Objekts aus: Gecko DOM Reference (Mozilla/JavaScript API/DOM) IBS - DOM 15 DOM-Zugriffe / Knotenselektion https://developer.mozilla.org/en/DOM/document Zugriff auf Knoten document Wurzel und Ausgangspunkt für Element-Zugriffe Zugriff auf Knoten via Zugriffsmethoden getElementById getElementsByTagName getElementsByName Zugriff auf Knoten via HTML-Collections Jedes html-Dokument definiert Kollektionen von Elementen: ... <form id="ID"> <input type="button" value="DrückMich!" /> </form> ... Zugriff auf das Formular alternativ via: document.forms["ID"] document.forms[0] document.getElementById("ID") document.getElementsByTagName("form")[0] document.forms document.images document.applets (deprecated) document.links document.anchors Beispiel Zugriffsmethoden auf Elemente dieser Kollektionen kann mit Index oder Id (oder notfalls auch mit dem Namen) zugegriffen werden. IBS - DOM 16 DOM-Zugriffe / Knotenselektion HTML-Collections Nicht nur document hat properies deren Wert HTML-Collections sind. Folgende Objekte haben HTML-Collections als Wert: document form table map tableSection row images, applets, links, forms, anchors elements, rows, tBodies, area, rows, cells <table border="1"> <tr> <td>row 1, cell <td>row 1, cell </tr> <tr> <td>row 2, cell <td>row 2, cell </tr> </table> 1</td> 2</td> 1</td> 2</td> document.getElementsByTagName ("table")[0].rows[0].cells[0] IBS - DOM Beispiel Zugriff auf Elemente von HTMLCollections 17 DOM-Zugriffe / Knotenselektion this Zugriff auf das „aktuelle“ Element this bezieht sich stets auf das Objekt dessen Methode gerade ausgeführt wird. Das ist: dasTop-Level Objekt ( window ) auf oberster Ebene in einem Skript dasTop-Level Objekt ( window ) in einer normalen Funktion das HTML-Element für den die Funktion als Handler registriert ist, falls die Funktion ein Handler ist <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>This Beispiel</title> <script type="text/javascript"> function changeColor(o) { o.style.color = '#ff0000'; } </script> </head> <body> <h2>Blub</h2> <p id="ID">Blubber blubber, bla bla, blind sei der Text</p> </body> Beispiel: this in einem Handler <script type="text/javascript"> document.getElementById("ID").onmouseover = function(){ changeColor(this); } </script> </html> IBS - DOM 18 DOM-Zugriffe / Attribute Zugriff auf Attribute Node Zugriff auf Attribute über die Methode getAttribute(AttributName) ... eine Methode des Interface' Element ... Element ... ... HTMLElement ... <p id="anID">Blubber</p> <script type="text/javascript"> document.write(document.getElementById("anID").getAttribute("id")); </script> Beispiel: getAttribute IBS - DOM 19 DOM-Zugriffe / Text Zugriff auf Text Zugriff über die Property innerHTML http://www.w3schools.com/jsref/prop_html_innerhtml.asp oder textContent in DOM-Level 3 property von Node enthält den HTML-Text eines Elements <table id="anID"> <tr><td>1,1</td><td>1,2</td></tr> <tr><td>2,1</td><td>2,2</td></tr> </table> document.getElementById("anID").innerHTML document.getElementById("anID").textContent Beispiel: innerHTML / textContent IBS - DOM 20 DOM-Zugriffe / Style Zugriff auf Style-Attribute (nicht auf CSS) Node Zugriff über die Property style ... eine Methode des Interface' HTMLElement ... Element ... ... HTMLElement ... <h2 style="color:#ff0000">Blub</h2> document.getElementsByTagName ("h2")[0].style Beispiel: style property IBS - DOM 21 DOM-Zugriffe / Baum-orientierte Zugriffe Zugriff via Node- / Element-Interface Node Zugriff über die Properties attributes, childNodes, firstChild, lastChild, nextSibling, previousSibling, ... ... Document ... Methoden zur Modifikation appendChild, replacechild, setAttributeNode, removeChild ... Element ... ... HTMLElement ... firstChild nextSibling lastChild Document-Interface Erzeugungs-Methoden createAttribute, createElement, createTextNode, ... previousSibling IBS - DOM 22 DOM-Zugriffe / Baum-orientierte Zugriffe Beispiel <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Baum Operationen</title> </head> <body> <script type="text/javascript"> var h1 = document.createElement( "h1" ); var ueberschrift = document.createTextNode ( "Eine Generierte Html Seite" ); var textFarbe = document.createAttribute ( "style" ); textFarbe.nodeValue= "color:blue" ; h1.appendChild(ueberschrift); h1.setAttributeNode(textFarbe); Text ist ein Unterknoten vom Typ TextNode var p = document.createElement( "p" ); var paragraph = document.createTextNode ( "Blindtext macht nicht blind!" Stile);sind p.appendChild(paragraph); document.getElementsByTagName( "body" )[0].appendChild(h1); Eigenschaften von Knoten document.getElementsByTagName ( "body" )[0].appendChild(p); </script> </body> </html> IBS - DOM 23 Browser-Objekte Browser-Objekte Zugriff in JavaScript auf Objekte die vom Browser verwaltet werden, aber nicht zum DOM-Baum des Dokuments gehören. Diese Browser-Objekte sind nicht Bestandteil des EMCA-Script Standards und schon gar nicht des DOM-Standards, sie werden aber von allen relevanten Browsern unterstützt. http://www.w3schools.com/jsref Window repräsentiert ein Browser-Fenster Navigator repräsentiert den Browser Screen repräsentiert den Bildschirm History repräsentiert die Besuchs-Historie (besuchte URLs) Location repräsentiert die aktuelle URL IBS - DOM 24 Browser-Objekte Window Zugriff in JavaScript auf Objekte die vom Browser verwaltet werden, aber nicht zum DOM-Baum des Dokuments gehören. Properties (Beispiele) name location document ... Fenstername URL Das geladene Dokument Methoden (Beispiele) open alert prompt back scrollBy ... Neues BrowserFenster öffnen Anzeigefenster öffnen Eingabe für Eingabefeld abfragen zurück zum vorherigen Dokument Fensterinhalt verschieben IBS - DOM 25 Browser-Objekte Window-Beispiel Neues Browser-Fenster öffnen <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Beispiel Window</title> <script type="text/javascript"> function goMNI() { open("http://website.mni.fh-giessen.de/", "", "width=1200,height=800"); } </script> </head> <body> <input type="button" value="Öffne MNI..." onclick="goMNI()"/> </body> </html> IBS - DOM 26 Browser-Objekte Navigator Zugriff auf Informationen über den Browser. Properties (Beispiele) appCodeName cookieEnabled language plugins ... Name des Browsers Ist das Setzen von Cookies erlaubt? Eingestellte Sprache Installierte Browser-Plugins Methoden (Beispiele) javaEnabled ... Java aktiviert? (Für Applets, oder Java FX) IBS - DOM 27 Browser-Objekte Navigator-Beispiel <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Navigator Beispiel</title> </head> <body> <h2>Java Unterstützung</h2> <script type="text/javascript"> if (navigator.javaEnabled()) { document.write("Vorhanden"); } else { document.write("Nicht vorhanden");} </script> <h2>Plugins</h2> <script type="text/javascript"> for (var i=0; i< navigator.plugins.length; i++) { document.write(navigator.plugins[i].name +"<br/>"); } </script> </body> </html> IBS - DOM 28 DHTML DHTML – Dynamic HTML DHTML Informale Bezeichnung für die dynamische Modifikation von Web-Seiten mit Hilfe von CSS und JavaScript Varianten Textmodifikation (JavaScript) Animation durch Austausch von Bildern (JavaScript) Stil- und Layout-Modifikationen (JavaScript + CSS) IBS - DOM 29 DHTML DHTML Beispiel Textmodifikation via JavaScript <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Dynamisches HTML</title> </head><body> <h2>DHTML</h2> <p id="p"> Maffeo Barberini: Die Welt steht still!</p> <button onclick="textWechsel()">Weiter</button> </body> <script type="text/javascript"> var t = 0; var t0 = "Maffeo Barberini: Die Welt steht still!"; var t1 = "Galileo Galileo: ... und sie bewegt sich doch!"; var pn = document.getElementById("p").firstChild; function textWechsel() { if (t == 0) { t=1; pn.nodeValue = t1; } else { t=0; pn.nodeValue = t0;} } </script> </html> IBS - DOM 30 DHTML DOM: Style Objekt Repräsentiert eine Style Anweisung. Hat eine Vielzahl von Properties die nach Kategorien geordnet werden können: Property-Kategorien Background Hintergrund beeinflussen Border and Margin Rand, Spielraum (Margin) Layout Layout List Listenformat Positioning Positionierung Printing Textlayout Table Tabellenlayout Text Zeichenfarbe, Schriftart, ... http://www.w3schools.com/jsref/dom_obj_style.asp https://developer.mozilla.org/en/DOM/Using_dynamic_styling_information IBS - DOM 31 DHTML DOM: Style Objekt, Beispiel <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>DHTML mit Stil</title> <style type="text/css"> #p { border: solid grey; } </style> </head><body> <h2 id="h2">DHTML mit Stil</h2> <p id="p">Zu viel Blindtext macht taub!</p> </body> <script type="text/javascript"> var textFarbeBlau = document.createAttribute("style"); textFarbeBlau.nodeValue="color:blue; border: solid green;"; var textFarbeGrau = document.createAttribute("style"); textFarbeGrau.nodeValue="color:darkgrey"; document.getElementById("h2").onmouseover = function() { document.getElementById("p").setAttributeNode(textFarbeBlau); } document.getElementById("h2").onmouseout = function() { document.getElementById("p").setAttributeNode(textFarbeGrau); } </script> </html> IBS - DOM 32 DHTML DOM mit CSS-Styles Der Phantasie, und dem Spieltrieb sind kaum Grenzen gesetzt! IBS - DOM 33