JavaScriptsVerschiedenes

Tabellengenerator

Legt ein Raster aus Zeilen und Spalten an, füllt es mit Inhalten und liefert den fertigen HTML-Code der Tabelle.

Dieser Tabellengenerator wurde uns von David L. eingeschickt. Ihr legt fest, wie viele Zeilen und Spalten die Tabelle haben soll, tragt die Inhalte ein — und bekommt sofort eine Vorschau und den passenden HTML-Code, den ihr in eure eigene Seite kopieren könnt. Wer sich vertippt hat, ändert den Text einfach im Raster: Vorschau und Code aktualisieren sich bei jedem Tastendruck.

Die Bedienung: Oben stehen die Anzahl der Zeilen und der Spalten. Ein Klick auf „Raster anlegen" baut die Eingabefelder auf, wobei bereits eingetragene Inhalte erhalten bleiben, solange die Tabelle nicht kleiner wird. Darunter erscheint die Vorschau, und ganz unten steht der HTML-Code. „Inhalte leeren" räumt alle Felder aus, ohne das Raster zu verändern. Ein Beispiel ist bereits eingetragen, ihr könnt also sofort sehen, was herauskommt.

Die ursprüngliche Fassung fragte alle Angaben nacheinander über Dialogfenster ab — erst die Zeilen, dann die Spalten, dann Zelle für Zelle den Inhalt. Bei einer Tabelle mit vier Spalten und fünf Zeilen waren das 22 Dialoge hintereinander, und ein Vertipper ließ sich nur über eine weitere Reihe von Dialogen korrigieren. Deshalb tragt ihr die Inhalte hier direkt in ein Raster ein; die Funktion zum nachträglichen Ändern einer Zelle ist damit gleich mit erledigt.

Ein Wort zur erzeugten Tabelle: Sie besteht aus <table>, <tr> für jede Zeile und <td> für jede Zelle. Rahmen und Innenabstand stecken als style-Angabe direkt im Code, damit die Tabelle auch auf einer Seite ohne eigenes Stylesheet ordentlich aussieht — ihr könnt diese Angaben nach dem Einfügen gern durch eure eigenen CSS-Regeln ersetzen. Und noch ein Hinweis in eigener Sache: Tabellen gehören in Webseiten nur dort hin, wo tatsächlich Daten in Zeilen und Spalten stehen. Für das Seitenlayout selbst nimmt man heute CSS.

Verschiedenes Baujahr 2009 läuft in deinem Browser

Vorschau

HTML-Code der Tabelle

Möglich sind bis zu 20 Zeilen und 12 Spalten.

Eingesandt von David L.

So funktioniert das Script

Das Script hat zwei Kernaufgaben: Es baut aus zwei Zahlen ein Raster von Eingabefeldern, und es setzt aus den Inhalten dieser Felder den HTML-Code einer Tabelle zusammen. Alles Übrige hängt daran — die Vorschau ist derselbe Code, nur in die Seite eingesetzt, und der Knopf „Inhalte leeren" räumt die Felder aus und lässt neu zusammensetzen. Die Verbindung zwischen beiden Aufgaben ist die Liste felder: Sie merkt sich zu jeder Zeile und Spalte das zugehörige Eingabefeld.

for (let i = 0; i < zeilen; i++) {
  const zeile = document.createElement("tr");
  felder[i] = [];

  for (let k = 0; k < spalten; k++) {
    const zelle = document.createElement("td");
    const feld = document.createElement("input");

So entsteht das Raster. Zwei ineinander geschachtelte Schleifen laufen über alle Zeilen und darin über alle Spalten — das ist das übliche Muster, wenn man etwas Zweidimensionales durchgehen will. document.createElement() erzeugt jeweils ein neues, noch nicht sichtbares Element; erst appendChild() hängt es an die richtige Stelle. felder[i] = [] legt für jede Zeile eine leere Liste an, in die anschließend die Eingabefelder dieser Zeile wandern. Am Ende ist felder eine Liste von Listen, und felder[2][0] ist das Feld in der dritten Zeile, erste Spalte — gezählt wird in JavaScript ab 0.

if (alt[i] && alt[i][k]) {
  feld.value = alt[i][k].value;
}

Bevor das Raster neu gebaut wird, merkt sich das Script die alten Felder in alt. Gibt es an derselben Stelle bereits ein Feld, wird sein Text in das neue übernommen — deshalb geht beim Vergrößern der Tabelle nichts verloren. Die Prüfung mit && ist nötig, weil die alte Tabelle kleiner sein kann: alt[i] wäre dann undefined, und der Zugriff darauf würde das Script mit einem Fehler abbrechen. JavaScript wertet && von links nach rechts aus und hört auf, sobald ein Teil unwahr ist — der zweite Zugriff findet also gar nicht erst statt.

feld.addEventListener("input", aktualisieren);

Jedes einzelne Eingabefeld bekommt beim Anlegen seinen eigenen Lauscher. Das Ereignis input tritt bei jeder Änderung des Inhalts ein, also auch beim Einfügen mit der Maus — anders als change, das erst zuschlägt, wenn das Feld den Fokus verliert. Deshalb wachsen Vorschau und Code beim Tippen mit.

function maskieren(text) {
  return text.replace(/&/g, "&amp;")
             .replace(/</g, "&lt;")
             .replace(/>/g, "&gt;");
}

Diese kleine Funktion ist wichtiger, als sie aussieht. Tippt jemand in eine Zelle den Text 5 < 8, dann darf das spitze Klammerzeichen nicht als Anfang eines HTML-Tags im erzeugten Code landen — die Tabelle wäre kaputt. maskieren() ersetzt deshalb die drei Zeichen, die in HTML eine Sonderbedeutung haben, durch ihre Umschreibungen. Das /g hinter dem Suchmuster steht für „global" und sorgt dafür, dass nicht nur das erste Vorkommen ersetzt wird. Das kaufmännische Und muss dabei zuerst ersetzt werden, sonst würde der Ersatz der anderen beiden gleich wieder mitmaskiert.

const html = htmlErzeugen();
codefeld.value = html;
vorschau.innerHTML = html;

Vorschau und Codefeld werden aus derselben Zeichenkette gefüllt. Das Textfeld bekommt sie über value als reinen Text zu sehen, die Vorschau über innerHTML als echtes HTML — was ihr oben seht, ist also wirklich das, was unten im Code steht. Dass innerHTML hier gefahrlos ist, liegt allein an maskieren(): Ohne diese Absicherung könnte eingetippter Text eigene Tags in die Seite schmuggeln.

Zum Anpassen: Das Aussehen der erzeugten Tabelle steckt in den beiden style-Angaben in htmlErzeugen() — dort ändert ihr Rahmenfarbe, Innenabstand oder die Ausrichtung. Wer die erste Zeile als Kopfzeile möchte, ersetzt für i === 0 das td durch th. Und die Grenzen für die Größe des Rasters stehen in MAX_ZEILEN und MAX_SPALTEN ganz oben.

Script für die eigene Homepage

Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.

Mehr aus der Kategorie Verschiedenes