Các phương thức HTML DOM trong JavaScript

JavaScript HTML DOM | by Học Javascript

Trong JavaScript, HTML DOM (Document Object Model) đóng vai trò quan trọng trong việc thao tác với trang web. DOM cung cấp một mô hình cây phân cấp giúp lập trình viên có thể truy xuất, thay đổi nội dung, cấu trúc và thuộc tính của các phần tử HTML một cách linh hoạt. Để thực hiện các thao tác này, JavaScript cung cấp nhiều phương thức DOM giúp chúng ta có thể thêm, xóa, chỉnh sửa phần tử cũng như xử lý sự kiện trên trang web.

Trong bài viết này, mình sẽ tìm hiểu về các phương thức DOM phổ biến trong JavaScript, cách sử dụng chúng để thay đổi nội dung trang web, tương tác với người dùng và tối ưu hóa hiệu suất lập trình giao diện.

Truy xuất phần tử HTML trong DOM trong JavaScript

Trong JavaScript, để thao tác với các phần tử trên trang web, mình cần truy xuất chúng từ DOM (Document Object Model). Dưới đây là một số phương thức phổ biến để truy xuất phần tử trong DOM:

document.getElementById(id)

Phương thức này trả về phần tử có ID cụ thể. ID trong HTML là duy nhất, vì vậy phương thức này luôn trả về một phần tử duy nhất hoặc null nếu không tìm thấy.

Cú pháp:

let element = document.getElementById("myElement");

Ví dụ:
Giả sử chúng ta có một phần tử HTML như sau:

<p id="title">Xin chào, JavaScript!</p>

Dùng JavaScript để thay đổi nội dung của phần tử này:

let title = document.getElementById("title");
title.innerHTML = "Chào mừng đến với lập trình JavaScript!";

document.getElementsByClassName(className)

Phương thức này trả về danh sách (HTMLCollection) các phần tử có cùng class. Vì đây là một danh sách nên chúng ta cần duyệt qua để thao tác với từng phần tử.

Cú pháp:

let elements = document.getElementsByClassName("myClass");

Ví dụ:
HTML:

<p class="note">Ghi chú 1</p>
<p class="note">Ghi chú 2</p>

JavaScript:

let notes = document.getElementsByClassName("note");
for (let i = 0; i < notes.length; i++) {
    notes[i].style.color = "red";  // Đổi màu chữ thành đỏ
}

document.getElementsByTagName(tagName)

Phương thức này trả về danh sách (HTMLCollection) các phần tử có cùng tên thẻ HTML.

Cú pháp:

let elements = document.getElementsByTagName("tagName");

Ví dụ:
HTML:

<ul>
    <li>Học JavaScript</li>
    <li>Học HTML</li>
    <li>Học CSS</li>
</ul>

JavaScript:

let items = document.getElementsByTagName("li");
for (let i = 0; i < items.length; i++) {
    items[i].style.fontWeight = "bold";  // Làm đậm chữ trong thẻ <li>
}

document.querySelector(selector)

Phương thức này trả về phần tử đầu tiên khớp với một CSS selector. Nếu không tìm thấy, nó sẽ trả về null.

Cú pháp:

let element = document.querySelector("CSS_selector");

Ví dụ:


HTML:

<p class="message">Thông báo 1</p>
<p class="message">Thông báo 2</p>

JavaScript:

let firstMessage = document.querySelector(".message");
firstMessage.style.backgroundColor = "yellow";  // Tô nền màu vàng

Chỉ phần tử <p> đầu tiên có class "message" được tô nền màu vàng.

document.querySelectorAll(selector)

Phương thức này trả về danh sách (NodeList) chứa tất cả các phần tử khớp với CSS selector.

Cú pháp:

let elements = document.querySelectorAll("CSS_selector");

Ví dụ:

HTML:

<p class="highlight">Dòng 1</p>
<p class="highlight">Dòng 2</p>

JavaScript:

let highlights = document.querySelectorAll(".highlight");
highlights.forEach(element => {
    element.style.color = "blue";  // Đổi màu chữ thành xanh
});

Cả hai <p class="highlight"> đều đổi màu chữ thành xanh.

So sánh các phương thức truy xuất phần tử

Phương thức Kết quả trả về Dạng trả về
getElementById(id) Phần tử đầu tiên có ID khớp Element
getElementsByClassName(className) Danh sách phần tử có class khớp HTMLCollection
getElementsByTagName(tagName) Danh sách phần tử có tag khớp HTMLCollection
querySelector(selector) Phần tử đầu tiên khớp với selector Element
querySelectorAll(selector) Danh sách tất cả phần tử khớp với selector NodeList

Lưu ý:

  • getElementById() trả về một phần tử duy nhất.

  • getElementsByClassName()getElementsByTagName() trả về một HTMLCollection, cần duyệt qua bằng vòng lặp.

  • querySelectorAll() trả về một NodeList, có thể sử dụng .forEach().

Thay đổi nội dung của phần tử HTML trong JavaScript

Trong JavaScript, chúng ta có thể thay đổi nội dung của một phần tử HTML bằng cách sử dụng các thuộc tính:

  • innerHTML – Thay đổi nội dung HTML của phần tử, có thể chứa thẻ HTML.

  • textContent – Chỉ thay đổi nội dung văn bản, không nhận thẻ HTML.

  • value – Dùng để thay đổi giá trị của các phần tử nhập liệu như <input>, <textarea>, <select>.

innerHTML – Thay đổi nội dung HTML

Cú pháp:

element.innerHTML = "Nội dung mới";

Ví dụ:

<p id="demo">Chào bạn!</p>
<button onclick="changeText()">Thay đổi nội dung</button>

<script>
    function changeText() {
        document.getElementById("demo").innerHTML = "<strong>Chào mừng bạn đến với JavaScript!</strong>";
    }
</script>

Khi nhấn vào nút, nội dung thẻ <p> sẽ thay đổi, có thể chứa thẻ HTML như <strong>.

textContent – Chỉ thay đổi nội dung văn bản

Cú pháp:

element.textContent = "Nội dung mới";

Ví dụ:

<p id="demo">Hello <strong>World</strong>!</p>
<button onclick="changeText()">Thay đổi nội dung</button>

<script>
    function changeText() {
        document.getElementById("demo").textContent = "Chào mừng bạn!";
    }
</script>

Khi nhấn vào nút, nội dung chỉ là văn bản, không chứa thẻ HTML.

value – Thay đổi giá trị của input, textarea, select

Cú pháp:

element.value = "Giá trị mới";

Ví dụ:

<input type="text" id="myInput" value="Nhập tên của bạn">
<button onclick="changeValue()">Thay đổi giá trị</button>

<script>
    function changeValue() {
        document.getElementById("myInput").value = "Đã cập nhật!";
    }
</script>

Khi nhấn vào nút, nội dung của ô input sẽ thay đổi thành "Đã cập nhật!".

Thay đổi thuộc tính HTML của phần tử trong JavaScript

Chúng ta có thể thêm, cập nhật hoặc xóa thuộc tính HTML bằng JavaScript với các phương thức:

  • setAttribute(name, value) – Thêm hoặc cập nhật một thuộc tính.

  • getAttribute(name) – Lấy giá trị của một thuộc tính.

  • removeAttribute(name) – Xóa thuộc tính khỏi phần tử.

setAttribute(name, value) – Thêm hoặc cập nhật thuộc tính

Cú pháp:

element.setAttribute("thuộc_tính", "giá_trị");
Ví dụ:
<img id="myImage" src="image1.jpg" width="200">
<button onclick="changeImage()">Thay đổi ảnh</button>

<script>
    function changeImage() {
        document.getElementById("myImage").setAttribute("src", "image2.jpg");
    }
</script>

Khi nhấn nút, hình ảnh sẽ thay đổi từ "image1.jpg" sang "image2.jpg".

getAttribute(name) – Lấy giá trị của thuộc tính

Cú pháp:

let value = element.getAttribute("thuộc_tính");
Ví dụ:
<a id="myLink" href="https://example.com">Nhấn vào đây</a>
<button onclick="showHref()">Lấy đường dẫn</button>

<script>
    function showHref() {
        let link = document.getElementById("myLink").getAttribute("href");
        alert("Đường dẫn hiện tại: " + link);
    }
</script>

Khi nhấn nút, một hộp thoại (alert) sẽ hiển thị đường dẫn của thẻ <a>.

removeAttribute(name) – Xóa thuộc tính của phần tử

Cú pháp:

element.removeAttribute("thuộc_tính");

Ví dụ:

<input type="text" id="myInput" placeholder="Nhập tên của bạn">
<button onclick="removePlaceholder()">Xóa placeholder</button>

<script>
    function removePlaceholder() {
        document.getElementById("myInput").removeAttribute("placeholder");
    }
</script>

Khi nhấn nút, thuộc tính placeholder của ô nhập liệu sẽ bị xóa.

Thay đổi kiểu CSS của phần tử trong JavaScript

Sử dụng element.style.property để chỉnh sửa CSS trực tiếp.

  • Dùng element.classList.add(className) để thêm một class.

  • Dùng element.classList.remove(className) để xóa một class.

  • Dùng element.classList.toggle(className) để thêm hoặc xóa class tùy theo trạng thái hiện tại.

Thay đổi thuộc tính CSS trực tiếp bằng style.property

Cú pháp:

element.style.property = "giá trị";

Ví dụ:

<p id="text">Đây là một đoạn văn bản.</p>
<button onclick="changeStyle()">Thay đổi màu sắc</button>

<script>
    function changeStyle() {
        document.getElementById("text").style.color = "red";
        document.getElementById("text").style.fontSize = "20px";
    }
</script>

Khi nhấn nút, màu chữ của đoạn văn sẽ chuyển thành đỏ và cỡ chữ tăng lên 20px.

Thêm class vào phần tử bằng classList.add()

Cú pháp:

element.classList.add("tên_class");

Ví dụ:

<style>
    .highlight {
        color: white;
        background-color: blue;
        font-weight: bold;
        padding: 5px;
    }
</style>

<p id="text">Đây là một đoạn văn bản.</p>
<button onclick="addHighlight()">Thêm hiệu ứng</button>

<script>
    function addHighlight() {
        document.getElementById("text").classList.add("highlight");
    }
</script>

Khi nhấn nút, đoạn văn bản sẽ có nền màu xanh, chữ trắng và đậm.

Xóa class khỏi phần tử bằng classList.remove()

Cú pháp:

element.classList.remove("tên_class");

Ví dụ:

<button onclick="removeHighlight()">Xóa hiệu ứng</button>

<script>
    function removeHighlight() {
        document.getElementById("text").classList.remove("highlight");
    }
</script>

Khi nhấn nút, class "highlight" sẽ bị xóa, đoạn văn trở về trạng thái ban đầu.

Bật/tắt class bằng classList.toggle()

Cú pháp:

element.classList.toggle("tên_class");

Ví dụ:

<button onclick="toggleHighlight()">Bật/Tắt hiệu ứng</button>

<script>
    function toggleHighlight() {
        document.getElementById("text").classList.toggle("highlight");
    }
</script>

Khi nhấn nút, hiệu ứng màu sắc sẽ bật nếu chưa có classtắt nếu đã có class.

Thêm, xóa và thay thế phần tử trong DOM trong JavaScript

Chúng ta có thể thay đổi cấu trúc của trang web bằng cách:

  • Tạo phần tử mới với document.createElement(tagName).

  • Thêm phần tử mới vào DOM bằng element.appendChild(newElement).

  • Xóa phần tử khỏi DOM với element.removeChild(childElement).

  • Thay thế phần tử bằng element.replaceChild(newElement, oldElement).

Tạo một phần tử mới bằng createElement()

Cú pháp:

let newElement = document.createElement("tên_thẻ");

Ví dụ:

<button onclick="addParagraph()">Thêm đoạn văn</button>

<script>
    function addParagraph() {
        let p = document.createElement("p");
        p.textContent = "Đây là một đoạn văn mới!";
        document.body.appendChild(p);
    }
</script>

Khi nhấn nút, một đoạn văn bản mới sẽ được thêm vào cuối trang.

Thêm phần tử vào cây DOM bằng appendChild()

Cú pháp:

parentElement.appendChild(newElement);

Ví dụ:

<ul id="list">
    <li>Item 1</li>
    <li>Item 2</li>
</ul>
<button onclick="addListItem()">Thêm mục</button>

<script>
    function addListItem() {
        let li = document.createElement("li");
        li.textContent = "Mục mới";
        document.getElementById("list").appendChild(li);
    }
</script>

Khi nhấn nút, một mục mới sẽ được thêm vào danh sách.

Xóa phần tử bằng removeChild()

Cú pháp:

parentElement.removeChild(childElement);

Ví dụ:

<button onclick="removeItem()">Xóa mục cuối</button>

<script>
    function removeItem() {
        let list = document.getElementById("list");
        if (list.lastChild) {
            list.removeChild(list.lastChild);
        }
    }
</script>

Khi nhấn nút, phần tử cuối cùng của danh sách sẽ bị xóa.

Thay thế phần tử bằng replaceChild()

Cú pháp:

parentElement.replaceChild(newElement, oldElement);

Ví dụ:

<p id="oldText">Nội dung cũ</p>
<button onclick="replaceText()">Thay đổi nội dung</button>

<script>
    function replaceText() {
        let newText = document.createElement("p");
        newText.textContent = "Nội dung mới!";
        let oldText = document.getElementById("oldText");
        oldText.parentNode.replaceChild(newText, oldText);
    }
</script>

Khi nhấn nút, đoạn văn bản "Nội dung cũ" sẽ được thay bằng "Nội dung mới!".

Xử lý sự kiện với DOM trong JavaScript

JavaScript cho phép chúng ta xử lý các sự kiện trong trình duyệt bằng cách lắng nghe hành động của người dùng trên các phần tử HTML.

Thêm sự kiện bằng addEventListener()

Phương thức addEventListener(event, function) cho phép chúng ta gắn một sự kiện vào phần tử mà không ghi đè các sự kiện khác.

Cú pháp

element.addEventListener("event", function);

Ví dụ:

<button id="myButton">Nhấn vào đây</button>

<script>
    document.getElementById("myButton").addEventListener("click", function() {
        alert("Bạn đã nhấn vào nút!");
    });
</script>

Khi nhấn nút, hộp thoại alert sẽ xuất hiện.

Xóa sự kiện bằng removeEventListener()

Phương thức removeEventListener(event, function) giúp loại bỏ một sự kiện đã được thêm vào.

Cú pháp:

element.removeEventListener("event", function);
Ví dụ:
<button id="disableButton">Tắt sự kiện</button>
<button id="clickMe">Nhấn vào tôi</button>

<script>
    function showMessage() {
        alert("Nút này đã được nhấn!");
    }

    document.getElementById("clickMe").addEventListener("click", showMessage);
    document.getElementById("disableButton").addEventListener("click", function() {
        document.getElementById("clickMe").removeEventListener("click", showMessage);
    });
</script>

Khi nhấn vào "Tắt sự kiện", nút "Nhấn vào tôi" sẽ không còn phản hồi khi nhấn nữa.

Một số sự kiện phổ biến

Sự kiện Mô tả
click Khi người dùng nhấp chuột vào phần tử.
mouseover Khi chuột di chuyển vào phần tử.
mouseout Khi chuột rời khỏi phần tử.
keydown Khi người dùng nhấn một phím.
keyup Khi người dùng nhả phím ra.
change Khi giá trị của input thay đổi.

Ví dụ về sự kiện mouseovermouseout:

<p id="text">Di chuột vào đây</p>

<script>
    let text = document.getElementById("text");

    text.addEventListener("mouseover", function() {
        text.style.color = "red";
    });

    text.addEventListener("mouseout", function() {
        text.style.color = "black";
    });
</script>

Khi di chuột vào đoạn văn, chữ sẽ đổi sang màu đỏ. Khi rời chuột đi, chữ quay lại màu đen.

Duyệt qua cây DOM (DOM Traversing) trong JavaScript

DOM Traversing giúp chúng ta truy cập các phần tử liên quan trong cây DOM, bao gồm phần tử cha, phần tử con và phần tử anh/chị em.

Truy cập phần tử cha

Phương thức Mô tả
element.parentNode Lấy phần tử cha (bao gồm cả text nodes).
element.parentElement Lấy phần tử cha nhưng bỏ qua text nodes.

Ví dụ:

<div id="child">Phần tử con</div>

<script>
    let child = document.getElementById("child");
    console.log(child.parentNode);  // Lấy phần tử cha
</script>

Truy cập phần tử con

Phương thức Mô tả
element.childNodes Lấy danh sách tất cả các node con (bao gồm cả text nodes).
element.firstChild Lấy phần tử con đầu tiên (bao gồm cả text nodes).
element.lastChild Lấy phần tử con cuối cùng (bao gồm cả text nodes).

Ví dụ:

<ul id="list">
    <li>Mục 1</li>
    <li>Mục 2</li>
</ul>

<script>
    let list = document.getElementById("list");
    console.log(list.childNodes);  // Lấy danh sách các phần tử con
</script>

Truy cập phần tử anh chị em

Phương thức Mô tả
element.nextSibling Lấy phần tử anh chị em kế tiếp (bao gồm cả text nodes).
element.previousSibling Lấy phần tử anh chị em phía trước (bao gồm cả text nodes).

Ví dụ:

<ul>
    <li id="item1">Mục 1</li>
    <li id="item2">Mục 2</li>
</ul>

<script>
    let item2 = document.getElementById("item2");
    console.log(item2.previousSibling); // Lấy phần tử anh/chị em trước đó
</script>

Làm việc với bảng trong DOM trong JavaScript

Chúng ta có thể tạo, chèn hoặc xóa hàng và ô trong bảng bằng JavaScript.

Thêm hàng vào bảng bằng insertRow()

Cú pháp:

table.insertRow(index);

Ví dụ:

<table id="myTable" border="1">
    <tr><td>Hàng 1</td></tr>
</table>
<button onclick="addRow()">Thêm hàng</button>

<script>
    function addRow() {
        let table = document.getElementById("myTable");
        let row = table.insertRow(-1);
        let cell = row.insertCell(0);
        cell.textContent = "Hàng mới";
    }
</script>

Khi nhấn nút, một hàng mới sẽ được thêm vào cuối bảng.

Thêm ô vào hàng bằng insertCell()

Cú pháp:

row.insertCell(index);

Ví dụ:

<button onclick="addCell()">Thêm ô</button>

<script>
    function addCell() {
        let row = document.getElementById("myTable").rows[0];
        let cell = row.insertCell(-1);
        cell.textContent = "Ô mới";
    }
</script>

Khi nhấn nút, một ô mới sẽ được thêm vào hàng đầu tiên.

Xóa hàng bằng deleteRow()

Cú pháp:

table.deleteRow(index);

Ví dụ:

<button onclick="deleteRow()">Xóa hàng</button>

<script>
    function deleteRow() {
        let table = document.getElementById("myTable");
        if (table.rows.length > 0) {
            table.deleteRow(-1);
        }
    }
</script>

Khi nhấn nút, hàng cuối cùng của bảng sẽ bị xóa.

Xóa ô bằng deleteCell()

Cú pháp:

row.deleteCell(index);

Ví dụ:

<button onclick="deleteCell()">Xóa ô</button>

<script>
    function deleteCell() {
        let row = document.getElementById("myTable").rows[0];
        if (row.cells.length > 0) {
            row.deleteCell(-1);
        }
    }
</script>

Khi nhấn nút, ô cuối cùng của hàng đầu tiên sẽ bị xóa.

Kết bài

HTML DOM trong JavaScript cung cấp một bộ công cụ mạnh mẽ để thao tác với nội dung, thuộc tính, sự kiện và cấu trúc của trang web. Thông qua các phương thức như truy xuất phần tử, thay đổi nội dung, chỉnh sửa CSS, thêm/xóa phần tử và xử lý sự kiện, chúng ta có thể tạo ra các trang web động, tương tác và thân thiện với người dùng.

Việc hiểu và áp dụng thành thạo HTML DOM không chỉ giúp lập trình viên quản lý giao diện web một cách hiệu quả mà còn nâng cao trải nghiệm người dùng. Hy vọng với những kiến thức đã trình bày, bạn có thể tự tin làm việc với DOM trong các dự án JavaScript của mình.

Bài viết liên quan