Was ist das?
Im Gegensatz zu HTML ist Javascript (JavaScript, JS) eine richtige Programmiersprache, mit der man Webseiten interaktiv gestalten kann. So lassen sich etwa Eingaben in HTML-Formularen überprüfen, Dialogfenster mit Nachrichten anzeigen, die Rechte von sogenannten Cookies verwalten usw. Des Weiteren ist es möglich, Spiele in Javascript zu programmieren.
Hallo Welt
Wenn man eine Programmiersprache erlebt, ist es üblich, sich zunächst ein Hallo-Welt-Beispiel anzuschauen.
<html>
<head>
<meta charset="utf-8"/>
<title>Hallo Welt JS!</title>
</head>
<body>
<script>
document.write("Hallo Welt!");
</script>
</body>
</html>
Zunächst einmal stellen wir fest, dass es sich um eine ganz normale HTML-Datei mit der typischen Strukturierung handelt. Hier haben wir im Body-Bereich zusätzlich ein neues Tag <script>. Dieses teilt dem Browser mit, dass Javascript-Code interpretiert werden muss. In unserem Beispiel ist es die Ausgabe eines kurzen Textes: Hallo Welt!
Wir können auch alle möglichen Tags anfügen, um unsere Textausgabe zu formatieren. So können wir in der Zeile 8 auch schreiben document.write(„document.write(„Hallo Welt!“); und Hallo Welt! wird als Überschrift 1. Ordnung ausgegeben.
Variablen und Datentypen
Variablen werden in Javascript mit let oder, nach alter Konvention, mit var definiert:
<script>
let begruessung;
begruessung = 'Hallo Welt';
document.write(begruessung);
begruessung = 'Guten Tag';
document.write(begruessung);
</script>
Der Variable begruessung wurde hier der Wert ‚Hallo‘ zugewiesen. Jetzt kann der Wert der Variable mit document.write ausgegeben werden. Wir können aber natürlich auch späterhin einen anderen Wert zuweisen, wie hier das förmlichere ‚Guten Tag‘ und das dann wiederum auch ausgeben.
In Javascript können die Variablen drei Typen annehmen, nämlich String, Number und Boolean. Strings, also Variablen dieses Datentyps, sind Zeichenketten, die von Gänsefüßchen oder Hochkommas eingeschlossen werden, also etwa let s=“Hund“ oder let s=’Hund‘. Variablen des Datentyps Number sind Zahlen, also z.B. let x=3.14 oder let x=300. Boolsche Variablen nehmen entweder den Wert true (1) oder false (0) annehmen.
<script>
// String
let s1 = 'Hund';
let s2 = "Katze";
// Number
let x1 = 3.14; // Dezimal-Punkt beachten
let x2 = 300;
// Boolean
let b1 = true;
let b2 = false;
</script>
Mit dem +-Zeichen lassen sich Strings mit Strings und anderen Datentypen kombinieren, wobei immer wieder ein String entsteht.
<script>
let vorname = 'Till';
let nachname = 'Lindemann'
document.write(vorname + ' ' + nachname);
// Till Lindemann
document.write(vorname + 666);
// Till666
document.write(vorname + true);
// Tilltrue
</script>
Weiterhin gibt es noch die Datentypen Array und Object. In einem Array können verschiedene Werte gespeichert werden, z.B. alle Spielergebnisse oder alle Noten, was zugegebenermaßen manchmal nicht so weit auseinander liegt. Ein Objekt kann in Javascript so ziemlich alles sein. Auf Array und Objekte werden wir später noch zurückkommen.
Rechenoperationen
Überraschenderweise können Zahlen mit dem Pluszeichen addiert werden:
<script>
// Addition
let x = 600 + 60;
document.write(x);
// 660
// Sonderfall Addition zu sich selbst
x += 6;
document.write(x);
// 666
// Sonderfall Addition + 1
x++;
document.write(x);
// 667
</script>
Mit dem Minuszeichen wird analog dazu subtrahiert:
<script>
// Subtraktion
let x = 40 + 60;
document.write(x);
// 100
// Sonderfall Subtraktion von sich selbst
x -= 25;
document.write(x);
// 75
// Sonderfall Subtraktion - 1
x--;
document.write(x);
// 74
</script>
Multiplikationen und Division lassen sich mit * bzw. / vornehmen:
<script>
// Multiplikation
let x = 4 * 7;
document.write(x);
// 28
// Division
x = x/8;
document.write(x);
// 3.5
</script>
Math ist ein Standardobjekt von Javascript, das verschiedene mathematische Funktionen enthält. Objekte können mit der Punktnotation angesprochen werden, so gibt Math.PI die Zahl π zurück. Mit Math können natürlich auch Potenzen und Wurzeln berechnet werden.
<script>
// Potenz
let x1 = Math.pow(2,4);
document.write(x1);
// 16
let x2 = Math.sqrt(x1);
document.write(x2);
// 4
// dekadischer Logarithmus
let x3 = Math.log10(100);
document.write(x3);
// 2
</script>
Rund und zufällig
Bei vielen Anwendungen, z.B. bei Spielen, spielen Zufallszahlen eine große Rolle. Hiermit eng verbunden sind verschiedene Möglichkeiten des Rundens und anderer Zahlenmanipulationen in Javascript. Lassen Sie uns an einem virtuellem Würfel basteln und wir wollen dreimal würfeln.
Betrachten wir zunächst einmal die Funktion Math.round(), mit der Zufallszahlen erzeigt werden:
<script>
let x1 = Math.random();
let x2 = Math.random();
let x3 = Math.random();
document.write(x1 + '<br/>' + x2 + '<br/>' + x3)
/*
Beispielausgabe
0.974125066007409
0.58397573132058
0.03397469871429004
*/
</script>
Jedes Mal, wenn die Funktion aufgerufen wird erhalte ich einen anderen zufälligen Wert. Allerdings sind die Werte alle kleiner 1. Beim Würfeln möchte ich mich aber auf die ganzen Zahlen 1 bis 6 beschränken.
Daher multipliziere ich die Ausgabe mit dem Faktor 6.
<script>
let x1 = 6 * Math.random();
let x2 = 6 * Math.random();
let x3 = 6 * Math.random();
document.write(x1 + '<br/>' + x2 + '<br/>' + x3)
/*
Beispielausgabe
5.844750396044450
3.503854387923480
0.203848192285740
*/
</script>
Im folgenden Schritt runde ich mit Math.floor die Zufallswerte ab und addiere die Zahl 1, da die kleinste Zahl nicht 0 sein darf:
<script>
let x1 = Math.floor(6 * Math.random()) + 1;
let x2 = Math.floor(6 * Math.random()) + 1;
let x3 = Math.floor(6 * Math.random()) + 1;
document.write(x1 + '<br/>' + x2 + '<br/>' + x3)
/*
Beispielausgabe
6
4
1
*/
</script>
Da ich immer wieder würfeln möchte, ist es nicht sinnvoll, wenn ich jedes Mal eine lange Zeile aufschreiben muss. Daher kann ich das Ganze auch in einer Funktion wuerfel() unterbringen, die mir mit return meinen gewürfelten Wert zurückgibt.
<script>
function wuerfel() {
return Math.floor(6 * Math.random()) + 1;
}
document.write(wuerfel() + '<br/>' + wuerfel() + '<br/>' + wuerfel());
</script>
Weitere Rundungsmöglichkeiten stellen Math.round, Math.trunc und Math.ceil dar. Der ganzzahlige Wert wird mit Math.trunc zurückgegeben. Math.round rundet zur nächsten ganzen Zahl. Math.ceil rundet zur nächsten ganzen Zahl auf, also 8.2 zu 9 und -7.1 zu -7.
<script>
let x1 = Math.PI;
document.write('pi = ' + x1 + '<br/>');
let x2 = Math.round(x1);
document.write('round: ' + x2 + '<br/>');
let x3 = Math.floor(x1);
document.write('floor: ' + x3 + '<br/>');
let x4 = Math.ceil(x1);
document.write('ceil: ' + x4 + '<br/>');
let x5 = Math.trunc(x1);
document.write('trunk: ' + x5);
/* Ausgabe:
pi = 3.141592653589793
round: 3
floor: 3
ceil: 4
trunc: 3
*/
</script>
Arrays
In Array lassen sich Werte vom gleichen Datentyp abspeichern. Im folgenden Beispiel sind das einerseits die Vornamen der ersten vier Präsidenten der USA (ich wollte einfach nicht hinten beginnen) und andererseits die Jahre des jeweiligen Amtsantritts.
Die Werte im Array können jetzt einzeln angesprochen werden, wobei zu beachten ist, dass wir nicht bei 1 sondern bei 0 beginnen. Demnach ist vornamen[0]=George und jahre[2]=1801. Die Anzahl der Elemente in einem Array kann ich über die Eigenschaft length ermitteln, so ist vornamen.length=4.
Mit einer sogenannten for-Schleife kann ich ein Array durchlaufen, wobei eine bestimmte Syntax zu beachten ist. Hinter das Wort for kommt eine runde Klammer mit drei Ausdrücken, die durch Semikolons getrennt sind.
Der erste Ausdruck ist eine Zählvariable, hier ist das i, für die ein Anfangswert definiert wird. Dieser ist zumeist 0. Der zweite Ausdruck stellt die Bedingung dar, bis zu der eine Schleife durchlaufen wird. In unserem Beispiel ist das die Länge des Arrays vornamen. Der dritte Ausdruck ist die sogenannte Inkrement-Anweisung. Hier wird festgelegt, um wieviel die Zählvariable bei jedem Durchlauf hochgezählt werden soll. Bei uns steht i++, also wird immer eine 1 dazu addiert.
<script>
let vornamen = ["George", "John", "Thomas", "James"];
let jahre = [1789, 1797, 1801, 1809];
for (let i=0; i<vornamen.length; i++) {
document.write(vornamen[i] + ': ' + jahre[i] + '<br/>');
}
/*
Ausgabe
George: 1789
John: 1797
Thomas: 1801
James: 1809
*/
</script>
Inhalte verändern
Mit Javascript lässt sich der Inhalt einer Webseite verändert, ohne dass diese neu geladen werden muss. Hierzu müssen lediglich Elemente vorhanden sein, die eindeutig angesprochen werden können. Das erfolgt dann mit document.getElementById.
<html>
<head>
<meta charset="utf-8"/>
<title>Text ändern</title>
</head>
<body>
<h1 id="meine_ueberschrift">Hallo</h1>
<div id="mein_div">hallo</div>
<script>
let elem1 = document.getElementById("meine_ueberschrift");
elem1.style.color = "red";
elem1.innerHTML = "Das ist neu";
let elem2 = document.getElementById("mein_div");
elem2.innerHTML = "Das ist ein neuer Absatz";
</script>
</body>
</html>
Ergebnis
Hallo
Formulare und Javascript
Auf HTML-Seiten ist es möglich, Formulare zu platzieren. Diese dienen zur Eingabe von Daten, z.B. in einem Kontaktformular, und zum Auslösen von Aktionen, z.B. dem Verschicken eben dieser Kontaktdaten. Ein Formular wird mit dem Tag <form> definiert.
Einfache Ausgabe
<html>
<head>
<meta charset="utf-8">
<title>Formular</title>
<script>
function ausgabe() {
let s = document.getElementById("name").value;
alert(s);
}
</script>
</head>
<body>
<form>
<input type="text" id="name"></input>
<button type="button" onClick="ausgabe()">Ausgabe</button>
</form>
</body>
</html>
Im Formular gibt es ein Inputfeld, das eindeutig über die id=“name“ angesprochen werden kann. Weiterhin gibt es einen Button, der mit Ausgabe beschriftet ist. Drückt man diesen Button, wird eine Aktion ausgelöst, hier wird die Javascript-Funktion ausgabe() aufgerufen. In dieser Funktion wird zunächst der Wert des Feldes über die Eigenschaft value ermittelt und schließlich mit alert ausgegeben, d.h. es erscheint ein kleines Meldungsfenster.
Würfel mit Button
Wir wollen unser Würfel-Programm neu aufgreifen und den Würfel mit einem Button starten. Dazu definieren wir ein Ausgabefeld <output>, das wir mittels CSS aufhübschen. Wir verändern die Schriftgröße auf 400 Pixel und die Schriftfarbe auf rot, also doch sehr dezent. Dieses Ausgabefeld können wir über die id=“output“ ansprechen.
Des Weiteren haben wir einen Button, der mit Würfeln beschriftet ist. Wenn dieser Button angeklickt wird, also das Ereignis onClick ausgelöst wird, so erfolgt der Aufruf der Funktion wuerfel(). Innerhalb der Funktion wird zunächst einmal wieder die Zufallszahl im Bereich 1…6 erzeugt. Anschließend erfolgt die Ausgabe über das Setzen des Attributs innerHTML des Ausgabefelds.
Die Zahl wird hierbei als Sonderzeichen ausgegeben, nämlich tatsächlich in der Form eines Würfels. Hierbei hat der Würfel mit einem Auge das Unicode-Sonderzeichen U+9856, was als sogenannte HTML-Entität als ⚀ ausgedrückt wird. Wir setzen also die HTML-Entitäten zusammen, indem wir die gewürfelte Zahl zu 9855 addieren.
<html>
<head>
<meta charset="utf-8">
<title>Würfeln</title>
<script>
function wuerfel() {
let w = Math.floor(6 * Math.random()) + 1;
/*
1 - #9856, 2 - #9857, 3 - #9858
4 - #9859, 5 - #9860, 6 - #9861
*/
let zeichen = "&#" + (9855+w) + ";"
document.getElementById("output").innerHTML = zeichen;
}
</script>
</head>
<body>
<form>
<output id="output" style="font-size: 400px; color:red">_</output>
<button type="button" onClick="wuerfel()">Würfeln</button>
</form>
</body>
</html>
Quadratische Funktion
Wir wollen in einem Formular die Funktionswerte einer quadratischen Funktion $y=a x^2 + b x + c$ berechnen. Hierzu benötigen wir Input die Faktoren a, b und c sowie die Grenzen, in denen die Berechnung erfolgen soll. Das wird mit ganz normalen <input>-Feldern vom Typ text realisiert, und die Felder werden mit IDs versehen, sodass man diese über Javascript bequem ansprechen kann.
Die eigentliche Berechnung wird über ein onClick-Ereignis eines Buttons gestartet, den wir mit Berechnen beschriften.
Für die Ausgabe haben wir ein <textarea> vorgesehen. Das ist nichts anderes als ein Textfeld, welches sich über mehrere Zeilen erstreckt. Die Anzahl der Zeilen kann über das Attribut Rowe eingestellt werden. Bei uns ist rows=“20″, also sind standardmäßig 20 Zeilen sichtbar. Über cols kann die Anzahl der Spalten beeinflusst werden. Im Browser lässt sich die Dimension des Textbereichs mit der Maus anpassen.
In der Funktion berechnen werden zunächst die eingegebenen Werte mit document.getElementById ausgelesen. Mit der Funktion parseFloat wird sichergestellt, dass die Werte auch tatsächlich als Zahlen interpretiert werden.
Die Funktionswerte werden in einer for-Schleife berechnet. Oben haben wir bereits gelernt, dass eine derartige Schleife über drei Ausdrücke definiert wird. Hier beginnt die Schleife bei der unteren Grenze, geht bis einschließlich der oberen Grenze und der Zähler i wird immer um 1 heraufgesetzt.
Eine Variable vom Typ String wird innerhalb der for-Schleife sukzessive erweitert, nämlich jeweils um den Wert von x gefolgt von einem Tabulator \t, dem berechneten Funktionswert und einem Zeilenendezeichen \n.
<html>
<head>
<meta charset="utf-8">
<title>Quadratische Funktion</title>
<script>
function berechnen() {
let s = "";
let a = document.getElementById("a").value;
let b = document.getElementById("b").value;
let c = document.getElementById("c").value;
let von = document.getElementById("von").value;
let bis = document.getElementById("bis").value;
a = parseFloat(a);
b = parseFloat(b);
c = parseFloat(c);
von = parseFloat(von);
bis = parseFloat(bis);
for (let i=von; i<=bis; i++) {
s += i + "\t" + (a*i*i + b*i +c) + "\n";
}
document.getElementById("ausgabe").innerHTML = s;
}
</script>
</head>
<body>
<h1>Funktionswerte einer quadratischen Funktion</h1>
<h2>y = a x<sup>2</sup> + b x + c </h2>
<form>
a <input type="text" id="a"> <br/>
b <input type="text" id="b"> <br/>
c <input type="text" id="c"> <br/>
Grenzen: <br/>
von <input type="text" id="von"> <br/>
bis <input type="text" id="bis"> <br/>
<button type="button" onClick="berechnen()">Berechnen</button>
<br/>
<textarea cols="20" rows="20" id="ausgabe"></textarea>
</form>
</body>
</html>