- HTMLTableElement API, uzun zamandır var olan ancak neredeyse hiç kullanılmayan, HTML tablolarını yönetmeye yönelik yerleşik bir arayüzdür
- Bu API ile tbody, thead, tfoot, caption, row, cell gibi öğeler doğrudan oluşturulup erişilebilir; değişiklik yapıldığında tüm tabloyu yeniden render etmek gerekmez
- Örnek kodda iç içe dizilerden tablo üretme ve
insertRow() ile insertCell() kullanarak satır ve hücre ekleme yöntemi gösteriliyor
t.rows[1].cells[1] gibi ifadelerle hücrelere indeksle erişmek veya insertRow(-1) ile sona satır eklemek gibi çeşitli işlemler mümkün
- Yazar, bu API’nin bir veri yapısı olarak tablonun işlevlerini genişletme potansiyeline sahip olduğunu, form gibi olaylar veya ek yeteneklerle geliştirilebileceğini belirtiyor
HTML tablo API’sine genel bakış
- Geliştiricilerin çoğu tabloları DOM metotlarıyla (
createElement vb.) ya da innerHTML ile metin ekleyerek oluşturuyor; ancak ikinci yöntem güvenlik riski taşıyor
- HTML’de eski bir HTMLTableElement API bulunuyor ve bununla tablonun gövdesi, satırları, hücreleri, başlığı, alt bilgisi, caption ve summary gibi bölümleri yönetilebiliyor
- Bu API sayesinde tablonun tamamını yeniden render etmeden tek tek öğeler üzerinde işlem yapılabiliyor
Kod örneği: diziden tablo oluşturma
- Örnekte aşağıdaki gibi bir iç içe dizi tabloya dönüştürülüyor
[['one','two','three'], ['four','five','six']]
document.createElement('table') ile tablo oluşturuluyor, ardından her satır (insertRow) ve hücre (insertCell) döngü içinde ekleniyor
- Her hücrenin içeriği
innerText ile ayarlanıyor
Hücreye erişim ve düzenleme
- Oluşturulan tablodaki hücrelere indeks tabanlı erişim mümkün
- Örnek:
t.rows[1].cells[1] → <td>five</td>
- Satırlar ve hücreler silinebilir veya yenileri eklenebilir
- Örnek:
t.insertRow(-1) ile sona satır ekleme
t.rows[2].insertCell(0) ile yeni hücre oluşturup ardından innerText = 'foo' ile değer atama
API’nin sınırlamaları
insertRow(-1) gibi sezgisel olmayan indeks kuralları bulunuyor
- TH öğesini doğrudan oluşturmanın bir yolu yok, tüm hücreler TD olarak ele alınıyor
Gelecekte genişletme potansiyeli
- Yazar, tablo oluşturmanın pratikte zahmetli olduğunu vurgulayarak bu API’nin yeniden değerlendirilip işlevlerinin genişletilmesi gerektiğini öne sürüyor
- HTML formlarına formData ya da change event eklendiği gibi, tablolara da event’ler veya gelişmiş özellikler kazandırılabileceğini belirtiyor
- Böylece tablolar yalnızca bir yerleşim aracı değil, bir veri yapısı olarak da konum kazanabilir
2 yorum
Nispeten az deneyimli bir geliştirici olarak, en başından beri kullanılan bir API'den sanki onu "keşfetmiş" gibi söz eden yazılar beni şaşırtıyor.
Hacker News yorumları
Görünüşe göre birçok kişi makaleyi doğru düzgün okumamış. Bu yazının özü `` etiketinin kendisi değil, table’a özel DOM arayüzleri. Örneğin
HTMLTableElement.prototype.insertRow()veyaHTMLTableRowElement.prototype.insertCell()gibi metodlar,createElement()ya daappendChild()kullanımından daha sezgisel. Ancak React, Svelte, Vue gibi kütüphane tabanlı UI dünyasında bu tür metodlar artık neredeyse hiç kullanılmıyor. HTML sözdiziminde olduğu gibithead,tbody,tfootatlandığında bunun otomatik ele alınması ilginç. Son 5 yılda demo script’lerinde.insertRow,.insertCell,.createTHead,.rows,.cellsöğelerini doğrudan kullandığım oldu. Kod stili açısındanforEachyerineforkullanmanın ve indeks parametresini atlamanın daha temiz olduğunu düşünüyorum.Yaklaşık altı ay önce MDN belgelerine bakarken ya da AI tavsiyesiyle bu API’yi kullandığımı hatırlıyorum.
rowsvecellsözellikleri, klavye gezinmesi uygularken çok kullanışlıydı. Bununla ilgili bir örnek ClickHouse kodunda görülebilir.Bu, butonlarla ilgili tartışmayla (önceki başlık) benzer bir bağlamda. Yaklaşık 10~15 yıl önce her şey `` olmaya başladı ve HTML, semantik işaretleme yerine bir UI araç kutusu gibi kullanılmaya başlandı.
etiketini tercih ediyor. Aslındave `` ayrımının yapılmış olmasını da bir tasarım hatası olarak görüyorum.Stable Diffusion görsel karşılaştırma aracı yaparken bu API’yi kullanmıştım. Çok sayıda satır ve sütun olduğu için tabloyu sık sık yeniden oluşturmak gerekiyordu; ancak tek seferde string üretme yaklaşımına kıyasla DOM güncellemeleri daha yavaş kaldı. Sanırım bunun nedeni her API çağrısının DOM’u anında güncellemesi.
“Tüm tabloyu yeniden render etmeye gerek yok” deniyordu ama aslında standart DOM metodları da zaten böyle çalışıyor. Yine de sıkıcı DOM dolaşımını azaltabilmesi oldukça hoş.
HTML form API’sini de yeniden keşfetmek gerekiyor.
Tabloların sorunu veri doldurmak değil, arama·sıralama·filtreleme özelliklerinin hiç olmaması.
“Bu API terk edilmiş” denmesini anlamıyorum. Ben hâlâ HTML tabloları oluştururken bunu sık kullanıyorum.
Örnek kod ilginç ama değişken adları fazla kısaltıldığı için okunabilirlik düşüyor.
b,t,r,cyerine anlamlı adlar kullanmak daha iyi.(ri, i)gibi karışık indeks kullanımı daha kafa karıştırıcı. Benzer role sahip değişkenlerde uzunluğu da tutarlı yapmak iyi olur.let b = document.body;gibi satırları okumak zor. Birkaç byte tasarruf edeceğim diye sadece bilişsel yük artıyor.