Lösungen

Aufgabe: Countdown mit Formular als Liste erzeugen

Die folgende HTML-Datei definiert ein Eingabefeld für eine Zahl. Sobald eine Zahl eingegeben und abgeschickt wurde, wird unter dem Eingabefeld ein Countdown angezeigt.

<!DOCTYPE html>
<html>
  <head>
    <title>Zähler</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" type="text/css" href="styles.css">
  </head>
  <body>
    <h1>Zähler</h1>
    <form>
      <input type="number" name="start">
      <input type="submit">
    </form>
    <ul>
      <script type="text/javascript">
        var counter = parseInt(window.location.search.substring(7));

        while (counter > 0) {
          document.write("<li>");
          document.write(counter);
          document.write("</li>");

          counter = counter - 1;
        }
      </script>
    </ul>
  </body>
</html>

Das Eingabefeld verwendet statt type="text" das Attribut type="number". Dies führt dazu, dass in einigen Browsern Pfeiltasten eingeblendet werden, mit denen die Zahl verändert werden kann.

Wenn die Eingabe abgeschickt wird, wird die Seite mit einem Query-String der Form ?start=42 neu aufgerufen. start ist hier der Name des Eingabefeldes für den Startwert und 42 ein möglicher eingegebener Wert. Die 42 erhalten wir also, indem wir den Query-String ab Position 7 in eine Zahl umwandeln.

Statt eines Absatzelementes erzeugen wir <li>-Elemente, die dem <ul>-Element hinzugefügt werden, in dem das Skript notiert ist.

Aufgabe: Multiplikationstabelle mit DOM erzeugen

Die folgende HTML-Datei definiert ein Eingabefeld für eine Zahl und eine Tabelle, in der die Multiplikationstabelle bis zur angegebenen Grenze erzeugt werden soll.

<!DOCTYPE html>
<html>
  <head>
    <title>Multiplikationstabelle</title>
    <script src="multtab.js"></script>
    <link rel="stylesheet" href="multtab.css">
  </head>
  <body onload="fillMultTab();">
    <form>
      <input type="number" name="size">
      <input type="submit" value="los">
    </form>
    <table id="multtab"></table>
  </body>
</html>

Nachdem das Dokument geladen ist, wird die Funktion fillMultTab aufgerufen, die in der Datei multtab.js definiert ist, die ihrerseits im Kopf des Dokumentes geladen wurde.

function fillMultTab() {
  var query = window.location.search;
  if (query.length > 0) {
    var tab = document.getElementById('multtab');
    var size = parseInt(query.substring(6));
    for (var rowIndex = 1; rowIndex <= size; rowIndex = rowIndex + 1) {
      var row = document.createElement('tr');
      for (var colIndex = 1; colIndex <= size; colIndex = colIndex + 1) {
        var col = document.createElement('td');
        var prod = document.createTextNode(rowIndex * colIndex);
        col.appendChild(prod);
        row.appendChild(col);
      }
      tab.appendChild(row);
    }
  }
}

Diese Funktion greift auf das Tabellen-Objekt anhand des Wertes seines id-Attributes zu. Die eingegebene Zahl wird aus dem Query-String extrahiert, falls eine Zahl eingegeben wurde.

In einer Schleife werden dann zunächst Tabellenzeilen erzeugt und der Tabelle hinzugefügt und dann in einer geschachtelten Schleife jeder erzeugten Zeile die einzutragenden Produkte hinzugefügt. Elemente mit Kindern erzeugen wir mit Hilfe der Methode createElement, Text-Objekte mit createTextNode. Beide Schleifen laufen von 1 bis zur eingegebenen Zahl, so dass eine quadratische Tabelle ausgegeben wird.

Damit die Zahlen rechtsbündig ausgerichtet werden, fügen wir der eingebundenen Datei multtab.css die folgende Definition hinzu.

td {
  border: thin solid grey;
  text-align: right;
  width: 2em;
}

tr:first-child, td:first-child {
  font-weight: bold;
}

Zusätzlich wird hier die Breite von Tabellenzellen vereinheitlicht und jeder Eintrag mit einem grauen Rahmen versehen. Außerdem werden Einträge der ersten Zeile sowie der ersten Spalte fett dargestellt.

Bonusaufgabe: Pythagoräische Tripel mit DOM erzeugen

Das folgende HTML-Dokument erzeugt eine Auflistung pythagoräischer Tripel mit Hilfe des Document-Object Models in Javascript.

<!DOCTYPE html>
<html><head><meta charset="utf-8"><script>
function showPyTriples() {
  var list = document.getElementById("pytriples");
  var size = parseInt(window.location.search.substring(6));
  var triples = pyTriples(size);
  for (var index = 0; index < triples.length; index++) {
    list.appendChild(pyTripleItem(triples[index]));
  }
}

function pyTriples(size) {
  triples = [];
  for (var a = 1; a <= size; a++) {
    for (var b = a; b <= size; b++) {
      for (var c = b; c <= size; c++) {
        if (a*a + b*b == c*c) {
          triples.push({"a": a, "b": b, "c": c});
        }
      }
    }
  }
  return triples;
}

function pyTripleItem(triple) {
  return elem("li", [
    text(triple["a"]), elem("sup", [text("2")]), text(" + "),
    text(triple["b"]), elem("sup", [text("2")]), text(" = "),
    text(triple["c"]), elem("sup", [text("2")])
  ]);
}

function elem(name, args) {
  var result = document.createElement(name);
  for (var i = 0; i < args.length; i++) {
    result.appendChild(args[i]);
  }
  return result;
}

function text(value) {
  return document.createTextNode(value);
}
</script></head><body onload="showPyTriples();">
  <form>
    Berechne Pythagoräische Tripel bis zu einer gegebenen Größe:
    <input type="number" min="1" name="size" placeholder="Größe">
    <input type="submit" value="anzeigen">
  </form>
  <ul id="pytriples"></ul>
</body></html>

Statt das Skript in einer Extradatei zu definieren und nach dem Laden des Dokumentes aufzurufen, schreiben wir es in die Datei hinein.

Das Skript definiert Hilfsfunktionen, die Dokument-Objekte erzeugen. Außerdem gibt es eine Funktion zum Erzeugen Pythagoräischer Tripel, die mit Hilfe geschachtelter Schleifen alle Pythagoräischen Tripel so aufzählt, dass der erste Summand kleiner als der zweite ist. Tripel werden von dieser Funktion als Array von Hashes zurückgeliefert, die in Javascript Objects heißen.