- API HTMLTableElement đã tồn tại từ lâu nhưng là giao diện tích hợp sẵn để thao tác bảng HTML hầu như không được sử dụng
- Với API này, có thể trực tiếp tạo và truy cập tbody, thead, tfoot, caption, row, cell mà không cần render lại toàn bộ bảng mỗi khi thay đổi
- Đoạn mã ví dụ cho thấy cách chuyển dữ liệu mảng lồng nhau thành bảng và thêm hàng, ô bằng
insertRow() và insertCell()
- Có thể truy cập ô theo chỉ số như
t.rows[1].cells[1], hoặc thao tác đa dạng như thêm hàng cuối cùng bằng insertRow(-1)
- Tác giả cho rằng API này có tiềm năng mở rộng chức năng của bảng như một cấu trúc dữ liệu, và có thể bổ sung sự kiện hay tính năng như với form
Tổng quan về API bảng HTML
- Phần lớn lập trình viên tạo bảng bằng các phương thức DOM (
createElement v.v.) hoặc chèn chuỗi innerHTML, nhưng cách sau có rủi ro bảo mật
- HTML có API HTMLTableElement lâu đời, cho phép xử lý phần thân bảng, hàng, ô, tiêu đề đầu, chân bảng, caption, tóm tắt (summary)
- API này cho phép thao tác từng phần tử mà không cần render lại toàn bộ bảng
Ví dụ mã: tạo bảng từ mảng
- Ví dụ chuyển mảng lồng nhau sau thành bảng
[['one','two','three'], ['four','five','six']]
- Tạo bảng bằng
document.createElement('table'), rồi lặp để thêm từng hàng (insertRow) và ô (insertCell)
- Nội dung mỗi ô được đặt bằng
innerText
Truy cập và chỉnh sửa ô
- Có thể truy cập ô của bảng đã tạo theo chỉ số
- Ví dụ:
t.rows[1].cells[1] → <td>five</td>
- Cũng có thể xóa hoặc thêm mới hàng và ô
- Ví dụ: thêm hàng ở cuối bằng
t.insertRow(-1)
- Tạo ô mới bằng
t.rows[2].insertCell(0) rồi gán giá trị với innerText = 'foo'
Giới hạn của API
- Có các quy tắc chỉ số khó trực quan như
insertRow(-1)
- Không có cách tạo trực tiếp phần tử
TH, mọi ô đều được xử lý thành TD
Khả năng mở rộng trong tương lai
- Tác giả chỉ ra việc tạo bảng hiện nay khá phiền phức và đề xuất cần xem xét lại API này để mở rộng tính năng
- Giống như HTML form đã được bổ sung
formData hay sự kiện change, bảng cũng có thể được thêm sự kiện hoặc tính năng nâng cao
- Nhờ đó, bảng có thể có vị thế như một cấu trúc dữ liệu chứ không chỉ là công cụ bố cục
2 bình luận
Là một lập trình viên còn tương đối ít kinh nghiệm, tôi thấy ngạc nhiên trước những bài viết nói về một API đã được dùng từ đầu như thể vừa mới "khai quật" ra nó.
Ý kiến trên Hacker News
Có vẻ nhiều người đã không đọc kỹ bài viết Điểm cốt lõi của bài này không phải là chính thẻ ``, mà là giao diện DOM dành riêng cho table Ví dụ, các phương thức như
HTMLTableElement.prototype.insertRow()hayHTMLTableRowElement.prototype.insertCell()trực quan hơncreateElement()hoặcappendChild()Tuy nhiên, trong UI dựa trên thư viện như React, Svelte, Vue, những phương thức này hầu như không còn được dùng nữa Điều thú vị là cũng giống cú pháp HTML, dù bỏ quathead,tbody,tfootthì chúng vẫn được xử lý tự động Trong 5 năm gần đây, tôi đã trực tiếp dùng.insertRow,.insertCell,.createTHead,.rows,.cellstrong các script demo Về phong cách viết code, tôi thấy dùngforthay vìforEach, và bỏ tham số chỉ số đi thì gọn gàng hơnTôi nhớ khoảng nửa năm trước đã dùng API này sau khi đọc tài liệu MDN hoặc được AI gợi ý Thuộc tính
rowsvàcellsrất tiện để triển khai điều hướng bằng bàn phím Có thể xem ví dụ liên quan trong mã nguồn ClickHouseĐây là câu chuyện cùng mạch với tranh luận về button (chuỗi trước) Từ khoảng 10–15 năm trước, mọi thứ dần chuyển sang ``, và HTML bị dùng như một hộp công cụ UI thay vì semantic markup
trung tính hơn Thật ra tôi còn nghĩ việc tách riêngvà `` cũng là một lỗi thiết kếTôi đã dùng API này khi làm công cụ so sánh ảnh Stable Diffusion Vì có rất nhiều hàng và cột nên phải tái tạo bảng thường xuyên, nhưng cập nhật DOM chậm hơn so với cách dựng toàn bộ bằng chuỗi một lần Có lẽ vì mỗi lần gọi API đều cập nhật DOM ngay lập tức
Có đoạn giải thích rằng “không cần render lại toàn bộ bảng”, nhưng thật ra các phương thức DOM tiêu chuẩn vốn đã hoạt động như vậy Dù vậy, việc giảm bớt khâu duyệt DOM nhàm chán vẫn khá hay
API của HTML form cũng cần được tái khám phá
Vấn đề của table không phải là điền dữ liệu, mà là hoàn toàn không có tính năng tìm kiếm, sắp xếp, lọc
Tôi không hiểu câu “API này đã bị bỏ rơi” Tôi vẫn thường xuyên dùng nó khi tạo bảng HTML
Mã ví dụ thì thú vị, nhưng tên biến bị rút gọn quá mức nên khó đọc Tốt hơn nên dùng tên có ý nghĩa thay vì
b,t,r,c(ri, i)Các biến có vai trò tương tự thì độ dài tên cũng nên thống nhấtlet b = document.body;đặc biệt khó đọc Tiết kiệm vài byte nhưng lại chỉ làm tăng gánh nặng nhận thức