4. Vorlesung JavaScript Anwendungsbeispiele ECMAScript
Transcription
4. Vorlesung JavaScript Anwendungsbeispiele ECMAScript
JavaScript • 6% JavaScript abgeschaltet (Stand Jan 2007) 4. Vorlesung JavaScript, Ajax, Webengineering, PHP JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 1 Anwendungsbeispiele • • • • • • • • • 2 ECMAScript (JavaScript) • Standard durch: Ecma International • ereignisorientiert • interpretiert im Client (Browser) • Arrays Formularvalidierung Desktopähnliche Applikationen über AJAX Menü Dynamische Manipulation von Daten/Ansichten (DOM) Spiele (Puzzle, Drag&Drop,...) Sortieren von Tabellen Zugriff auf Historie und Statusleiste Cookies Hilfefenster JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp –for(var Element in Menu) –assoziative Arrays (Zeichenkette = Index) –0.., dynamisch erweiterbar • Syntax: javaähnlich –Kontrollstrukturen • switch, if, for, while • try, catch, finally –Farben: 0xFFD700 –Strings: " oder ’ –; wird autom. am Ende eingefügt –Kommentare /*...*/, // –var: lokal/privat 3 • untypisiert –null –dynamische Typisierung • objektbasiert, nicht objektorientiert • kein Zugriffsschutz • eigener Objektbegriff –DOM: window, document (echte Objekte) –Math, RegExp (eigentlich Bibliotheken) –Array, Boolean (eigentlich Klassen) • keine Mehrfachvererbung –this –prototype (Zeiger auf Basisklasse) JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 4 Syntaxbeispiele • var a=1,b=2,c=4,d=8; • var x=“ute” + “trapp”; • function sqr(x) { var y=x*x; return y; JavaScript Code definieren Zugriff auf HTML • Knoten = document.getElementById("xyz") • Liste = document.getElementsByTagName(" h3") } • Script dem Browser (Client) bekannt machen: • im <head>-Tag – <script type="text/javascript"> alert("Hallo Welt!"); cachebar </script> – <script src="quadrat.js" type="text/javascript"></script> • • var a = new Array(); im <body>-Tag – <noscript><p>Bitte aktivieren Sie JavaScript</p></noscript> a[1] = "Januar"; a[2] = "Februar"; • var links = new Array(); links["Netscape"] = "http://developer.netscape.com"; links["Mozilla"] = "http://www.mozilla.org"; JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 5 Ereignisse - HTML • • • Maus: – onclick, ondblclick, onmousedown, onmouseup, onmouseover, onmousemove, onmouseout Tastatur: – onkeydown, onkeyup, onkeypress Datei/Fenster: – onload, onunload, onabort, onerror • • • JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp Verbindung JavaScript - Ereignis im HTML Formular: – onsubmit, onreset Formularelemente/a: – onfocus, onblur Formularelemente: – onselect, onchange Javascript an Ereignis binden und somit Ausführung erwirken: • <a href="#"> <img src= "prod.jpg" alt="Produktfotografie" id="b1" onclick="big(this);return false;" /> false: default-action (href) nicht ausführen. </a> • <form onsubmit="return FormulardatenOK();"> • <input type="submit" value="Abschicken" onclick="return FormulardatenOK();"/> • was Sie auch finden, aber nicht verwenden sollten – <input type=“submit" onclick="check()" value="send" /> function check () { { var f=document.forms[0]; if(ok)f.submit(); } JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 6 7 Kein Versenden bei abgeschaltetem JS! JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 8 Verbindung JavaScript - Ereignis Implizit im Skript - Trennung von HTML und JavaScript window.onload=ini; function ini() { DOM • generisches Objektmodell für XML-Dokumente • XML-Dokument: Baum aus Knoten • DOM-Api erlaubt Verändern des Baumes • Im DOM ist alles ein Knoten (Node) • Wurzelknoten eines DOMs ist immer ein Objekt vom Typ document Keine Klammern hier! document.getElementById('x').onclick = function(){tuEs(this);return false;} } Falls return false, dann hier! function tuEs(obj) { obj.style.backgroundColor = "yellow"; } Oder auch: return valide(this); JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 9 int getNodeType(); String getNodeValue(); NodeList getChildNodes(); boolean hasChildNodes(); Node removeChild(Node oldChild); <<interface>> Element public NodeList getElementsByTagName(String tag); String getAttribute(String name); Attr getAttributeNode(String name); String getTagName(); <head> <script type="text/javascript"> document.write("Willkommen"); </script> 10 Eigenschaften/Methoden (Auswahl) • <<interface>> NodeList Node – attributes – childNodes/firstChild/lastChild – nextSibling/ previousSibling (nächster/vorheriger Knoten auf derselben Ebene) – nodeName/nodeValue – parentNode – id/className int getLength(); Node item(int i); <<interface>> Document Element getDocumentElement(); Attr createAttribute(String name); Element createElement(String tagName); … JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp browserunabhängig (VB, JS) Ajax auch in Office steht im Header noch nicht zur Verfügung, also folgender Code funktioniert nicht: JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp DOM Interfaces <<interface>> Node • • • • 11 – – – – – appendChild() getAttribute() getElementsByTagName() hasChildNodes() insertBefore(), kein insertAfter oder insertAt – removeChild(), replaceChild() – setAttribute(), setAttributeNode() • Erzeugen von Knoten/Elemente mit Methoden von document: – createAttribut – createElement – createTextNode Beispiele: • nParent = n.parentNode; • span = document.createElement('span'); • span.appendChild(document.createText Node("hi")); • span.setAttribute ("lang", "de"); • p.appendChild(span) p sei vorhandener Paragraph, dann erhalten wir <p>...<span lang="de">hi</span> JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 12 Reguläre Ausdrücke var str = "Ute Trapp"; pattern = /(\w+)\s(\w+)/; if(pattern.exec(str)) { alert(RegExp.$2 + ", " + RegExp.$1); } Ausgabe? • • • • • • \d eine Ziffer (== [0-9]) \D ein Zeichen, dass keine Ziffer ist (==[^0-9]) \w alphanumerisches Zeichen (==[a-zAZ]) \W nicht alphanumerisches Zeichen (==[^a-zA-Z]) \s whitespace (==[\t\v\n\r\f]) \S kein whitespace (==[^\t\v\n\r\f]) • • • • • • • • • • • • Objekte . beliebiges Zeichen [ ] Auswahlliste, z.B. [a-zA-Z0-9_] [^ ] negierte Auswahlliste ^ Zeilenanfang $ Zeilenende | oder, z.B. /^\s*|\s*$/ {m,n} mindestens m-mal, höchstens n-mal {m,} mindestens m-mal {m} genau m-mal * 0 oder mehrere (=={0,}) + 1 oder mehrere (=={1,}) ? 0 oder 1 mal (=={0,1}) JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 13 Vererbung function Person(first, last) { this.firstName = first; this.lastName = last; } Person.prototype.fullName = function() { return this.firstName + ' ' + this.lastName; } Person.prototype.fullNameReversed = function() { return this.lastName + ', ' + this.firstName; } JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp Coding Guidelines!!! JavaScript Objekte sind eigentlich assoziative Arrays 14 Ajax function Figure(posX, posY) {this.x = posX; this.y = posY;} function Container (label) { Figure.prototype.move = function(dx, this.label dy) {this.x += dx; this.y += dy;} = label; Figure.prototype.printKoord = function() { this.ItemList = new Array (0); this.y);} alert( "x = " + this.x + " y = " + this.add = addItem; function Circle(r){ this.print = printContainer; this.radius = r; } Beispiel in Aktion this.base = Figure;this.base(0,0);} Circle.prototype = new Figure; function addItem (i) {...} return Math.PI*Math.pow(this.radius, 2);} Circle.prototype.getArea = function(){ function printContainer () {...} function Rectangle(l, w) { Container.prototype = new Item (); this.length = l;this.width = w; function Shape (label) { this.base = Figure;this.base(0,0);}this.label = label; Rectangle.prototype = new Figure; this.print = printShape; return this.length * this.width;} Rectangle.prototype.getArea = function(){ } function Square(s) {this.base = Rectangle;this.base(s, function printShape () {...} s);} Square.prototype = new Rectangle; Shape.prototype = new Item (); JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 15 JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 16 Probleme mit Ajaxanwendungen AJAX • • • Client • • Benutzerin erkennt nicht, das und wo Daten geändert werden. • Zurückknopf funktioniert nicht, wie erwartet (Undo, letzte Seite) • Lesezeichen können nicht wie gewohnt gesetzt werden • Reihenfolge der Abarbeitung nicht verlässlich • Vorsicht mit Verlagerung der Applikationslogik vom Server auf den Client. • Clientseitige Entwicklungsmethodik und werkzeuge deutlich schlechter als serverseitige Webbrowser Benutzeroberfläche JavaScript Aufruf HTML CSS Ajax-Engine Internet • Ajax : Asynchronous JavaScript and XML. Konzept der asynchronen Datenübertragung zwischen Server und Browser Ausführen einer HTTP-Anfrage innerhalb einer HTML-Seite sukzessives Nachladen/Ändern einzelner Daten basiert auf HTTP, (X)HTML, CSS, JavaScript, Document Object Model (DOM), XML Beispiele – Google Suggests, Google & Yahoo! Maps – Amazon A9 Search – Flickr, BaseCamp, Kayak – Yahoo! AJAX Library Anfrage Webserver • HTTP Antwort: XML Webserver (Apache/IIS) PHP, ... JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 17 JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp Implementation • Öffnen einer asynchronen Verbindung vom Client zum Server • Request • Verarbeitung der erhaltenen Daten mit JavaScript, Einbinden in aktuelles Dokument über DOM 18 Quiz 1/8 // Firefox, Opera 8.0+, Safari xmlHttp=new XMLHttpRequest(); // IE xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); //ältere IE xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); xmlHttp.onreadystatechange=function() { if(xmlHttp.readyState==4) //Anfrage beendet {updateAjaxContent(xmlHttp.responseText);} } xmlHttp.open("GET","ajax.php",true); xmlHttp.send(null); JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp • Häufig: Get-Methode, obwohl Get – nicht eine Transaktion/Änderung auf dem Server verursachen sollte – bookmark-able sein sollten – cachebar sein sollten Wie binden Sie eine JS-Datei in eine HTML-Seite ein? 1) 2) 3) 4) 5) <script href="xxx.js"> <script name="xxx.js"> <script src="xxx.js"> <link src="xxx.js"> <link href="xxx.js"> True:assynchron 19 JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 20 Quiz 2/8 Quiz 3/8 Wie definieren Sie in JS eine Funktion mit dem Namen myFunction? Wie rufen Sie in JS eine Funktion mit dem Namen myFunction auf? 1) 2) 3) 4) 5) 1) myFunction() 2) call function myFunction 3) call myFunction() function=myFunction() function myFunction() function:myFunction() sub myFunction() void function myFunction() JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 21 JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp Quiz 4/8 Quiz 5/8 Wie schreiben Sie in JS eine Bedingung, für den Fall, dass i ungleich 5 ist? 1) 2) 3) 4) Wie definieren Sie in JS ein Array? 1) 2) 3) 4) 5) if (i <> 5) if (i != 5) if <>5 if =! 5 then JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 22 23 var txt = new Array(1:"tim",2:"kim",3:"jim") var txt = new Array("tim","kim","jim") var txt = new Array:1=("tim")2=("kim")3=("jim") var txt = new Array(1->"tim", 2->"kim",3->"jim") var txt = new Array="tim","kim","jim" JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 24 Quiz 6/8 Quiz 7/8 Was passiert hier? <script language="JavaScript" type="text/javascript"> function myclass() { this.name = "value"; this.display = display; function display() { alert(this.name); } } obj = new myclass(); for(n in obj) { alert("Name: "+n+", Typ: "+typeof(n)); } </script> 1) nichts, da das Skript einen Fehler enthält 2) nichts, da das Skript erst noch über ein Ereignis aufgerufen werden muss 3) es werden zwei Alerts ausgegeben: Name: name, Typ: string und Name:display, Typ: string 4) es wird ein Alert ausgegeben: Name: name, Typ: string Was passiert hier? <head><script type="text/javascript"> function x() {var h2 = document.createElement("h2"); h2.appendChild(document.createTextNode("hi")); var body = document.getElementsByTagName("body")[0]; body.appendChild(h2);} </script> <body onload="x();")> <h1>Test</h1> </body> 1) 2) 3) 4) nichts, da das Skript einen Fehler enthält es wird ein HTML-Tag h2 erzeugt, aber nicht angezeigt nach h1 erscheint eine h2-Überschrift mit dem Inhalt hi vor h1 erscheint eine h2-Überschrift mit dem Inhalt hi JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 25 Quiz 8/8 JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 26 Webengineering Was wird hier als Alert ausgegeben? <script language="JavaScript" type="text/javascript"> function proto() { } x = new proto(); y = new proto(); proto.prototype.sinn_des_lebens = 42; x.oha = "oha"; alert(x.sinn_des_lebens + " " + x.oha + " " + y.oha); </script> 1) 2) 3) 4) nichts, da das Skript einen Fehler enthält 42 oha undefined 42 undefined undefined undefined undefined undefined JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 27 JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 28 Dimensionen einer Webapplikation Was müssen Sie definieren/beachten? Hypermediaebenen • • Präsentation • • Hypertext (Verknüpfungen) Entwicklungsphasen Inhalt Struktur • Analyse Entwurf Implementation Test • • • Verhalten Sichtweise JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 29 Beispiel UWE Szenarien / Anwendungsfälle Domänenmodell Aufgabenmodell Dialoge Geschäftsprozesse Navigationsmodell Struktur Inhalte Funktionalität Prozesse Webanwendungsmodell • • • Access Präsentationsmodell Strukturelle PräsentationsSicht sicht Geschäftsprozessmodell Ziele Umgebung: Einbindung in Unternehmen, Geschäftsprozesse, Unternehmenskultur, Vorsystem, Konkurrenz (Marktanalyse) Typische Benutzer, Personalisierung Daten: welche, wo, wie verwaltet, ändern sich wie oft, Transaktionen? Navigation:Hauptnavigation, Guidedtour,... Einheitliches Look & Feel Erweiterbarkeit: neue Seiten, neue Prozesse, andere Endgeräte, ... Skalierbarkeit: wieviele Nutzer, Verteilung auf mehrere Server, ... Sicherheit Zeitplan: Iterationen Qualitätssicherung, wann war’s gut? JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp • • • • • • Architektur Subsysteme Datenmodell Klassendiagramm Hypertextmodell Navigationsmodell Präsentationsmodell 30 Navigation • objektorientiert • Konzept für interaktive Websites • Aufgabenmodell / Geschäftsprozessmodell • Navigation wird entwickelt aus Domänenmodell und Aufgabenmodell • angelehnt an UML • Werkzeug: ArgoUWE score Personalisierungsmodell JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 31 JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 32 Gedanken zu PHP Open Source interpretiert Nicht typisiert Unicode ab Version 6 • <?php echo 'Long Tags - empfohlen' ?> • /* für lange Kommentare */ Design Pattern OO • • • • // Einzeiler #Einzeiler, nicht erwünscht Stringverkettung erfolgt mit einem Punkt (.) und nicht mit + oder & Zugriff auf Klassenmethoden und -Member mit -> und nicht mit einem Punkt (Bsp: $file->getFileName()); • Zugriff auf statische Methoden erfolgt mit :: • Neben einem normalen Vergleich == gibt es auch einen typisierten Vergleich (===). Interfaces Abstrakte Klassen private, ... Kon-/Destruktor Iterator PHP Keine Namenräume PHP einbinden, Kommentare, Sprachbesonderheiten Extensions XML Exif • pass by reference (Änderung gegenüber PHP 4) PDF SOAP JavaScript > Ajax > Webengineering > EWA - WS 2007/08 ©Dr. Ute Blechschmidt-Trapp PHP 33 JavaScript > Ajax > Webengineering > EWA - WS 2007/08 ©Dr. Ute Blechschmidt-Trapp PHP Variablen/Konstanten/include 34 Arrays • Variablen $name • array( • untypisiert, Deklaration nicht zwingend • Typ der Variablen augrund letzter Zuweisung • Konstanten: define("Name",Wert) Konstanten werden ohne $ über Namen angesprochen • Datentypen: Boolean, Integer, Double, String, Array, Object • DatentypenTyp-Casting möglich:$ganz=(int) "12.45"; funktioniert nicht mit speziellen Objekten - nur object! • instance of if ($obj instance of Circle) { • include "vars.php";include_once • require "prepend.php";require_once 0 => array( Hier liefert implode: "url" => "/", Array, ... "title" => "Home" ),... • $array = array("lastname", "email", "phone"); • $comma_separated = implode(",", $array); • echo $comma_separated; // lastname,email,phone include: Warning require: Fatal Error JavaScript > Ajax > Webengineering > EWA - WS 2007/08 ©Dr. Ute Blechschmidt-Trapp PHP 35 JavaScript > Ajax > Webengineering > EWA - WS 2007/08 ©Dr. Ute Blechschmidt-Trapp PHP 36 Kontrollstrukturen • • • • • • • • Klassen • interface • protected / private / public / const • Konstruktor (keine Konstruktorenüberladung) • extends (Vererbung), final (bei Methoden und Klassen) • abstrakte Klassen • Object cloning (echte Kopie) if - elseif - else for foreach while do - while switch break - continue try - catch - (kein finally) – $bar = clone $foo; • self: – self::$schlafplaetze; • this – $this->z=1; • parent – JavaScript > Ajax > Webengineering > EWA - WS 2007/08 ©Dr. Ute Blechschmidt-Trapp PHP 37 Zusammenfassung parent::schnell(); interface Fahren { public function schnell(); public function langsam(); } class Auto implements Fahren{ const ANZAHL_RAEDER = 4; function __construct($baujahr, $marke, $km) {...} function __destruct() {...} ...} class Bus extends Auto { protected static $schlafplaetze = 4; ...} abstract class x { abstract public function y(); ...} JavaScript > Ajax > Webengineering > EWA - WS 2007/08 ©Dr. Ute Blechschmidt-Trapp PHP 38 Ausblick • JavaScript: • Wiederholung aufgrund eingehender Fragen • PHP konkret – gezielt einsetzen – Seite sollte auch ohne JS funktionieren, insb. Formularverarbeitung und Navigation – objektbasiert nicht objektorientiert • Ajax: – trendy, aber mit Bedacht einsetzen – Vor-/Nachteile von assynchron beachten Vielen Dank und bis zur nächsten Woche oder gleich im Praktikum. • Webengineering: – nicht unterschätzen – Navigation, Verhalten mit planen • PHP – voll objektorientierte Sprache mit syntaktischen Besonderheiten JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 39 JavaScript > Ajax > Webengineering > EWA - WS 2007/08 PHP ©Dr. Ute Blechschmidt-Trapp 40