- HTMLTableElement API มีมานานแล้ว แต่แทบไม่ค่อยถูกใช้งาน เป็น อินเทอร์เฟซในตัวสำหรับจัดการตาราง HTML
- API นี้ช่วยให้สร้างและเข้าถึง tbody, thead, tfoot, caption, row, cell ได้โดยตรง และเมื่อมีการเปลี่ยนแปลงก็ไม่จำเป็นต้องเรนเดอร์ตารางทั้งหมดใหม่
- โค้ดตัวอย่างแสดงวิธี แปลงข้อมูลอาร์เรย์แบบซ้อนให้เป็นตาราง และเพิ่มแถวกับเซลล์ผ่าน
insertRow() และ insertCell()
- สามารถ เข้าถึงเซลล์ด้วยดัชนี อย่าง
t.rows[1].cells[1] หรือจัดการแบบต่าง ๆ เช่น เพิ่มแถวสุดท้าย ด้วย insertRow(-1)
- ผู้เขียนกล่าวว่า API นี้มี ศักยภาพในการขยายความสามารถของตารางในฐานะโครงสร้างข้อมูล และยังมีช่องให้เพิ่ม event หรือความสามารถเสริมแบบเดียวกับ form ได้
ภาพรวมของ HTML Table API
- นักพัฒนาส่วนใหญ่สร้างตารางด้วย เมธอด DOM (
createElement เป็นต้น) หรือ แทรกสตริงด้วย innerHTML แต่แบบหลังมี ความเสี่ยงด้านความปลอดภัย
- ใน HTML มี HTMLTableElement API แบบเก่าอยู่แล้ว ซึ่งช่วยให้จัดการ เนื้อหาตาราง, แถว, เซลล์, ส่วนหัว, ส่วนท้าย, caption, summary ได้
- API นี้สามารถจัดการองค์ประกอบแต่ละส่วนได้ โดยไม่ต้องเรนเดอร์ตารางทั้งก้อนใหม่
ตัวอย่างโค้ด: สร้างตารางจากอาร์เรย์
- ตัวอย่างนี้แปลง อาร์เรย์แบบซ้อน ต่อไปนี้ให้เป็นตาราง
[['one','two','three'], ['four','five','six']]
- สร้างตารางด้วย
document.createElement('table') แล้ววนลูปเพิ่มแต่ละแถว (insertRow) และแต่ละเซลล์ (insertCell)
- กำหนดเนื้อหาแต่ละเซลล์ด้วย
innerText
การเข้าถึงและแก้ไขเซลล์
- เซลล์ในตารางที่สร้างแล้วสามารถ เข้าถึงแบบอิงดัชนี ได้
- ตัวอย่าง:
t.rows[1].cells[1] → <td>five</td>
- ยังสามารถ ลบหรือเพิ่มแถวและเซลล์ใหม่ ได้ด้วย
- ตัวอย่าง:
t.insertRow(-1) เพื่อเพิ่มแถวที่ท้ายสุด
- ใช้
t.rows[2].insertCell(0) เพื่อสร้างเซลล์ใหม่ แล้วกำหนดค่า innerText = 'foo'
ข้อจำกัดของ API
- มี กฎดัชนีที่ไม่ค่อยตรงไปตรงมา เช่น
insertRow(-1)
- ไม่มีวิธีสร้างองค์ประกอบ TH โดยตรง ทำให้ทุกเซลล์ถูกจัดการเป็น TD
ความเป็นไปได้ในการขยายในอนาคต
- ผู้เขียนชี้ว่าการสร้างตารางยังเป็นเรื่องยุ่งยากในทางปฏิบัติ และเสนอว่า ควรกลับมาทบทวน API นี้เพื่อขยายความสามารถ
- เช่นเดียวกับที่ HTML form มี formData หรือ change event เพิ่มเข้ามา ตารางก็อาจรองรับ event หรือความสามารถขั้นสูง ได้เช่นกัน
- สิ่งนี้อาจทำให้ตารางมีสถานะเป็น โครงสร้างข้อมูล ไม่ใช่แค่เครื่องมือจัดเลย์เอาต์เท่านั้น
2 ความคิดเห็น
ในฐานะนักพัฒนาที่มีประสบการณ์ค่อนข้างน้อย ผมรู้สึกทึ่งกับบทความที่พูดถึง API ซึ่งใช้งานกันมาตั้งแต่แรก ราวกับเพิ่งไป "ค้นพบ" มันมา
ความเห็นจาก Hacker News
ดูเหมือนหลายคนจะไม่ได้อ่านบทความอย่างละเอียด ประเด็นสำคัญของบทความนี้ไม่ใช่ตัวแท็ก `` เอง แต่เป็น DOM interface สำหรับ table โดยเฉพาะ ตัวอย่างเช่น เมธอดอย่าง
HTMLTableElement.prototype.insertRow()หรือHTMLTableRowElement.prototype.insertCell()ใช้งานได้เข้าใจกว่าcreateElement()หรือappendChild()แต่ใน UI แบบอิงไลบรารี อย่าง React, Svelte, Vue ทุกวันนี้แทบไม่ค่อยได้ใช้เมธอดพวกนี้แล้ว สิ่งที่น่าสนใจคือมันจัดการให้อัตโนมัติได้แม้จะละthead,tbody,tfootเหมือนไวยากรณ์ HTML ในช่วง 5 ปีที่ผ่านมา ฉันเคยใช้.insertRow,.insertCell,.createTHead,.rows,.cellsโดยตรงในสคริปต์เดโมอยู่บ้าง ในแง่สไตล์โค้ด ฉันคิดว่าการใช้forแทนforEachและตัดอาร์กิวเมนต์ index ออกจะดูสะอาดกว่าจำได้ว่าเคยใช้ API นี้เมื่อราวครึ่งปีก่อน เพราะเห็นจากเอกสาร MDN หรือไม่ก็ AI แนะนำ พร็อพเพอร์ตี
rowsกับcellsสะดวกมากสำหรับการทำ คีย์บอร์ดเนวิเกชัน ตัวอย่างที่เกี่ยวข้องดูได้จาก โค้ดของ ClickHouseเป็นบริบทคล้ายกับการถกเรื่องปุ่ม(เธรดก่อนหน้า) ตั้งแต่ราว 10~15 ปีก่อน ทุกอย่างเริ่มกลายเป็น `` หมด จน HTML ถูกใช้เหมือนกล่องเครื่องมือทำ UI แทนที่จะเป็น semantic markup
ที่เป็นกลางมากกว่า จริง ๆ แล้วฉันคิดว่าการแยกกับ `` ออกเป็นคนละอย่างก็เป็น ความผิดพลาดด้านการออกแบบตอนทำเครื่องมือเปรียบเทียบภาพของ Stable Diffusion ฉันเคยใช้ API นี้ เพราะมีทั้งหลายแถวและหลายคอลัมน์จนต้องสร้างตารางใหม่บ่อย ๆ แต่ การอัปเดต DOM ช้ากว่า วิธีสร้างเป็นสตริงทีเดียว น่าจะเป็นเพราะแต่ละการเรียก API ทำให้ DOM อัปเดตทันที
มีคำอธิบายว่า “ไม่จำเป็นต้อง re-render ทั้งตาราง” แต่จริง ๆ แล้วเมธอด DOM มาตรฐานก็ทำงานแบบนั้นอยู่แล้ว ถึงอย่างนั้น การลด การไล่สำรวจ DOM ที่น่าเบื่อ ได้ก็ถือว่าเจ๋งมาก
HTML form API ก็ควรถูก ค้นพบใหม่ อีกครั้งเหมือนกัน
ปัญหาของตารางไม่ใช่เรื่องการใส่ข้อมูล แต่คือมัน ไม่มีความสามารถด้านค้นหา·จัดเรียง·กรองเลย
ฉันไม่เข้าใจคำพูดที่ว่า “API นี้ถูกทิ้งร้างแล้ว” ฉันยังใช้มันบ่อยอยู่เวลาสร้างตาราง HTML
โค้ดตัวอย่างน่าสนใจ แต่ย่อชื่อตัวแปรมากเกินไปจนอ่านยาก ควรใช้ ชื่อที่มีความหมาย แทน
b,t,r,c(ri, i)ถ้าตัวแปรมีบทบาทคล้ายกัน ก็ควรให้ความยาวชื่อสอดคล้องกันด้วยlet b = document.body;อ่านยากเป็นพิเศษ ประหยัดไปไม่กี่ไบต์ แต่กลับเพิ่ม ภาระทางความคิด เท่านั้น