Nếu đã từng học lập trình web, chắc hẳn bạn đã nghe qua thuật ngữ DOM ít nhất một lần. Đây là khái niệm nền tảng, quyết định việc Javascript có thể "chạm" vào từng thẻ HTML trên trang hay không. Bài viết này, Nhân Hòa sẽ giúp bạn hiểu rõ DOM là gì, cấu trúc của DOM, các loại DOM trong Javascript và cách thao tác DOM một cách dễ hiểu nhất, kể cả khi bạn chưa có nhiều kiến thức kỹ thuật.
DOM là gì? Cấu trúc của DOM đặc biệt như nào?
DOM (viết tắt của Document Object Model) là mô hình đối tượng tài liệu chuẩn W3C đóng vai trò trở thành “cầu nối" giúp Javascript có thể đọc, thay đổi hoặc tương tác với nội dung HTML và XML trên trang web bất kỳ.

Khi trình duyệt tải một trang web, nó không hiển thị trực tiếp file HTML thô mà sẽ phân tích (parse) toàn bộ mã nguồn rồi dựng thành một cấu trúc dữ liệu dạng cây gọi là DOM Tree. Đây chính là lý do vì sao Javascript có thể tìm đến bất kỳ thẻ HTML nào, thay đổi nội dung, thuộc tính hay style của nó ngay lập tức mà không cần tải lại trang.
Trong DOM Tree, mọi thành phần của tài liệu đều được xem là một node (nút), được sắp xếp theo quan hệ cha - con giống như cấu trúc gia phả. Ba loại node quan trọng nhất bao gồm:
- Document node: node gốc, đại diện cho toàn bộ tài liệu, thường được biểu diễn bởi thẻ.
- Element node: đại diện cho từng phần tử HTML cụ thể như <div>, <p>, <img>, <a>...
- Text node: chứa nội dung văn bản nằm bên trong các thẻ HTML.
*Ví dụ: thẻ cao nhất trong cây DOM là <html>, phân nhánh thành <head> (chứa các thẻ title, style, meta...) và <body> (chứa vô số thẻ HTML hiển thị nội dung). Nhờ cấu trúc phân cấp rõ ràng này, Javascript có thể duyệt (traverse) qua các phần tử bằng những thuộc tính như parentNode, childNodes, nextSibling để xác định chính xác vị trí cần thao tác.

Sau khi đã nắm được DOM là gì và cấu trúc cây của nó, bước tiếp theo bạn cần hiểu là DOM trong Javascript được chia thành những loại nào để phục vụ các mục đích thao tác khác nhau.
Các loại DOM trong Javascript
Trong quá trình lập trình web thực tế, DOM không chỉ dừng lại ở một khái niệm chung chung mà được phân chia thành nhiều nhóm chức năng riêng biệt. Việc nắm rõ từng loại DOM sẽ giúp bạn chọn đúng công cụ cho từng tình huống lập trình, tránh viết code dư thừa hoặc sai mục đích.
Dưới đây là các loại DOM phổ biến nhất khi làm việc với Javascript:
-
DOM Document: quản lý và lưu trữ toàn bộ cấu trúc của tài liệu HTML, là điểm khởi đầu để truy cập vào bất kỳ phần tử nào khác.
-
DOM Element: dùng để truy xuất một thẻ HTML cụ thể thông qua id, class hoặc tên thẻ (tagName). Đây là loại DOM được sử dụng nhiều nhất trong thực tế.
-
DOM HTML: cho phép thay đổi nội dung hoặc giá trị thuộc tính bên trong các thẻ HTML, ví dụ như đổi văn bản, đổi đường dẫn ảnh, đổi link.
-
DOM CSS: hỗ trợ chỉnh sửa các thuộc tính định dạng CSS như màu sắc, kích thước, vị trí của phần tử ngay bằng Javascript.
-
DOM Event: dùng để gán các sự kiện như onclick, onload, onmouseover vào phần tử HTML, tạo nên các tương tác động cho trang web.
-
DOM Listener: có nhiệm vụ "lắng nghe" và xử lý các sự kiện xảy ra trên phần tử, ví dụ như addEventListener.
-
DOM Navigation: cung cấp các thuộc tính giúp duyệt qua cấu trúc cây, truy cập phần tử cha - con - anh em trong DOM Tree.
-
DOM Node/NodeList: đại diện cho từng phần tử riêng lẻ (Node) hoặc một tập hợp nhiều phần tử (NodeList) trong tài liệu.

Ngoài các loại DOM cơ bản kể trên, khi làm việc với các framework hiện đại như React hay Vue, bạn sẽ còn gặp khái niệm Virtual DOM - một bản sao nhẹ của DOM thật được lưu trong bộ nhớ. Thay vì cập nhật trực tiếp lên DOM Tree (vốn tốn nhiều tài nguyên xử lý), framework sẽ so sánh (diffing) Virtual DOM cũ và mới, sau đó chỉ cập nhật đúng phần thay đổi lên DOM thật. Đây chính là lý do các ứng dụng React, Vue thường có tốc độ render mượt hơn so với thao tác DOM thuần theo cách truyền thống.
Gợi ý từ chuyên gia Nhân Hòa: Với người mới, bạn không cần học thuộc lòng cả 8 loại DOM. Hãy tập trung thành thạo DOM Element (để chọn phần tử) và DOM Event (để tạo tương tác) trước, vì đây là hai nhóm chiếm phần lớn thao tác trong các dự án thực tế.
Hiểu được các loại DOM là bước đệm quan trọng để bạn tiến vào phần thực hành - chính là cách thao tác trực tiếp với DOM bằng Javascript mà bất kỳ lập trình viên frontend nào cũng cần nắm vững.
Thao tác với DOM trong Javascript
Để thao tác DOM, Javascript cung cấp đối tượng document làm điểm truy cập trung tâm đến toàn bộ cây DOM. Từ đối tượng này, bạn có thể tìm kiếm, đọc, chỉnh sửa hoặc xóa bất kỳ phần tử HTML nào trên trang.
1. Truy xuất phần tử HTML
Đây là bước đầu tiên trong mọi thao tác DOM. Một số phương thức phổ biến gồm:
- document.getElementById("id"): lấy phần tử theo id duy nhất.
- document.getElementsByClassName("class"): lấy tất cả phần tử có cùng class.
- document.getElementsByTagName("tagName"): lấy tất cả phần tử theo tên thẻ.
- document.querySelector("selector") và querySelectorAll("selector"): linh hoạt nhất, cho phép dùng cú pháp CSS selector để chọn phần tử.
2. Thay đổi nội dung và thuộc tính
Sau khi đã chọn được phần tử, bạn có thể thay đổi nội dung hoặc thuộc tính của nó thông qua các thuộc tính quen thuộc (theo tài liệu chính thức của MDN Web Docs):
- innerHTML: đọc hoặc ghi mã HTML bên trong phần tử. Lưu ý cần cẩn trọng khi dùng với dữ liệu từ người dùng vì có thể phát sinh lỗ hổng XSS nếu không được kiểm soát.
- outerHTML: tương tự innerHTML nhưng lấy hoặc thay thế toàn bộ phần tử, bao gồm cả chính thẻ đó chứ không chỉ nội dung bên trong.
- textContent: đọc hoặc ghi nội dung văn bản thuần, không bao gồm thẻ HTML - lựa chọn an toàn hơn innerHTML khi làm việc với nội dung do người dùng nhập vào.
- setAttribute() / getAttribute(): thêm, sửa hoặc lấy giá trị thuộc tính như src, href, class.
- classList: cách hiện đại và được khuyến nghị để thao tác class CSS, với các phương thức add(), remove(), toggle(), contains() - giúp code rõ ràng và ít lỗi hơn so với chỉnh sửa trực tiếp thuộc tính className.
- style: chỉnh sửa trực tiếp các thuộc tính CSS như màu sắc, kích thước, vị trí.
→Xem thêm: CSS3 là gì? Điểm khác biệt giữa CSS3 và CSS2 và CSS như nào?
3. Thêm, xóa, cập nhật phần tử
DOM cũng cho phép bạn tạo mới hoàn toàn hoặc loại bỏ phần tử khỏi trang, giúp nội dung website luôn linh hoạt và cập nhật theo thời gian thực:
- document.createElement(): tạo một phần tử HTML mới.
- appendChild() / append(): thêm phần tử con vào cuối danh sách con của một phần tử cha.
- insertBefore(): chèn phần tử mới vào trước một phần tử con cụ thể, thay vì luôn nối vào cuối như appendChild().
- removeChild() / remove(): xóa một phần tử khỏi DOM Tree.
- replaceChild(): thay thế phần tử cũ bằng phần tử mới.
- cloneNode(): nhân bản một phần tử đã tồn tại; truyền tham số true để sao chép luôn toàn bộ phần tử con bên trong nó.
4. Xử lý sự kiện (Event)
Phần quan trọng nhất tạo nên tính tương tác của website chính là sự kiện. Phương thức addEventListener("event", function) cho phép bạn gán một hành động (như click, hover, submit) vào bất kỳ phần tử nào, từ đó xây dựng các tính năng động như dropdown menu, form kiểm tra dữ liệu, hiệu ứng cuộn trang. Đi kèm với đó, removeEventListener() giúp gỡ bỏ sự kiện đã gán khi không còn cần thiết, tránh rò rỉ bộ nhớ (memory leak) trong các ứng dụng phức tạp.
Khi xử lý sự kiện, bạn cũng nên nắm hai phương thức thường dùng trên đối tượng event:
- preventDefault(): ngăn hành vi mặc định của trình duyệt xảy ra, ví dụ ngăn form tự động submit hoặc ngăn link chuyển trang để xử lý logic riêng bằng Javascript.
- stopPropagation(): ngăn sự kiện tiếp tục lan truyền lên các phần tử cha, hữu ích khi có nhiều lớp phần tử lồng nhau cùng lắng nghe một loại sự kiện.
Đây cũng là lúc bạn cần hiểu về cơ chế lan truyền sự kiện trong DOM, gồm hai giai đoạn: capturing (sự kiện đi từ phần tử gốc xuống phần tử con) và bubbling (sự kiện đi ngược từ phần tử con lên phần tử cha - đây là hành vi mặc định). Hiểu rõ hai giai đoạn này giúp bạn kiểm soát chính xác thứ tự xử lý khi nhiều phần tử lồng nhau cùng phản ứng với một sự kiện, tránh các lỗi khó debug như một cú click vô tình kích hoạt nhiều hành động không mong muốn cùng lúc.
FAQ: Những câu hỏi thắc mắc về DOM

1. DOM và BOM (Browser Object Model) khác nhau ra sao?
DOM đại diện cho cấu trúc tài liệu HTML/XML đang hiển thị trên trang, trong khi BOM đại diện cho các đối tượng liên quan đến trình duyệt như window, location, history, navigator. Nói cách khác, DOM giúp bạn thao tác với nội dung trang, còn BOM giúp bạn tương tác với chính trình duyệt (mở tab, điều hướng URL, lấy thông tin thiết bị).
2. Vì sao trình duyệt khác nhau lại xử lý DOM có thể khác nhau?
Mặc dù DOM là chuẩn chung do W3C quy định, nhưng mỗi trình duyệt (Chrome, Firefox, Safari...) lại có engine render riêng, dẫn đến tốc độ xử lý và mức độ hỗ trợ các API DOM mới có thể chênh lệch. Đây là lý do lập trình viên thường cần kiểm tra tương thích (cross-browser testing) trước khi đưa website vào vận hành chính thức.
3. Có cần dùng jQuery để thao tác DOM không, hay JavaScript thuần là đủ?
Trước đây jQuery rất phổ biến vì giúp thao tác DOM ngắn gọn và xử lý tốt vấn đề tương thích trình duyệt. Tuy nhiên, các phiên bản Javascript hiện đại (ES6+) cùng các phương thức như querySelector, classList, fetch đã đủ mạnh và được hỗ trợ rộng rãi, nên phần lớn dự án mới hiện nay ưu tiên dùng Javascript thuần (Vanilla JS) để giảm tải thư viện, giúp trang tải nhanh hơn.
4. DOM có ảnh hưởng đến SEO của website không? Vì sao?
Câu trả lời là Có. DOM chính là thứ mà công cụ tìm kiếm thực sự "nhìn thấy" và index sau khi trang được tải xong, chứ không phải mã HTML gốc bạn viết ra. Vì vậy, mọi thay đổi diễn ra trên DOM - dù do Javascript tạo ra - đều có thể ảnh hưởng trực tiếp đến việc SEO và Google sẽ xếp hạng nội dung trang.
↪Bài viết hay liên quan:
Kết luận
Hy vọng bài viết này của Nhân Hòa, đã giúp bạn hiểu rõ DOM là gì, cấu trúc cây DOM hoạt động ra sao, các loại DOM phổ biến trong Javascript cũng như cách thao tác DOM để xây dựng những trang web tương tác, sống động. Đây là kiến thức nền tảng mà bất kỳ ai theo đuổi con đường lập trình frontend cũng cần nắm chắc trước khi tiến xa hơn với các framework hiện đại.
Nếu bạn đang có kế hoạch xây dựng và vận hành một website chuyên nghiệp, bên cạnh kiến thức lập trình, hạ tầng lưu trữ ổn định cũng là yếu tố quyết định trải nghiệm người dùng. Tìm hiểu ngay các gói Hosting giá rẻ và Wordpress Hosting tại Nhân Hòa để đưa website của bạn vào hoạt động nhanh chóng, ổn định.


