- Die HTMLTableElement API existiert schon lange, ist aber eine kaum genutzte eingebaute Schnittstelle zur Manipulation von HTML-Tabellen
- Mit dieser API lassen sich tbody, thead, tfoot, caption, row, cell usw. direkt erzeugen und ansprechen, ohne dass bei Änderungen die gesamte Tabelle neu gerendert werden muss
- Der Beispielcode zeigt, wie sich verschachtelte Array-Daten in eine Tabelle umwandeln lassen und wie man mit
insertRow() und insertCell() Zeilen und Zellen hinzufügt
- Möglich sind auch verschiedene weitere Operationen, etwa der Zugriff auf Zellen per Index wie in
t.rows[1].cells[1] oder das Anhängen der letzten Zeile mit insertRow(-1)
- Der Autor erwähnt, dass diese API Potenzial für eine erweiterte Tabellenfunktion als Datenstruktur hat und sich ähnlich wie bei Formularen durch Events oder Zusatzfunktionen ausbauen ließe
Überblick über die HTML-Tabellen-API
- Die meisten Entwickler erzeugen Tabellen mit DOM-Methoden (
createElement usw.) oder durch das Einfügen von innerHTML-Strings, wobei Letzteres Sicherheitsrisiken birgt
- In HTML gibt es die ältere HTMLTableElement API, mit der sich Tabelleninhalt, Zeilen, Zellen, Kopfbereich, Fußbereich, Beschriftung und Zusammenfassung (
summary) behandeln lassen
- Mit dieser API können einzelne Elemente manipuliert werden, ohne die gesamte Tabelle neu zu rendern
Codebeispiel: Eine Tabelle aus Arrays erzeugen
- Im Beispiel wird das folgende verschachtelte Array in eine Tabelle umgewandelt
[['one','two','three'], ['four','five','six']]
- Die Tabelle wird mit
document.createElement('table') erstellt, danach werden per Schleife die einzelnen Zeilen (insertRow) und Zellen (insertCell) hinzugefügt
- Der Inhalt jeder Zelle wird über
innerText gesetzt
Zugriff auf Zellen und Bearbeitung
- Auf die Zellen der erzeugten Tabelle kann indexbasiert zugegriffen werden
- Beispiel:
t.rows[1].cells[1] → <td>five</td>
- Zeilen und Zellen lassen sich auch löschen oder neu hinzufügen
- Beispiel: Mit
t.insertRow(-1) wird am Ende eine Zeile angefügt
- Mit
t.rows[2].insertCell(0) wird eine neue Zelle erzeugt und anschließend per innerText = 'foo' mit einem Wert belegt
Grenzen der API
- Es gibt nicht intuitive Indexregeln wie bei
insertRow(-1)
- Es gibt keine direkte Möglichkeit, ein TH-Element zu erzeugen, alle Zellen werden als TD behandelt
Mögliche Erweiterungen in Zukunft
- Der Autor weist darauf hin, dass die Erstellung von Tabellen in der Praxis umständlich ist, und schlägt vor, diese API erneut zu betrachten und funktional zu erweitern
- So wie HTML-Formulare um
formData oder change-Events ergänzt wurden, könnten auch Tabellen Events oder fortgeschrittene Funktionen erhalten
- Dadurch könnten Tabellen den Status einer Datenstruktur statt nur eines Layout-Werkzeugs bekommen
2 Kommentare
Als Entwickler mit vergleichsweise wenig Erfahrung bin ich überrascht von Artikeln, die so wirken, als hätten sie APIs, die es schon von Anfang an gibt, erst jetzt „entdeckt“.
Hacker-News-Kommentare
Viele Leute scheinen den Artikel nicht richtig gelesen zu haben Der Kern des Beitrags ist nicht das ``-Tag selbst, sondern die spezielle DOM-Schnittstelle für Tabellen Methoden wie
HTMLTableElement.prototype.insertRow()oderHTMLTableRowElement.prototype.insertCell()sind zum Beispiel intuitiver alscreateElement()oderappendChild()In bibliotheksbasierten UIs wie React, Svelte oder Vue werden solche Methoden heute aber kaum noch verwendet Interessant ist, dass wie in der HTML-Syntaxthead,tbodyundtfootauch dann automatisch verarbeitet werden, wenn man sie weglässt Ich habe in den letzten fünf Jahren in Demo-Skripten selbst direkt.insertRow,.insertCell,.createTHead,.rowsund.cellsverwendet Vom Code-Stil her finde ichforstattforEachsauberer, und auch das Weglassen des Index-Arguments wirkt auf mich aufgeräumterIch erinnere mich, diese API vor etwa einem halben Jahr verwendet zu haben, nachdem ich die MDN-Dokumentation gelesen hatte oder sie mir von einer AI empfohlen wurde Die Eigenschaften
rowsundcellswaren für die Implementierung der Tastaturnavigation sehr praktisch Ein passendes Beispiel findet sich im ClickHouse-CodeDas ist ein ähnlicher Kontext wie die Diskussion über Buttons (früherer Thread) Seit vor etwa 10 bis 15 Jahren alles zu `` geworden ist, wird HTML statt für semantisches Markup eher wie ein UI-Werkzeugkasten benutzt
bevorzugen Eigentlich halte ich schon die Trennung zwischenund `` für einen DesignfehlerIch habe diese API beim Bau eines Tools zum Vergleich von Stable-Diffusion-Bildern verwendet Weil es viele Zeilen und Spalten gab und die Tabelle oft neu erzeugt werden musste, waren DOM-Updates langsamer als die Methode, alles auf einmal als String zu erzeugen Vermutlich liegt das daran, dass jeder API-Aufruf das DOM sofort aktualisiert
Es hieß, man müsse nicht "die ganze Tabelle neu rendern", aber tatsächlich verhalten sich die Standard-DOM-Methoden ohnehin schon so Trotzdem ist es ziemlich nett, dass sich langweiliges DOM-Durchhangeln reduzieren lässt
Auch die HTML-Form-API sollte man wieder neu entdecken
Das Problem bei Tabellen ist nicht das Befüllen mit Daten, sondern dass Suche, Sortierung und Filterung komplett fehlen
Ich verstehe nicht, was mit "diese API wurde aufgegeben" gemeint ist Ich nutze sie beim Erstellen von HTML-Tabellen immer noch häufig
Der Beispielcode ist interessant, aber die Variablennamen sind zu stark verkürzt und dadurch schlechter lesbar Statt
b,t,r,csollte man besser aussagekräftige Namen verwenden(ri, i)Variablen mit ähnlicher Rolle sollten auch in ihrer Länge einheitlich seinlet b = document.body;sind besonders schwer zu lesen Für ein paar gesparte Bytes steigt nur die kognitive Last