- La API de HTMLTableElement existe desde hace mucho tiempo, pero es una interfaz integrada para manipular tablas HTML que casi no se usa
- Con esta API se pueden crear y acceder directamente a tbody, thead, tfoot, caption, row y cell, sin necesidad de volver a renderizar toda la tabla cuando hay cambios
- El código de ejemplo muestra cómo convertir datos en arreglos anidados en una tabla y cómo agregar filas y celdas con
insertRow() e insertCell()
- También permite varias operaciones, como acceder a celdas por índice con
t.rows[1].cells[1] o agregar la última fila con insertRow(-1)
- El autor menciona que esta API tiene potencial para ampliar las capacidades de la tabla como estructura de datos, con espacio para añadir eventos o funciones extra, como en los formularios
Resumen de la API de tablas HTML
- La mayoría de los desarrolladores crean tablas con métodos del DOM (
createElement, etc.) o insertando cadenas con innerHTML, pero esto último implica riesgos de seguridad
- HTML incluye una antigua API de HTMLTableElement con la que se puede manejar el cuerpo, filas, celdas, encabezado, pie, caption y summary de una tabla
- Esta API permite manipular elementos individuales sin volver a renderizar toda la tabla
Ejemplo de código: crear una tabla desde un arreglo
- En el ejemplo se convierte el siguiente arreglo anidado en una tabla
[['one','two','three'], ['four','five','six']]
- La tabla se crea con
document.createElement('table'), y luego se agregan en bucle cada fila (insertRow) y cada celda (insertCell)
- El contenido de cada celda se asigna con
innerText
Acceso y modificación de celdas
- Se puede acceder a las celdas de la tabla creada por índice
- Ejemplo:
t.rows[1].cells[1] → <td>five</td>
- También es posible eliminar o agregar filas y celdas
- Ejemplo:
t.insertRow(-1) agrega una fila al final
t.rows[2].insertCell(0) crea una nueva celda y luego se le asigna innerText = 'foo'
Limitaciones de la API
- Existen reglas de índices poco intuitivas, como
insertRow(-1)
- No hay forma de crear directamente elementos TH, por lo que todas las celdas se manejan como TD
Posibles ampliaciones futuras
- El autor señala que crear tablas sigue siendo engorroso y propone revisar esta API para ampliar sus funciones
- Igual que a los formularios HTML se les añadieron formData o eventos change, menciona que también podrían incorporarse eventos o funciones avanzadas a las tablas
- Con ello, la tabla podría consolidarse no solo como una herramienta de layout, sino como una estructura de datos
2 comentarios
Como desarrollador con relativamente poca experiencia, me sorprenden los artículos que hablan como si hubieran "descubierto" una API que han estado usando desde el principio.
Opiniones de Hacker News
Parece que mucha gente no leyó bien el artículo El punto central de este texto no es la etiqueta `` en sí, sino la interfaz DOM específica para tablas Por ejemplo, métodos como
HTMLTableElement.prototype.insertRow()oHTMLTableRowElement.prototype.insertCell()son más intuitivos quecreateElement()oappendChild()Pero en las UI basadas en librerías como React, Svelte o Vue, casi ya no se usan este tipo de métodos También es interesante que, como en la sintaxis de HTML, aunque omitasthead,tbodyotfoot, se manejan automáticamente En los últimos 5 años sí he usado directamente.insertRow,.insertCell,.createTHead,.rowsy.cellsen scripts de demostración En cuanto al estilo de código, me parece más limpio usarforen vez deforEachy omitir el argumento del índiceRecuerdo haber usado esta API hace como medio año, ya sea por la documentación de MDN o porque me la recomendó una IA Las propiedades
rowsycellsfueron muy útiles para implementar navegación con teclado Se puede ver un ejemplo relacionado en el código de ClickHousedivNo ordenan bien y, sobre todo, hay casos como M365 Admin donde la implementación de tablas es un desastreVa en una línea similar a la discusión sobre botones (hilo anterior) Desde hace unos 10 o 15 años, todo se fue convirtiendo en ``, y HTML empezó a usarse como una caja de herramientas de UI en lugar de marcado semántico
neutro De hecho, creo que haber separadoy `` también fue un error de diseñodiv, pero en cosas como botones normalmente sí lo escriben correctamenteUsé esta API al hacer una herramienta para comparar imágenes de Stable Diffusion Como había muchas filas y columnas y había que recrear la tabla con frecuencia, actualizar el DOM era más lento que generar todo de una vez como cadena Supongo que es porque cada llamada a la API actualiza el DOM de inmediato
Había una explicación de que “no hace falta volver a renderizar toda la tabla”, pero en realidad los métodos estándar del DOM ya funcionan así Aun así, está bastante bien que ayude a reducir la navegación tediosa por el DOM
También hace falta redescubrir la API de formularios HTML
El problema de las tablas no es llenarlas de datos, sino que no traen funciones de búsqueda, ordenamiento ni filtrado
No entiendo eso de que “esta API fue abandonada” Yo todavía la uso con frecuencia cuando hago tablas HTML
El código de ejemplo es interesante, pero abrevia demasiado los nombres de variables y eso dificulta la lectura En vez de
b,t,r,c, sería mejor usar nombres con significado(ri, i)Si las variables cumplen roles parecidos, conviene unificar también la longitud de sus nombreslet b = document.body;es especialmente difícil de leer Por ahorrarte unos bytes, solo aumentas la carga cognitiva