Tương tác với HTML DOM bằng JavaScript và jQuery

Javascript căn bản | by Học Javascript

Trong phát triển web hiện đại, việc tạo ra những giao diện tương tác và phản hồi linh hoạt không chỉ là yêu cầu mà còn là tiêu chuẩn để nâng cao trải nghiệm người dùng. Để làm được điều đó, lập trình viên cần thao tác trực tiếp với DOM (Document Object Model) – nơi đại diện cho toàn bộ cấu trúc HTML của một trang web dưới dạng cây đối tượng có thể truy cập và chỉnh sửa bằng mã lệnh.

JavaScript là ngôn ngữ cốt lõi được dùng để điều khiển DOM một cách chi tiết và mạnh mẽ. Tuy nhiên, khi cần thao tác nhanh chóng, ngắn gọn và tương thích tốt với các trình duyệt, jQuery – một thư viện JavaScript phổ biến – vẫn là lựa chọn đáng tin cậy. Cả hai công cụ đều cho phép lập trình viên thay đổi nội dung, cấu trúc, kiểu dáng và hành vi của trang web ngay trong thời gian thực.

Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách tương tác với HTML DOM bằng JavaScript và jQuery, từ thao tác cơ bản như chọn phần tử, chỉnh sửa nội dung đến xử lý sự kiện và tạo phần tử mới. Qua đó, bạn sẽ thấy được ưu – nhược điểm của từng công cụ và cách ứng dụng chúng một cách hiệu quả trong phát triển web.

Khái quát về HTML DOM trong JavaScript

Khái niệm DOM (Document Object Model)

DOM (Document Object Model) là một mô hình tài liệu dạng đối tượng, cho phép lập trình viên truy cập và thao tác với nội dung, cấu trúc và kiểu dáng của một trang web thông qua JavaScript hoặc các thư viện hỗ trợ như jQuery.
Hiểu đơn giản, DOM chuyển đổi trang HTML thành một cấu trúc dạng cây mà ở đó, mỗi phần tử HTML trở thành một đối tượng có thể thao tác bằng mã lệnh.

Thông qua DOM, ta có thể:

  • Thay đổi nội dung văn bản.

  • Thêm hoặc xóa phần tử HTML.

  • Gắn sự kiện (event) cho các phần tử.

  • Thay đổi thuộc tính và CSS của phần tử.

DOM không phải là HTML, mà là một bản mô tả động của trang HTML được trình duyệt xây dựng để cho phép tương tác bằng mã.

Cấu trúc DOM – cây DOM

DOM được trình bày dưới dạng cây phân cấp (tree structure), gọi là DOM tree. Mỗi nút (node) trong cây này đại diện cho một phần tử, thuộc tính, văn bản hay sự kiện của trang.

Ví dụ đoạn HTML:

<!DOCTYPE html>
<html>
  <body>
    <h1>Hello World</h1>
    <p>Đây là đoạn văn.</p>
  </body>
</html>

Cây DOM tương ứng:

- document
  └── html
      ├── head
      └── body
          ├── h1 (Hello World)
          └── p (Đây là đoạn văn.)

Mỗi thẻ HTML là một element node, mỗi đoạn văn bản là một text node, toàn bộ tài liệu là document object. Thông qua DOM, ta có thể truy cập và thao tác trên bất kỳ nút nào trong cây.

DOM và mối quan hệ với HTML

  • HTML chỉ định nội dung và cấu trúc của trang.

  • DOM là bản đại diện của HTML dưới dạng đối tượng mà trình duyệt tạo ra khi trang được tải.

  • Khi trình duyệt đọc HTML, nó tạo ra DOM để lập trình viên có thể thao tác bằng JavaScript.

Ví dụ: HTML có dòng:

<p id="info">Thông tin</p>

Khi đó, JavaScript có thể truy cập:

document.getElementById("info").innerText = "Nội dung đã thay đổi";

DOM chính là cầu nối giữa HTML tĩnhJavaScript động.

Các thành phần thường thao tác trong DOM

Dưới đây là các thành phần DOM mà lập trình viên thường xuyên làm việc:

Thành phần Mô tả
Thẻ HTML Là các element node như <div>, <p>, <img>, <a>,...
Thuộc tính Các attribute như id, class, src, href, alt, style,...
Nội dung Văn bản hiển thị trong các thẻ (text node)
Sự kiện (events) Các hành động người dùng như click, hover, input, submit...
CSS/Style Thuộc tính giao diện: màu sắc, font chữ, kích thước, hiển thị,...

Thông qua JavaScript hoặc jQuery, ta có thể thêm, xoá, chỉnh sửa hoặc phản hồi các thành phần trên một cách linh hoạt.

Tương tác với DOM trong JavaScript

Chọn phần tử DOM

Để thao tác DOM bằng JavaScript, bước đầu tiên là chọn đúng phần tử HTML cần xử lý. JavaScript cung cấp nhiều phương thức để chọn phần tử:

getElementById(id)

Chọn duy nhất một phần tử theo id.

const title = document.getElementById("mainTitle");

getElementsByClassName(class)

  • Chọn danh sách phần tử có cùng class.

const items = document.getElementsByClassName("menu-item");

getElementsByTagName(tag)

  • Chọn các phần tử theo tên thẻ.

const paragraphs = document.getElementsByTagName("p");

querySelector(selector)

  • Chọn một phần tử đầu tiên khớp với selector CSS.

const firstItem = document.querySelector(".menu-item");

querySelectorAll(selector)

  • Chọn tất cả phần tử khớp với selector CSS (trả về NodeList).

const allItems = document.querySelectorAll(".menu-item");
So sánh:
Phương thức Trả về Ghi chú
getElementById 1 phần tử Nhanh, đơn giản nếu biết trước id
getElementsByClassName HTMLCollection Không hỗ trợ tất cả CSS selector
querySelector 1 phần tử Linh hoạt, hỗ trợ mọi CSS selector
querySelectorAll NodeList Dễ duyệt bằng forEach()

Thay đổi nội dung phần tử

element.innerHTML

Ghi/chèn nội dung HTML vào phần tử.

document.getElementById("info").innerHTML = "<b>Đây là nội dung mới</b>";
element.textContent

Ghi/chèn văn bản thuần (không có HTML).

document.getElementById("info").textContent = "Chỉ là văn bản";
Gợi ý: Dùng innerHTML khi muốn thao tác với thẻ HTML, còn textContent để đảm bảo an toàn và đơn giản.

Thay đổi thuộc tính

setAttribute(attribute, value)

Thêm hoặc cập nhật thuộc tính của phần tử.

document.getElementById("link").setAttribute("href", "https://example.com");
getAttribute(attribute)

Lấy giá trị của thuộc tính.

const link = document.getElementById("link").getAttribute("href");
removeAttribute(attribute)

Xoá thuộc tính khỏi phần tử.

document.getElementById("link").removeAttribute("target");

Tạo, thêm, xoá phần tử DOM

Tạo phần tử: document.createElement(tagName)

const newItem = document.createElement("li"); newItem.textContent = "Món mới";
Thêm vào DOM:

appendChild() – thêm phần tử vào cuối.

document.getElementById("menu").appendChild(newItem);
Xoá phần tử: removeChild(childNode)
const menu = document.getElementById("menu"); const firstItem = menu.children[0]; menu.removeChild(firstItem);
Thay thế phần tử: replaceChild(newNode, oldNode)
menu.replaceChild(newItem, oldItem);

Thêm sự kiện (event)

Sử dụng addEventListener(event, function)

document.getElementById("btn").addEventListener("click", function () { alert("Bạn vừa nhấn nút!"); });

Gắn hàm xử lý sự kiện cho phần tử.

Một số sự kiện thông dụng:
Sự kiện Ý nghĩa
click Nhấn chuột
change Giá trị input/select thay đổi
input Khi người dùng nhập vào ô input
submit Gửi form
mouseover Di chuột vào
keydown Nhấn phím

IV. TƯƠNG TÁC VỚI DOM BẰNG JQUERY

1. Chọn phần tử

a. Sử dụng $(selector)

jQuery sử dụng cú pháp $(selector) để chọn các phần tử trên trang. selector có thể là ID, class, thẻ HTML, hoặc bất kỳ selector CSS hợp lệ nào.

Ví dụ:

// Chọn phần tử có id là "myDiv"
$("#myDiv");

// Chọn tất cả các phần tử có class "menu-item"
$(".menu-item");

// Chọn tất cả các phần tử <p>
$("p");
  • Hỗ trợ đầy đủ CSS selector: jQuery hỗ trợ hầu hết các kiểu selector trong CSS như ID, class, thuộc tính, pseudo-classes, và pseudo-elements.

  • Trả về tập hợp jQuery: Kết quả của $(selector) là một đối tượng jQuery chứa các phần tử khớp với selector, bạn có thể thao tác với chúng dễ dàng.


2. Thay đổi nội dung

a. .html()

Phương thức .html() cho phép thay đổi hoặc lấy nội dung HTML của phần tử.

Thay đổi nội dung:

$("#myDiv").html("<b>Đây là nội dung HTML mới</b>");

Lấy nội dung HTML:

var content = $("#myDiv").html();

b. .text()

Phương thức .text() cho phép thay đổi hoặc lấy nội dung văn bản của phần tử (không bao gồm thẻ HTML).

Thay đổi nội dung văn bản:

$("#myDiv").text("Đây là nội dung văn bản mới");
  • Lấy nội dung văn bản:

var text = $("#myDiv").text();

3. Thay đổi thuộc tính

a. .attr()

Phương thức .attr() dùng để lấy hoặc thay đổi giá trị của thuộc tính của phần tử.

Thay đổi thuộc tính:

$("#myLink").attr("href", "https://www.example.com");

Lấy giá trị thuộc tính:

var linkHref = $("#myLink").attr("href");

b. .removeAttr()

Phương thức .removeAttr() dùng để xoá thuộc tính của phần tử.

$("#myLink").removeAttr("target");

4. Tạo, thêm, xoá phần tử

a. Tạo phần tử mới: $("<tag>")

jQuery cung cấp cách để tạo các phần tử HTML mới.

var newItem = $("<li>").text("Món mới");
b. Thêm phần tử vào DOM:

.append(): Thêm phần tử vào cuối của phần tử hiện tại.

$("#menu").append(newItem);

.prepend(): Thêm phần tử vào đầu của phần tử hiện tại.

$("#menu").prepend(newItem);
c. Xoá phần tử: .remove()

.remove(): Xoá phần tử khỏi DOM, bao gồm cả sự kiện gắn liền với nó.

$("#menu li:first").remove();
d. Xoá tất cả nội dung: .empty()

.empty(): Xoá tất cả các con của phần tử, nhưng không xoá chính phần tử đó.

$("#menu").empty();

5. Thêm sự kiện

a. .on("event", function)

Phương thức .on() cho phép bạn thêm sự kiện vào các phần tử. Đây là cách gắn sự kiện linh hoạt và mạnh mẽ trong jQuery.

$("#myButton").on("click", function() { alert("Nút đã được nhấn!"); });
b. Một số hàm ngắn gọn trong jQuery:

jQuery cung cấp các phương thức ngắn gọn để xử lý các sự kiện phổ biến:

.click(): Được sử dụng để xử lý sự kiện click.

$("#myButton").click(function() { alert("Nút đã được nhấn!"); });
  • .hover(): Xử lý sự kiện khi chuột di chuyển vào và ra khỏi phần tử.

$("#myDiv").hover( function() { $(this).css("background-color", "yellow"); }, function() { $(this).css("background-color", "white"); } );
  • .change(): Được sử dụng để xử lý sự kiện thay đổi (ví dụ: trên input, select).

$("#myInput").change(function() { alert("Giá trị đã thay đổi!"); });

V. SO SÁNH JAVASCRIPT VÀ JQUERY KHI THAO TÁC DOM

Khi thao tác với DOM, lập trình viên có thể lựa chọn sử dụng JavaScript thuần hoặc jQuery. Mỗi phương pháp có những ưu và nhược điểm riêng. Dưới đây là bảng so sánh chi tiết giữa JavaScript và jQuery về các tiêu chí quan trọng.


1. Cú pháp

Tiêu chí JavaScript jQuery
Cú pháp Dài dòng, chi tiết, yêu cầu nhiều mã lệnh. Ngắn gọn, dễ đọc, sử dụng cú pháp quen thuộc với CSS selectors.
  • JavaScript yêu cầu lập trình viên phải viết chi tiết hơn khi thao tác với DOM. Ví dụ, để chọn một phần tử theo id và thay đổi nội dung của nó, bạn sẽ cần sử dụng cú pháp dài hơn như sau:

document.getElementById("myElement").innerHTML = "Nội dung mới";
  • jQuery lại cung cấp cú pháp ngắn gọn, dễ dàng hơn nhiều. Cùng ví dụ trên, với jQuery, bạn chỉ cần:

$("#myElement").html("Nội dung mới");
jQuery giúp giảm thiểu sự phức tạp khi thao tác với DOM, đặc biệt là trong các tình huống phức tạp.

2. Hiệu năng

Tiêu chí JavaScript jQuery
Hiệu năng Nhanh, nhẹ vì không cần tải thư viện bổ sung. Chậm hơn một chút vì cần tải thư viện jQuery.
  • JavaScript thuần (Vanilla JavaScript) có hiệu năng tốt hơn so với jQuery vì không cần phải tải thêm một thư viện lớn. Nếu dự án của bạn yêu cầu tốc độ cao và không cần nhiều tính năng tiện ích, việc sử dụng JavaScript thuần sẽ mang lại hiệu quả tốt hơn.

  • jQuery, mặc dù cung cấp cú pháp dễ dàng và tiện lợi, nhưng vì là một thư viện, nên phải tải thêm mã nguồn jQuery, điều này có thể làm giảm hiệu năng trong các dự án cần xử lý nhiều phần tử DOM phức tạp.


3. Tính tương thích

Tiêu chí JavaScript jQuery
Tính tương thích Phải tự xử lý sự khác biệt giữa các trình duyệt. jQuery hỗ trợ trình duyệt cũ tốt hơn.
  • JavaScript thuần yêu cầu lập trình viên phải xử lý sự khác biệt về hành vi giữa các trình duyệt. Ví dụ, các trình duyệt cũ như Internet Explorer có thể không hỗ trợ một số phương thức mới trong JavaScript, buộc bạn phải sử dụng các polyfill hoặc các phương pháp riêng để đảm bảo tính tương thích.

  • jQuery giúp xử lý các vấn đề về tương thích trình duyệt một cách dễ dàng. Nó tự động cung cấp các phương thức để đảm bảo rằng các thao tác DOM hoạt động một cách nhất quán trên nhiều trình duyệt, kể cả những phiên bản cũ như IE.


4. Tính tiện dụng

Tiêu chí JavaScript jQuery
Tính tiện dụng Khó hơn với người mới, cần học cú pháp phức tạp. Thân thiện với người học, dễ hiểu và dễ sử dụng.
  • JavaScript thuần là một ngôn ngữ lập trình mạnh mẽ, nhưng việc thao tác với DOM có thể khá phức tạp, đặc biệt đối với người mới bắt đầu. Việc lựa chọn và thao tác các phần tử DOM yêu cầu cú pháp chi tiết và có thể cần nhiều mã lệnh.

  • jQuery, ngược lại, rất thân thiện với người mới học lập trình. Các cú pháp của jQuery đơn giản và dễ hiểu, giúp người học nhanh chóng nắm bắt và áp dụng vào các dự án web mà không cần phải hiểu quá sâu về các chi tiết phức tạp của DOM hoặc JavaScript thuần.

VI. ỨNG DỤNG THỰC TẾ VÀ VÍ DỤ MINH HOẠ

Khi thao tác với DOM bằng JavaScript hoặc jQuery, các kỹ thuật này có thể được ứng dụng vào rất nhiều tình huống thực tế trong phát triển web. Trong phần này, chúng ta sẽ cùng tìm hiểu ba ứng dụng phổ biến, bao gồm:

  1. Tạo form tương tác

  2. Hiển thị thông báo theo hành động

  3. Tự động cập nhật dữ liệu trên giao diện

Ngoài ra, chúng ta sẽ xem qua một ví dụ mini project, cụ thể là To-Do List hoặc trình thay đổi giao diện, để minh hoạ cách thức áp dụng các kỹ thuật này vào thực tế.


1. Tạo form tương tác

Việc tạo form tương tác là một trong những ứng dụng cơ bản khi thao tác với DOM. Người dùng có thể điền thông tin vào các form và JavaScript/jQuery sẽ xử lý các sự kiện như gửi dữ liệu, kiểm tra tính hợp lệ, hay hiển thị các thông báo phản hồi.

Ví dụ: Tạo form đăng ký người dùng

Giả sử chúng ta có một form đăng ký với các trường như tên, email và mật khẩu. Dưới đây là một ví dụ về cách bạn có thể sử dụng JavaScript/jQuery để xử lý các sự kiện khi người dùng nhấn nút "Đăng ký".

HTML:

<form id="registerForm">
    <input type="text" id="username" placeholder="Tên người dùng" required>
    <input type="email" id="email" placeholder="Email" required>
    <input type="password" id="password" placeholder="Mật khẩu" required>
    <button type="submit">Đăng ký</button>
</form>
<div id="message"></div>

JavaScript/jQuery:

$(document).ready(function() {
    $("#registerForm").submit(function(event) {
        event.preventDefault(); // Ngăn chặn hành động submit mặc định

        var username = $("#username").val();
        var email = $("#email").val();
        var password = $("#password").val();

        // Kiểm tra dữ liệu
        if(username && email && password) {
            $("#message").html("Đăng ký thành công!").css("color", "green");
        } else {
            $("#message").html("Vui lòng điền đầy đủ thông tin.").css("color", "red");
        }
    });
});
  • Giải thích: Khi người dùng nhấn nút "Đăng ký", JavaScript/jQuery sẽ ngăn hành động submit mặc định của form và thay vào đó kiểm tra xem tất cả các trường đã được điền hay chưa. Nếu chưa, nó sẽ hiển thị thông báo lỗi; nếu tất cả các trường hợp hợp lệ, thông báo thành công sẽ được hiển thị.


2. Hiển thị thông báo theo hành động

Khi làm việc với giao diện người dùng, việc cung cấp phản hồi hoặc thông báo cho người dùng là rất quan trọng. Chúng ta có thể sử dụng DOM để thay đổi nội dung, màu sắc, hay kiểu dáng của các phần tử khi có sự kiện xảy ra.

Ví dụ: Hiển thị thông báo khi nút "Lưu" được nhấn

HTML:

<button id="saveButton">Lưu</button>
<div id="notification"></div>

JavaScript/jQuery:

$(document).ready(function() {
    $("#saveButton").click(function() {
        $("#notification").text("Dữ liệu đã được lưu thành công!").css("color", "green").fadeIn().delay(2000).fadeOut();
    });
});
  • Giải thích: Khi người dùng nhấn vào nút "Lưu", một thông báo sẽ xuất hiện ở vị trí #notification. Thông báo này sẽ có màu xanh (để chỉ ra rằng hành động đã thành công) và sẽ tự động biến mất sau 2 giây. Phương thức .fadeIn().fadeOut() sẽ tạo hiệu ứng mờ dần, mang lại trải nghiệm người dùng tốt hơn.


3. Tự động cập nhật dữ liệu trên giao diện

Một trong những ứng dụng mạnh mẽ của JavaScript/jQuery là khả năng thay đổi dữ liệu trên giao diện mà không cần phải tải lại trang. Điều này rất quan trọng trong các ứng dụng web hiện đại, giúp tạo ra trải nghiệm người dùng mượt mà hơn.

Ví dụ: Tạo một To-Do List (Danh sách công việc)

HTML:

<h2>Danh sách công việc</h2>
<input type="text" id="newTask" placeholder="Nhập công việc mới">
<button id="addTaskButton">Thêm</button>
<ul id="taskList"></ul>

JavaScript/jQuery:

$(document).ready(function() {
    $("#addTaskButton").click(function() {
        var task = $("#newTask").val();
        if (task) {
            var taskItem = $("<li>").text(task);
            $("#taskList").append(taskItem);
            $("#newTask").val(""); // Xóa nội dung sau khi thêm
        }
    });
});
  • Giải thích: Trong ví dụ này, khi người dùng nhập một công việc vào ô input và nhấn nút "Thêm", công việc đó sẽ được thêm vào danh sách dưới dạng một phần tử <li>. JavaScript/jQuery sẽ tự động cập nhật giao diện mà không cần tải lại trang.


Ví dụ Mini Project: To-Do List

Một ví dụ đơn giản nhưng hiệu quả để minh hoạ các thao tác DOM là xây dựng một To-Do List. Đây là một ứng dụng quản lý công việc, nơi người dùng có thể thêm, xóa, và đánh dấu các công việc hoàn thành.

HTML:

<h2>To-Do List</h2>
<input type="text" id="taskInput" placeholder="Nhập công việc...">
<button id="addTaskButton">Thêm</button>
<ul id="taskList"></ul>

JavaScript/jQuery:

$(document).ready(function() {
    $("#addTaskButton").click(function() {
        var taskText = $("#taskInput").val();
        if (taskText) {
            var taskItem = $("<li>").text(taskText)
                .append('<button class="deleteBtn">Xóa</button>')
                .click(function() {
                    $(this).toggleClass("completed");
                });
            $("#taskList").append(taskItem);
            $("#taskInput").val(""); // Xóa ô input sau khi thêm
        }
    });

    // Xoá công việc
    $(document).on("click", ".deleteBtn", function() {
        $(this).parent().remove();
    });
});

CSS (Tùy chọn):

.completed {
    text-decoration: line-through;
    color: gray;
}

.deleteBtn {
    background-color: red;
    color: white;
    border: none;
    cursor: pointer;
}

Giải thích:

  • Khi người dùng nhập công việc và nhấn "Thêm", công việc đó sẽ được thêm vào danh sách dưới dạng một phần tử <li>. Mỗi công việc cũng sẽ có một nút "Xóa" để xóa công việc đó khỏi danh sách.

  • Người dùng có thể click vào bất kỳ công việc nào để đánh dấu hoàn thành. Khi công việc được đánh dấu là hoàn thành, văn bản sẽ có kiểu gạch chéo và chuyển sang màu xám.

  • Các thao tác này đều được thực hiện mà không cần tải lại trang, giúp tạo ra một ứng dụng động và mượt mà.

KẾT BÀI

Tương tác với DOM là một kỹ thuật cơ bản nhưng vô cùng quan trọng trong phát triển web. Bằng cách thao tác với DOM, lập trình viên có thể tạo ra các giao diện người dùng động, đáp ứng nhanh chóng và trực quan. JavaScript thuầnjQuery đều cung cấp các công cụ mạnh mẽ để thao tác với DOM, nhưng mỗi công cụ lại có những ưu điểm và nhược điểm riêng.

JavaScript thuần mang lại hiệu suất tối ưu và linh hoạt, đặc biệt khi không có yêu cầu về tính tương thích trên nhiều trình duyệt cũ. Ngược lại, jQuery giúp đơn giản hóa rất nhiều thao tác DOM với cú pháp dễ đọc và mạnh mẽ, đồng thời hỗ trợ rất tốt cho các trình duyệt cũ, giúp lập trình viên tiết kiệm thời gian và công sức.

Qua các ví dụ minh hoạ và ứng dụng thực tế như tạo form tương tác, hiển thị thông báo, và tự động cập nhật dữ liệu, bạn đã có thể thấy rõ sức mạnh của việc thao tác DOM trong việc tạo ra các ứng dụng web hấp dẫn và tương tác. Những mini project như To-Do List hoặc trình thay đổi giao diện không chỉ giúp bạn áp dụng lý thuyết vào thực tế mà còn giúp bạn hiểu rõ hơn về cách làm việc với DOM trong môi trường phát triển web.

Tùy vào mục đích và yêu cầu của từng dự án, việc lựa chọn giữa JavaScript thuần và jQuery sẽ giúp tối ưu hóa cả hiệu suất và trải nghiệm người dùng. Quan trọng hơn hết, việc hiểu rõ cách thức hoạt động của DOM sẽ giúp bạn trở thành một lập trình viên web xuất sắc, có thể tạo ra những ứng dụng động, dễ sử dụng và hiệu quả.

Bài viết liên quan