- A API HTMLTableElement existe há muito tempo, mas é uma interface nativa para manipulação de tabelas HTML que quase não é usada
- Com essa API, é possível criar e acessar diretamente tbody, thead, tfoot, caption, row, cell etc., sem precisar renderizar a tabela inteira novamente a cada alteração
- O código de exemplo mostra como converter dados em arrays aninhados em uma tabela e adicionar linhas e células com
insertRow() e insertCell()
- Também é possível fazer várias manipulações, como acessar células por índice com
t.rows[1].cells[1] ou adicionar a última linha com insertRow(-1)
- O autor comenta que essa API tem potencial para ampliar as capacidades da tabela como estrutura de dados, com espaço para eventos e recursos extras, como acontece com formulários
Visão geral da API de tabelas HTML
- A maioria dos desenvolvedores cria tabelas com métodos do DOM (
createElement etc.) ou com inserção de strings via innerHTML, mas a segunda opção traz riscos de segurança
- O HTML tem uma antiga API HTMLTableElement, que permite lidar com corpo, linhas, células, cabeçalho, rodapé, legenda e resumo (
summary) da tabela
- Essa API permite manipular elementos individuais sem rerenderizar a tabela inteira
Exemplo de código: criando uma tabela a partir de um array
- No exemplo, o autor converte o seguinte array aninhado em uma tabela
[['one','two','three'], ['four','five','six']]
- A tabela é criada com
document.createElement('table'), e cada linha (insertRow) e célula (insertCell) é adicionada em um loop
- O conteúdo de cada célula é definido com
innerText
Acesso e modificação de células
- As células da tabela criada podem ser acessadas com base em índices
- Ex.:
t.rows[1].cells[1] → <td>five</td>
- Também é possível remover ou adicionar linhas e células
- Ex.:
t.insertRow(-1) adiciona uma linha ao final
t.rows[2].insertCell(0) cria uma nova célula, e depois innerText = 'foo' define seu valor
Limitações da API
- Existem regras de índice pouco intuitivas, como em
insertRow(-1)
- Não há como criar elementos TH diretamente, então todas as células acabam sendo tratadas como TD
Possibilidades de expansão futura
- O autor aponta que criar tabelas ainda é algo trabalhoso e sugere revisitar essa API para expandir suas funcionalidades
- Assim como formulários HTML ganharam
formData e eventos change, tabelas também poderiam receber eventos ou recursos avançados
- Com isso, a tabela poderia deixar de ser apenas uma ferramenta de layout e assumir um papel mais claro como estrutura de dados
2 comentários
Como um desenvolvedor com relativamente pouca experiência, fico surpreso com textos que falam como se tivessem “descoberto” uma API que está em uso desde o começo.
Comentários no Hacker News
Parece que muita gente não leu o artigo direito O ponto principal do texto não é a tag `` em si, mas sim a interface DOM específica para tabelas Por exemplo, métodos como
HTMLTableElement.prototype.insertRow()eHTMLTableRowElement.prototype.insertCell()são mais intuitivos do quecreateElement()ouappendChild()Mas em UIs baseadas em bibliotecas como React, Svelte e Vue, quase não se usa mais esse tipo de método É interessante que, como na sintaxe HTML, mesmo omitindothead,tbodyetfoot, isso é tratado automaticamente Nos últimos 5 anos, eu cheguei a usar diretamente.insertRow,.insertCell,.createTHead,.rowse.cellsem scripts de demonstração Em termos de estilo de código, acho mais limpo usarforem vez deforEache omitir o argumento de índiceLembro de ter usado essa API uns seis meses atrás, depois de ver a documentação da MDN ou por recomendação de uma IA As propriedades
rowsecellsforam muito úteis para implementar navegação por teclado Um exemplo relacionado pode ser visto no código do ClickHouseEstá no mesmo contexto da discussão sobre botões (thread anterior) Desde uns 10 a 15 anos atrás, tudo foi virando ``, e o HTML passou a ser usado mais como uma caixa de ferramentas de UI do que como marcação semântica
neutro Na verdade, acho até que separare `` foi um erro de designJá usei essa API ao criar uma ferramenta para comparar imagens do Stable Diffusion Como havia muitas linhas e colunas, era preciso recriar a tabela com frequência, mas atualizar o DOM era mais lento do que gerar tudo de uma vez como string Imagino que isso aconteça porque cada chamada da API atualiza o DOM imediatamente
Havia uma explicação dizendo que “não é necessário renderizar a tabela inteira de novo”, mas na verdade os métodos padrão do DOM já funcionam assim Ainda assim, é bem legal o fato de isso reduzir a navegação tediosa no DOM
A API de formulários HTML também precisa ser redescoberta
O problema das tabelas não é preencher os dados, e sim o fato de não terem recursos de busca, ordenação e filtragem
Não entendo a ideia de que “essa API foi abandonada” Eu ainda a uso com frequência para criar tabelas HTML
O código de exemplo é interessante, mas os nomes de variáveis são encurtados demais e isso prejudica a legibilidade Em vez de
b,t,rec, seria melhor usar nomes significativos(ri, i)Quando variáveis têm papéis parecidos, é melhor manter também um padrão no comprimento dos nomeslet b = document.body;são especialmente difíceis de ler Você economiza alguns bytes, mas só aumenta a carga cognitiva