JavaScript EinführungÜbungsblätter: javascript_forms.pdf Arbeitsumgebung und vorgeschlagene ToolsDa HTML ein Standard des W3C ist, gibt es viele verschiedene Tools, um Webseiten und Bildinhalte zu erstellen und diese anzuzeigen. Aus technischen und menschlichen Gründen sind Open Source Programme für die Verwendung im Unterricht ideal. Da der Kurs leider auf Microsoft Windows (und nicht auf einer von mir bevorzugten Linuxdistribution) basiert schlage ich folgende Tools vor:
Alle Programme stehen für mehrere Betriebssysteme (Windows, Linux,...) zur Verfügung. Um einen reibungslosen Ablauf zu gewährleisten, steht während dem Kurs ein Linuxrechner mit dem Apache Webserver und PHP und MySql Unterstützung zur Verfügung. Weiters ist auf dem Rechner ein FTP und ein SSH Server installiert, um beim Upload der Dateien keine Zeit zu verlieren. Verbindung zu HTMLJavaScript kann entweder in den HTML <script type="text/javascript"> //<![CDATA[ ... //]]> </script> Der <script type="text/javascript" src="path/file.js" /> in den HTML Code einzubinden. Funktionsaufrufe können weiters
direkt an HTML Tags gebunden werden, indem
man Ereignisse wie Bedingte Ausführung und SchleifenIm folgenden wird nur ganz kurz die Syntax der einzelnen Schleifen dargestellt, auf eine Erklärung wird verzichtet. Falls der Code nicht klar sein sollte, empfehle ich, damit zu experimentieren, da dies die beste Art ist, Programmieren zu lernen. if (expression) { ... } else if (expression) { ... } else { ... } var myVar = condition & value_if_true : value_if_false; switch (variable) { case label1: ... [break;] case label2: ... [break;] case label3, label4, label5: ... [break;] default: ... } while (condition) { ... } do { ... } while (condition) for (initialization; condition; modification) { ... } for (var key in array) { // also works for assoc. arrays // use array[key] ... } for (var elem of array) { // does not work for assoc. arrays // use elem directly ... } FunktionenFunktionen sind nützlich, um den Code zu strukturieren, lesbarer zu machen und um ihn besser immer und immer wieder verwenden zu können. Eine Funktion sollte genau eine Aufgabe erfüllen - nicht mehr und nicht weniger und ihr Name sollte diese Aufgabe beschreiben - daher ist es oft sinnvoll, den Namen der Funktion mit einem Verb beginnen zu lassen. Wenn die Funktion mehr als eine Sache macht und man daher Schwierigkeiten hat, die Funktion treffend zu benennen, so ist das ein gutes Anzeichen dafür, dass man die Funktion wohl besser in mehrere Teilfunktionen aufteilen sollte. Die Syntax einer "normalen" (statischen) Funktion sieht so aus function doStuff([arg1, arg2, ...]) { ... [return something;] ... } Ein Rückgabewert kann mit var result = doStuff(myArg); Funktionen können aber auch als Objekte (dynamisch) erstellt werden. Ein kurzes Syntaxbeispiel dazu findet sich bei der Beschreibung der JavaScript Objekten. Eine weitere Art Funktionen zu deklarieren ist folgende var doStuff = function([arg1, arg2,...]) { ... }Ein konkretes (aber nicht sehr sinnvolles) Beispiel dafür ist var sayHello = function(x) { alert(x); } sayHello("Hello Function!"); Es ist auch möglich der Funktion einen Namen zu geben, der aber lediglich innerhalb der Funktion bekannt ist, also nur für Rekursionen (die Funktion ruft sich selbst auf) sinnvoll ist. Die Syntax sieht dann wie folgt aus var doStuff = function calculateStuff([arg1, arg2,...]) { ... calculateStuff([arg1, arg2,...]); ... } Es ist auch möglich, eine Funktion aus Strings herzustellen. var doStuff = new Function(["arg1", "arg2"], "alert('arg1 = ' + arg1);"); ObjekteIm folgenden ist anhand von Code (sehr) kurz beschrieben, wie man
in JavaScript Objekte instanziert und verwendet. Nummer, String und
Boolean Objekte sind nicht erwähnt, weil diese in der Regel
implizit verwendet werden, jedoch werden einige der vorhandenen
Eigenschaften und Methoden auch aufgelisted ( myString.length; myString.charAt(position); myString.charCodeAt(position); myString.indexOf(substring); myString.lastIndexOf(substring); myString.split(separator, maxNum); myString.slice(beginning, end); myString.match(regExp); myString.replace(regExp); myString.search(regExp); myString.toLowerCase(); myString.toUpperCase(); var pattern = new RegExp(regExpString); var myDate = new Date(); myDate.getFullYear(); myDate.getMonth(); // starting with 0 for January myDate.getDate(); // day of month myDate.getDay(); // day of week; starting with 0 for Sunday myDate.getHours(); myDate.getMinutes(); myDate.getSeconds(); myDate.getMilliseconds(); myDate.setXXX(arg); // corresponding set method Math.E; Math.LN10; Math.LN2; Math.LOG2E; Math.LOG10E; Math.PI; Math.SQRT1_2; Math.SQRT2; Math.sin(x); Math.asin(x); Math.cos(x); Math.acos(x); Math.tan(x); Math.atan(x); Math.floor(number); Math.ceil(number); Math.pow(base, exponent); Math.min(num1, num2,...); Math.max(num1, num2,...); Math.random(); // returns a random number ≥0 and <1 var myArray = new Array(); // alt. var myArray = [value1, value2,...]; myArray.length; myArray.splice(index,howMany,[newValue1,newValue2,...]); // cuts and returns elements myArray.slice(begin[,end]); // returns elements Array.join(separator) // joins array into a string myArray.push(element[,element2,...]); myArray.pop(); myArray.unshift(element[,element2,...]); myArray.shift(); myArray.concat(otherArray); myArray.reverse(); Die Definition von Objekten ist in JavaScript für Webprogrammierer selten notwendig, da dies hauptsächlich in komplexeren Bibliotheken wie zum Beispiel JQuery gemacht wird. Dennoch ist im Folgenden kurz aufgezeigt, wie eigene JavaScript Objekte definiert werden können. // JavaScript object instances are associative arrays var associativeArray = new Object(); associativeArray["index1"] = "contents1"; associativeArray.index2 = "contents2"; associativeArray.memberObj = new Object(); associativeArray.memberObj.name = "a name"; associativeArray.memberObj.street = "street address"; associativeArray.index1; // accesses the first element // an alternative (less verbose) way to define the above using JSON index2 = "bob"; var myObj = { "index1": "contents1", "index2": "contents2", "memberObj": { "name": "a name", "street": "street address" } }; // an extensive example providing class methods and using prototype function Teacher(name) { // initialize the member variables for this instance this.name = name; // initialize the member function references // for the class prototype if (typeof(_teacher_prototype_called) == 'undefined') { _teacher_prototype_called = true; Teacher.prototype.getName = getName; Teacher.prototype.setName = setName; } // define a Teacher's methods function getName() { return this.name; } function setName(name) { this.name = name; } } function test_teacher() { var teacher = new Teacher('anna'); window.alert('Teacher: ' + teacher.getName()); } EventsEvents (Ereignisse) treten ein, wenn ein Benutzer eine bestimmte Aktion durchführt. Eine solche Aktion kann das klicken auf eine Schaltfläche sein, das Schreiben in einem Textfeld, das Laden der Seite und noch viel mehr. Es gibt verschiedene Eventmodelle wovon hier nur das derzeit aktuelllste von DOM2 beschrieben wird. Hauptgrund dafür ist, dass JavaScript so gut wie möglich vom HTML Code getrennt sein sollte. Generell kann einem Objekt ein Eventhandler (eine Funktion, die ausgeführt wird, wenn das Event eintritt) wie folgt zugewießen werden object.addEventListener("event", eventFunction, boolean); Das Argument abort, blur, focus, change, click, doubleclick, contextmenu, error, keydown, keyup, keypress, load, unload, mousedown, mouseup, mouseover, mouseout, mousemove, reset, resize, select, scroll, submit wovon document.getElementById("myElem").addEventListener('submit', myHandler, true); Da Microsoft (wie so oft) quasi der einzige Browseranbieter ist (alle IE bis inklusive Version 7), dessen Eventmodell nicht mit den Standarts des W3C kompatibel ist, ist es empfehlenswert folgendes Konstrukt zum umgehen von Inkompatibilitäten zu verwenden if (myObject.addEventListener) { myObject.addEventListener("event", eventFunction, boolean); } else if (myObject.attachEvent) { myObject.attachEvent("onevent", eventFunction); } else if (myObject.onevent) { myObject.onevent = eventFunction; } Das EventobjektDie Art, wie Eventobjekte an die behandelnden Funktionen übergeben werden, ist leider auch nicht für alle Browser gleich. Genausowenig sind die Eigentschaften dieser Objekte konsistent zwischen verschiedenen Browsern. Folgend aber eine kurze Liste der konsistenen Eigentschaften altKey, clientX, clientY, ctrlKey, keyCode, screenX, screenY, shiftKey, type Um Inkonsistenzen zu umgehen hilft hier folgender Trick (der Variable wird die Eigenschaft als Resultat einer Abfrage zugewiesen) var myProperty = myEvent.mozProperty ? myEvent.mozProperty : myEvent.ieProperty JiT ValidierungJust in Time Validierung wird für Formulare verwendet, um sobald eine "fehlerhafte" Eingabe beendet ist, dem User so gut wie möglich dabei zu helfen, diese auszubessern. Es ist sehr empfehlenswert, diese Kontrolle gleich nach der Eingabe und nicht erst am Ende des Formulars durchzuführen, damit sich nicht zu viele (für den User frustrierende!) Fehler anhäufen. Besonders wichtig für Formulare ist dennoch das document.myForm.addEventListener("submit", myHandler, boolean); if (submitEvent.cancelable){ submitEvent.preventDefault(); } else if (submitEvent.cancelBubble != null) { submitEvent.cancelBubble = true; } return false; Ein weiteres Problem bei der Validierung von Inhalten ist, dass zumindest Grundkenntnisse von regulären Ausdrüken nötig sind. Am besten ist Formularvalidierung aber anhand eines Beispiels zu demonstrieren: form_validate.html, form_validate.js. Bei der Erstellung der nötigen regulären Ausdrücke hilft mein regExpTester. RekursionRekursion ist ein Fachausdruck der beschreibt, dass sich eine Funktion immer wieder selbst aufruft. Dies sieht auf den ersten Blick danach aus, als wuerde das Programm nie von selber enden... und genauso soll es eventuell auch sein. Am besten stellt man sich dazu sein Betriebssystem oder das Lieblings-Schreibprogramm vor - hier wollen wir doch auch nicht, dass das Programm seine Ausfuehrung von selber abbricht (wobei in diesem Fall oft eine zu function updateTime() { date = new Date(); var time = date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds(); window.document.display.time.value = time; window.setTimeout('updateTime()', 1000); } Hier geschieht das rekursive Wiederaufrufen anhand der Funktion function fact(n) { if (n == 0){ return 1; } return fact(n-1) } DOM (Document Object Model)Ein XHTML Dokument ist aus einer Hierarchie von Knoten (nodes) aufgebaut. Das Dokument selbst und seine Knoten sind Objekte, welche mit Hilfe von JavaScript erstellt, verändert und entfernt werden können. Das DOM bietet eine standardisierte Möglichkeit, jegliches XML Dokument (nicht nur XHTML) zu bearbeiten - und zwar nicht nur mit JavaScript, sondern auch mit jeder anderen Programmiersprache, die das DOM implementiert. Es folgt eine kurze Liste der nützlichsten Funktionen, welche vom DOM Core (das DOM Core funktioniert im Gegensatz zum HTML DOM mit jedem XML Dokument) zur Verfügung gestellt werden.
Ebenso sind die folgenden Eigenschaften von DOM Core Elementen besonders interessant
Die konkrete Kenntniss aller verschiedener Eigenschaften ist aber wenig sinnvoll - verwendet man ein vernünftiges Tool zur Webentwicklung wie zum Beispiel Opera Dragonfly, so bekommt man kinderleicht eine Übersicht über alle Eigenschaften eines Knotens. Ein Zuckerl am Rande: Dragonfly ist Open Source! Links
Copyright © 2009-2023 Gerald Senarclens de Grancy Haftungsausschluss: Da ich keinerlei Einfluss auf den Inhalt der Seiten, zu denen ich von meiner Homepage linke, habe, übernehme ich auch keinerlei Haftung für diese Seiten. |