• Keine Ergebnisse gefunden

 Realisierung dynamischer Effekte über das DOM

N/A
N/A
Protected

Academic year: 2022

Aktie " Realisierung dynamischer Effekte über das DOM "

Copied!
36
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Inhalt:

 JavaScript

 Einbindung von JavaScript-Funktionen in Webseiten

 DOM-Referenzierung

 Realisierung dynamischer Effekte über das DOM

 Exkurs: Objektorientiertes Programmieren mit JavaScript

Peter Sobe Internettechnologien 1

3. Clientseitige Verarbeitung und JavaScript

(2)

JavaScript wurde 1995 im Netscape-Browser eingeführt und wird inzwischen von den meisten Browsern unterstützt.

Allgemeines:

 Skripte werden mit der HTML/XHTML-Seite übertragen und deren Ausführung durch verschiedene Ereignisse angestoßen

 Diese Scripting-Erweiterung bleibt im Rahmen einer 2-Tier Architektur.

 JavaScript erlaubt dynamische Effekte bei Darstellung der Webseiten.

 Java- bzw. C- ähnliche Sprache – prozedural und objektorientiert, auch funktional

JavaScript

(3)

<html>

<head>

<title>Eine Seite mit JavaScript</title>

</head>

<body>

<script type=“text/javascript“>

alert(“Hier spricht das JavaScript!“);

</script>

</body>

</html>

Peter Sobe Internettechnologien 3

JavaScript-Minimalbeispiel

(4)

<html>

<head>

<title>Eine Seite mit Javascript</title>

<script type="text/javascript">

function fun() { var x;

x=42;

alert("Die magische Zahl ist "+x);

}

</script>

</head>

<body >

<form name="Formular" action="">

<input type="button" value="Action!" onclick="fun()"/>

</form>

</body>

</html>

JavaScript - Variablen

Variablen sind mittels

„var“ zu deklarieren.

keine Typ-Angabe nötig

(5)

<html>

<head>

<title>Eine Seite mit Javascript</title>

<script type="text/javascript">

function fun() { var x;

x=42;

var Nachricht = "Die magische Zahl"; ; alert( Nachricht+" ist "+x);

}

</script>

</head>

<body >

<form name="Formular" action="">

<input type="button" value="Action!" onclick="fun()"/>

</form>

</body>

</html>

Peter Sobe Internettechnologien 5

JavaScript - Variablen

Zeichenketten können

per “+“ zusammen-

gebaut werden

(6)

function fun() { var x;

x=eingabe.text;

var Nachricht;

if (x==42)

{ Nachricht = "Die magische Zahl"; } else

{ Nachricht =“Die gewoehnliche Zahl“; } alert( Nachricht+" ist "+x);

}

JavaScript : if –else-Alternative

Generelles:

Fallunterscheidungen (Alternative,Selektion) mittels if (bedingung) else

Bedingungen mit Relationen<,>,==,<=,>=

Logische Verknüpfungen: && (UND), || (ODER),

! (NEGATION)

(7)

function fun() { var x;

x=document.eingabe.value;

var Nachricht;

var i = 0;

while (i <=x) {

alert(“Der “+ i +“ te Durchgang!“);

i=i+1;

} }

Zyklen mittels while(…) {…} oder do {… } while(…);

möglich.

Peter Sobe Internettechnologien 7

JavaScript – Zyklus (1)

(8)

function fun() { var x;

x=document.eingabe.value;

var Nachricht;

var i = 0;

for(i=0; i<=x; i++) {

alert(“Der “+ i +“ te Durchgang!“);

} }

For-Zyklen vorzugsweise dann, wenn vorab bekannt ist, wieviele Durchläufe erfolgen sollen.

JavaScript – Zyklus (2)

(9)

Für while-, do-while- und for-Schleifen kann per

break

– vorzeitig aus der Wiederholung ausgetreten werden

continue

– der aktuelle Schleifendurchlauf beendet werden und mit dem nächsten Durchlauf fortgesetzt werden.

Beispiel:

<script type=“text/javascript“>

var i=0;

while(i<10000) { if (i==20) break;

i++;

if (i==7 || i==13) continue;

document.write(“<li>Listenpunkt“+i+“</li><br/>“);

}

</script>

Peter Sobe Internettechnologien 9

JavaScript – Zyklus (3)

Es werden die

Listenpunkte von 1 bis 19

erzeugt, mit Ausnahme

von 7 und 13

(10)

Ohne Parameter und Rückgabewert:

function fun() {

// hier der Code }

Mit Parametern und Rückgabewert:

function calculate(a, b) {

var c = a * (1 + (b / 100));

return c;

}

JavaScript – Funktionen

(11)

Vereinbarung der Felder:

var werte= new Array(100);

var 3dpos = new Array(2);

...

for (i=0;i<=100;i++) {

werte[i]=i*2;

}

3dpos[0]=x;

3dpos[1]=y;

3dpos[2]=z;

len = werte.length(); // gibt Anzahl Elemente zurück, hier speziell 101

Peter Sobe Internettechnologien 11

JavaScript – Felder (1)

Die Feldelemente werden beginnend mit 0 nummeriert.

Wenn n Elemente vereinbart werden, dann besitzt das Feld n+1 Elemente

(von Index 0 bis n).

Das ist ein Unterschied gegenüber C.

(12)

Mehrdimensionale Felder

var 3dpositions = new Arrray(5);

for (i=0;i<3dpositions.length;i++) 3dpositions[i] = new Array(2);

for (i=0;i<=5;i++) { 3dpos[i][0]=x[i];

3dpos[i][1]=y[i];

3dpos[i][2]=z[i];

}

JavaScript – Felder (2)

(13)

Verschiedene Varianten zum Anlegen von Feldern:

über die Anzahl der Elemente var 3dpos = new Array(2);

über die Initialisierung der Elemente

Objektname = new Array(Element0, Element1, ..., element_n);

MeineKinder = new Array(„Max", „Moritz", „Hensel", „Gretel");

Ohne Länge

MeineVorlesungen = new Array();

//Elemente entstehen durch ihre Referenzierung

meineVorlesungen[0]="Internettechnologien";

meineVorlesungen[1]="Parallele Programmierung";

meineVorlesungen[2]="Informatik für Chemiker";

Peter Sobe Internettechnologien 13

JavaScript – Felder (3)

(14)

Assoziative Felder

Elemente können über ihren Inhalt referenziert werden Beispiel aus selfhtml.org:

<script type="text/JavaScript">

var Mitarbeiter = new Array();

Mitarbeiter[0] = new Object();

Mitarbeiter[0]["Name"] = "Müller";

Mitarbeiter[0]["Vorname"] = „Fred";

Mitarbeiter[0]["Wohnort"] = "Dresden";

Mitarbeiter[1] = new Object();

Mitarbeiter[1]["Name"] = "Schulze";

Mitarbeiter[1]["Vorname"] = „Maria";

Mitarbeiter[1]["Wohnort"] = "Berlin";

JavaScript – Felder (4)

(15)

Assoziative Felder (Fortsetzung) Beispiel aus selfhtml.org:

for (var i = 0; i < Mitarbeiter.length; i++) {

document.write("<dl><dt>Mitarbeiter " + (i + 1) + "<\/dt>");

for (var Eigenschaft in Mitarbeiter[i])

document.write("<dd>" + Eigenschaft + ": " + Mitarbeiter[i][Eigenschaft] + "<\/dd>");

document.write("<\/dl>");

}

</script>

Peter Sobe Internettechnologien 15

JavaScript – Felder (5)

(16)

Im JavaScript-Element werden eine oder mehrere Funktionen definiert.

<script type=“text/javascript“>

var z=0; // global variable function1() { alert(“z=“+z); } function2() { z=z+1;}

</script>

Es können auch mehrere JavaScript-Elemente in einem Dokument

eingebunden werden. Das wird gern benutzt, wenn Skripte aus externen Quelldateien eingebunden werden.

JavaScript –Einbindung der Funktionen

<script type="text/javascript"

src="../jsclasses/myjsfunctions.js" ></script>

<script type="text/javascript">

function test(){ … }

</script>

(17)

Als Beispiel wurden drei Funktionen definiert, die nun auf unterschiedliche Art aufgerufen werden.

Bei Laden der Webseite:

<body onload=“test()“> … </body>

Bei Button-Klick:

<input type=“button“ value=“OK“ onclick=“function1()“>

Bei Formular-Aktionen:

<form id=“Formular1“ action=““ method=“post“

onsubmit=“function1()“ onreset=“function2()“>

<input id=“werteingabe“ type=“text“ size=“5“>

<input type=“submit“> value=“ Berechnen“/>

<input type=“reset“> value=“ Abbruch“/>

</form>

Peter Sobe Internettechnologien 17

JavaScript –Aufruf der Funktionen (1)

(18)

Zeitgesteuerter Aufruf (Zeitwert in Millisekunden):

<body onload=“settimeout(‘test()‘,1000)“> … </body>

Aufruf der Funktionen untereinander:

function1() {

// do something function2();

}

Generelles Konzept:

 Ein Eventhandler reagiert auf Ereignisse, die von HTML-Elementen mit entsprechenden Attributen (onclick, onload usw.) ausgelöst werden.

 In den Ereignis-Attributen kann direkt JavaScript-Code notiert werden, oder der Aufruf von Funktionen innerhalb eines JavaScript-Elements ausgelöst werden.

 Attribute (Auswahl): onclick für button, onchange für text, textarea,

onmouseover, onload/onunload für HTML-Seiten(body)

JavaScript –Aufruf der Funktionen (2)

(19)

Inline-Skripte:

Diese Skripte stehen innerhalb des Body und werden mit den Laden des HTML-Dokuments ausgeführt. Sie erzeugen oftmals Elemente der Webseite (auf automatisierte Art und Weise).

<html><head><title>Test</title></head>

<body>

<script type="text/javascript">

var i;

document.write("<ul>");

for (i = 1; i != 10; i++) document.write("<li> Listenpunkt " + i + "</li>");

document.write("</ul>");

</script>

Peter Sobe Internettechnologien 19

JavaScript –Aufruf der Funktionen (3)

* Listenpunkt 1

* Listenpunkt 2

* Listenpunkt 3

* Listenpunkt 4

* Listenpunkt 5

* Listenpunkt 6

* Listenpunkt 7

* Listenpunkt 8

* Listenpunkt 9

(20)

Inline-Skripte (Fortsetzung):

Es können bereits bestehende Elemente gefüllt oder erweitert werden.

<div id="platzhalter1"></div>

<div id="platzhalter2"></div>

<div id="platzhalter3"></div>

<div id="platzhalter4"></div>

<div id="platzhalter5"></div>

<script type="text/javascript">

var i;

for (i=1;i!=6;i++)

{ document.getElementById("platzhalter"+i).innerHTML="<p><font color='blue' size='4'>Listenpunkt"+i+"</font></p>";

alert("platzhalter"+i);

}

</script>

JavaScript –Aufruf der Funktionen (4)

(21)

Das JavaScript ist ein normales Element im DOM

Vergleichsoperatoren <,>,<=,=> innerhalb des Skriptes werden als Tag-Kennzeichen gewertet (Problem!).

Mit Kommentar:

<script type=“text/javascript“>

/*<![CDATA[*/

function calculate(a) {

var c = 1;

for (i=1;i<=a; i++) c= c*i;

return c;

}

/*]]>*/

</script>

Peter Sobe Internettechnologien 21

JavaScript in XHTML

Erklärung:

Zeichen <,>,&, … sind innerhalb Elementen nicht erlaubt.

XML-Parser übergeht Bereiche, die durch

<![CDATA[ …. ]]>

eingefasst sind.

(22)

Knoten Attribute

Vater/Kind-Knoten

Siblings (Geschwisterknoten)

JavaScript – DOM-Referenzierung (1)

Vater Kinder

Geschwister

(23)

Auslesen bzw. Setzen der Werte vom Input-Feldern über DOM-Referenz

<FORM id=“Formular1“> <input id=“Eingabe“ type=“text“/>

</FORM>

var z = Formular1.Eingabe.value;

Stattdessen kann auch verwendet werden…

var e = document.getElementById(“Eingabe“);

Über das Objekt e können Werte ausgelesen und gesetzt werden.

eingabe = e.value; // auslesen e.value=“Standardwert“; // setzen

Peter Sobe Internettechnologien 23

JavaScript – DOM-Referenzierung (2)

Element-Id

(24)

Lesen und Setzten von Attributen:

var e = document.getElementById(“element-id“);

Über e können Attribute ausgelesen und gesetzt werden.

a = e.getAttribute(“attr-name“);

e.setAttribute(“attr-name“, “attr-value“);

Verkürzte Schreibweise:

document.getElementById(“element-id“).setAttribute(“attr-name“,

“attr-value“);

JavaScript – DOM-Referenzierung (3)

(25)

JavaScript-Funktionen zum Zugriff auf Dokumenteigenschaften Zugriff auf Kind-Knoten: firstChild, lastChild

Beispiel aus SelfHTML.org

<body>

<ul><li>erster Punkt</li>

<li>zweiter Punkt</li>

</ul>

<script type="text/javascript">

var ErsterPunkt = document.getElementsByTagName("ul")[0].firstChild;

document.write(ErsterPunkt.firstChild.data);

</script>

</body>

Peter Sobe Internettechnologien 25

JavaScript – DOM-Referenzierung (4)

(26)

Zugriff auf Geschwister-Knoten: nextSibling (auch previousSibling) Beispiel aus SelfHTML.org

<body>

<ul><li>erster Punkt</li>

<li>zweiter Punkt</li>

</ul>

<script type="text/javascript">

document.write("Das ul-Element hat folgende Knoten unter sich:<br>");

var Knoten = document.getElementsByTagName("ul")[0].firstChild;

while (Knoten != null) {

document.write("Einen Knoten mit dem Namen <b>" + Knoten.nodeName +

"<\/b><br>");

Knoten = Knoten.nextSibling;

}

</script>

</body>

JavaScript – DOM-Referenzierung (5)

(27)

Test, ob Kind-Knoten vorhanden: hasChildNodes()

gibt true oder false zurück, je nach dem ob das referenzierte Element Kindknoten besitzt oder nicht

Knoten besitzen folgende Eigenschaften/Variable:

nodeName, NodeValue, nodeType, … Eigenschaft: nodeName

var Knoten = document.getElementById("dasScript");

document.write("Dieses Script-Element hat folgenden Knotennamen:

<b>" + Knoten.nodeName + "</b>");

Peter Sobe Internettechnologien 27

JavaScript – DOM-Referenzierung (6)

(28)

Eigenschaft: nodeType

<html><head><title>Test</title>

</head><body>

<p align="center">ein kleiner Text</p>

<script type="text/javascript">

var Element = document.getElementsByTagName("p")[0];

var Ausrichtung = Element.getAttributeNode("align");

alert(Ausrichtung.nodeType);

</script>

</body>

</html>

Knotentypen können Tag-Elementknoten (Kodierung 1), Attributknoten (2), Textknoten (3) und weitere sein

JavaScript – DOM-Referenzierung (7)

(29)

Eigenschaft: nodeValue

<script type="text/javascript">

function TextAendern () {

document.getElementById("derText").firstChild.nodeValue = document.Formular.neuerText.value;

}

</script>

Eigenschaft: parentNode

</head><body>

<ul> <li>ein Punkt</li><li>ein zweiter</li></ul>

<script type="text/javascript">

alert(document.getElementsByTagName("li")[0].parentNode.parentNode.tagName);

</script>

</body>

Peter Sobe Internettechnologien 29

JavaScript – DOM-Referenzierung (8)

(30)

Funktion: InsertBefore

<html><head><title>Test</title></head>

<body>

<p id="derText">Text <i id="derKursiveText">und mit kursivem Text</i></p>

<script type="text/javascript">

var neuB = document.createElement("b");

var neuBText = document.createTextNode("mit fettem Text ");

neuB.appendChild(neuBText);

document.getElementById("derText").insertBefore(neuB, document.getElementById("derKursiveText"));

</script>

</body></html>

InsertBefore wird ausgehend vom Parent-Knoten aufgerufen, wobei das Kind- Element für die Platzierung (davor) angegeben wird.

JavaScript – Dynamische Effekte per DOM (1)

(31)

Löschen per removeChild(), Einfügen neuer Knoten per appendChild()

<html><head><title>Test</title></head>

<body>

<ol id="Liste"> <li>Element</li> </ol>

<script type="text/javascript">

document.getElementById("Liste").removeChild(document.getElementById("Liste").firstChild);

for (var i = 0; i < 10; i++) {

var newLI = document.createElement("li");

var liNr = i + 1;

var newLIText = document.createTextNode("Das ist Listeneintrag Nummer " + liNr);

document.getElementById("Liste").appendChild(newLI);

document.getElementsByTagName("li")[i].appendChild(newLIText);

}

</script>

</body></html>

Peter Sobe Internettechnologien 31

JavaScript – Dynamische Effekte per DOM (2)

(32)

Eigenschaft: innerHTML

<html>

<head>

<title>DOM 4</title>

<script type="text/javascript">

var Neu = "neuer <b>fetter<\/b> Text";

function Aendern ()

{ meinAbsatz.innerHTML = Neu; }

</script>

</head>

<body>

<p id="meinAbsatz">alter Text</p>

<a href="javascript:Aendern()">Anderer Text</a>

</body>

</html>

JavaScript – Dynamische Effekte per DOM (3)

(33)

JavaScript kennt keine Klassen (im Gegensatz zu Java und C++);

dennoch ist objektorientiertes Programmieren möglich.

Einige Aspekte:

Variablen und Funktionen erzeugen intern Objekte

z.B. erzeugen Funktionen s.g. Funktionsobjekte

JavaScript-Objekte sind assoziative Arrays mit Attributen und Methoden als Array-Elemente

Man kann einem JavaScript-Objekt zur Laufzeit neue Methoden zuweisen

Vererbung über prototypische Objekte

Peter Sobe Internettechnologien 33

JavaScript – Objektorientiert Programmieren (1)

(34)

Beispiel einer „Klasse“ mit zwei Instanzen

function Klasse()

{

this.funktion1 = eingabe;

this.funktion2 = ausgabe;

}

function eingabe() { … } function ausgabe() { … } obj1 = new Klasse();

obj2 = new Klasse();

obj1.funktion1();

obj2.funktion1();

obj1.funktion2();

JavaScript – Objektorientiert Programmieren (2)

Eine Klasse entsteht über

ein Funktionsobjekt, dem

man über this weitere

Funktionen zuweist.

(35)

Vererbung:

function Basisklasse() {

this.attribute = “wert“;

this.basisfunktion = b;

}

function b() { … }

function AbgeleiteteKlasse() { … }

AbgeleiteteKlasse.prototyp = new Basisklasse();

obj1 = new AbgeleiteteKlasse();

obj1.basisfunktion();

Peter Sobe Internettechnologien 35

JavaScript – Objektorientiert Programmieren (3)

Vererbung kann über das

Attribut „prototyp“ erzeugt

werden.

(36)

server-seitiges Scripting

Bislang betrachtet:

2-Tier Architekturen

Überleitung zu 3-Tier-Architekturen

Webbrowser

Webserver

Javascript

JavaScript

HTML, XML, +eingebettete Formate

3-Tier Architekturen

Webbrowser

Javascript

JavaScript

Webserver

PHP

Referenzen

ÄHNLICHE DOKUMENTE

Was ist der Nutzen einer Molekularfeldn¨aherung f¨ur, z.B., N Spins der L¨ange 1/2, die auf einem Gitter angeordnet sind und ¨uber eine Austauschkopplung J

Es erschliesst sich auch hier nicht, wieso dem Patienten ein Aktivwerden abverlangt wird, wenn er sensible Daten von diesem Zugriff ausschliessen will.. Der Notfallzugriff stellt

Er definiert wie weit oberhalb oder unterhalb des Ursprungs (0/0) die gebogene Kurve die y-Achse schneidet. Setzen wir nun Zahlen für x in die Funktion ein. Da es

Zusammen : Die Relation zu ist eine.

Damit aber der Ärzteschaft nicht das Heft aus der Hand genommen wird, bleibt es ein zentrales Anliegen der Bundesärztekam- mer, der medizinischen Fachgesellschaften und

Es ist eine beliebige Folgen von ganzen Zahlen gegeben, die durch. Algorithmen aufsteigend sortiert

Es ist eine beliebige Folgen von ganzen Zahlen gegeben, die durch. Algorithmen aufsteigend sortiert

Fakult¨at f¨ur