Cơ bảnKiến thức cơ bản

DOM trong JavaScript: Cách thao tác HTML bằng JS

8 phút đọc14 lượt xem
#DOM javascript#querySelector#addEventListener#thao tác HTML bằng JS#javascript cơ bản

DOM trong JavaScript: Cách thao tác HTML bằng JS

Bạn đã học HTML/CSS và tạo được trang web tĩnh — nhưng mọi thứ vẫn "đứng yên", không có tương tác. DOM (Document Object Model) là cầu nối để JavaScript đọc và chỉnh sửa HTML, biến trang web từ nội dung tĩnh thành giao diện sống động.

Sau bài này, bạn sẽ biết cách thay đổi nội dung trang, xử lý sự kiện click, và tự xây dựng một To-Do List đơn giản.

DOM là gì?

DOM là cấu trúc dữ liệu dạng cây (tree) mà trình duyệt tạo ra khi đọc HTML. JavaScript làm việc với cây này để cập nhật trang mà không cần tải lại.

document
└── html
    ├── head
    │   └── title → "Trang của tôi"
    └── body
        ├── h1 → "Xin chào"
        └── p  → "Đây là đoạn văn"

Mỗi thẻ HTML là một "nút" (node). JavaScript có thể truy cập và sửa bất kỳ nút nào — thay đổi sẽ hiện ngay trên trang mà không cần reload.

Chọn phần tử HTML

querySelector — Cách được khuyến dùng nhất

// Cú pháp giống CSS selector
const title = document.querySelector("h1");
const btn = document.querySelector(".btn-primary");  // theo class
const input = document.querySelector("#username");   // theo id

console.log(title.textContent); // "Xin chào"

Nếu bạn đã quen CSS, cú pháp này rất quen thuộc — dùng được ngay.

querySelectorAll — Chọn nhiều phần tử

const allParagraphs = document.querySelectorAll("p");

allParagraphs.forEach(p => {
    console.log(p.textContent);
});

getElementById — Khi cần tốc độ

const element = document.getElementById("myDiv");

Ưu tiên dùng querySelector — linh hoạt hơn và cú pháp nhất quán.

Thay đổi nội dung và style

innerHTML và textContent

const box = document.querySelector("#content");

// innerHTML: đặt cả thẻ HTML bên trong
box.innerHTML = "Chữ đậm";

// textContent: chỉ text thuần túy — dùng khi hiển thị dữ liệu người dùng
box.textContent = "Chỉ là text bình thường";

Khi hiển thị dữ liệu từ người dùng, luôn dùng textContent để tránh lỗ hổng XSS.

Thay đổi style trực tiếp

const box = document.querySelector(".box");
box.style.backgroundColor = "red";  // background-color → camelCase
box.style.fontSize = "20px";
box.style.display = "none";          // Ẩn phần tử

classList — Cách được khuyến dùng

const btn = document.querySelector("button");
btn.classList.add("active");       // Thêm class
btn.classList.remove("active");    // Xóa class
btn.classList.toggle("active");    // Có thì xóa, không có thì thêm
btn.classList.contains("active");  // Kiểm tra: true/false

Dùng classList thay vì style trực tiếp để giữ CSS ở file CSS và JS ở file JS — code sạch hơn.

Xử lý sự kiện với addEventListener

// Cú pháp cơ bản
element.addEventListener("tên-sự-kiện", hàm-xử-lý);
// Nút đổi màu nền
const button = document.querySelector("#changeColorBtn");
button.addEventListener("click", () => {
    document.body.style.backgroundColor = "lightblue";
});

// Theo dõi input
const input = document.querySelector("#nameInput");
input.addEventListener("input", (event) => {
    console.log("Đang nhập:", event.target.value);
});

Các sự kiện phổ biến

Sự kiệnKhi nào xảy ra
clickNhấp chuột
inputThay đổi trong input field
submitSubmit form
keydownNhấn phím
mouseoverDi chuột vào phần tử
loadTrang đã tải xong

Tạo và xóa phần tử

// Tạo phần tử mới
const newDiv = document.createElement("div");
newDiv.textContent = "Phần tử mới";
newDiv.classList.add("new-item");

// Thêm vào trang
document.querySelector("#container").appendChild(newDiv);

// Xóa phần tử
document.querySelector(".old-item").remove();

Dự án thực hành: To-Do List

Copy đoạn code này vào file HTML và chạy thử:

<!DOCTYPE html>
<html>
<head><title>To-Do List</title></head>
<body>
  <h1>Danh sách công việc</h1>
  <input type="text" id="todoInput" placeholder="Nhập công việc...">
  <button id="addBtn">Thêm</button>
  <ul id="todoList"></ul>

  <script>
    const input = document.querySelector("#todoInput");
    const addBtn = document.querySelector("#addBtn");
    const list = document.querySelector("#todoList");

    addBtn.addEventListener("click", () => {
      if (input.value.trim() === "") return;

      const li = document.createElement("li");
      li.textContent = input.value;
      list.appendChild(li);
      input.value = "";
    });
  </script>
</body>
</html>

Ví dụ này bao gồm đầy đủ: querySelector chọn phần tử, addEventListener xử lý click, createElement tạo thẻ mới, appendChild thêm vào danh sách.

Câu hỏi thường gặp

DOM và HTML khác nhau thế nào?

HTML là file text. DOM là cấu trúc object mà trình duyệt tạo ra từ HTML để JavaScript làm việc. Thay đổi DOM không thay đổi file HTML gốc.

querySelector hay getElementById nên dùng cái nào?

Nên dùng querySelector. Linh hoạt hơn, cú pháp giống CSS, và là cách hiện đại nhất.

React có cần thao tác DOM trực tiếp không?

React dùng Virtual DOM — bạn không cần thao tác DOM trực tiếp. Nhưng hiểu DOM là nền tảng quan trọng trước khi học React.

Bước tiếp theo: Async/Await trong JavaScript — học cách lấy dữ liệu từ API và cập nhật giao diện.

Về tác giả

Ảnh đại diện tác giả Kenji — họa tiết hình học

Kenji

Kỹ sư phần mềm full-stack (Web), hơn 5 năm kinh nghiệm thực tế

  • Python
  • DB
  • Hạ tầng
  • Đào tạo & cố vấn
  • AI

Làm việc cùng đồng nghiệp người Việt, tôi thấy thiếu tài liệu kỹ thuật rõ ràng bằng tiếng Việt. codeahoc là nơi tôi chia sẻ theo hướng thực tế, dễ áp dụng.

Nguyên tắc nội dung

  • Ưu tiên nguồn gốc và góc nhìn từ thực tế triển khai.
  • Nếu có sai sót, nội dung sẽ được cập nhật và sửa kịp thời.

Khóa học liên quan

The Complete JavaScript Course 2026: From Zero to Expert!

Khóa học JavaScript toàn diện nhất từ cơ bản đến nâng cao.

4.7
Xem khóa học →

React - The Complete Guide (incl. React Router & Redux)

Làm chủ React.js với các dự án thực tế, hooks, Redux.

4.6
Xem khóa học →

Node.js, Express, MongoDB & More: The Complete Bootcamp

Backend với Node.js: REST API, authentication, MongoDB.

4.7
Xem khóa học →

*Đây là liên kết liên kết (affiliate link). Chúng tôi có thể nhận hoa hồng nếu bạn mua khóa học qua liên kết này.