Sự kiện trong HTML DOM (DOM Events) trong JavaScript

JavaScript HTML DOM | by Học Javascript

Trong lập trình web, sự kiện (Event) đóng vai trò quan trọng trong việc tạo ra các trang web tương tác động. Mọi hành động của người dùng trên trang web như nhấn nút (click), nhập dữ liệu, di chuột, cuộn trang hoặc các thay đổi từ hệ thống như tải trang, thay đổi kích thước trình duyệt đều là các sự kiện.

HTML DOM Events trong JavaScript giúp chúng ta lắng nghe (listen) và xử lý (handle) các sự kiện này, từ đó tạo ra các phản hồi phù hợp nhằm nâng cao trải nghiệm người dùng. Bằng cách sử dụng các phương pháp như thuộc tính sự kiện, addEventListener(), chúng ta có thể dễ dàng kiểm soát và điều khiển hành vi của các phần tử trên trang web.

Bài viết này sẽ giúp bạn hiểu rõ về các loại sự kiện trong DOM, cách lắng nghe và xử lý sự kiện, cũng như ứng dụng chúng trong lập trình web để xây dựng giao diện linh hoạt và sinh động.

Giới thiệu về DOM Events trong JavaScript

Khái niệm về sự kiện (Event) trong JavaScript

Trong JavaScript, sự kiện (Event) là các hành động hoặc tương tác mà người dùng hoặc trình duyệt thực hiện trên trang web, chẳng hạn như nhấp chuột, nhập dữ liệu vào ô input, di chuyển chuột, gửi biểu mẫu, cuộn trang, tải tài liệu, v.v.

JavaScript cung cấp các cơ chế để lắng nghe và xử lý những sự kiện này, giúp trang web trở nên tương tác và linh hoạt hơn. Khi một sự kiện xảy ra, ta có thể thực hiện các hành động như:

  • Hiển thị hoặc ẩn nội dung.

  • Thay đổi màu sắc, bố cục của trang.

  • Xử lý dữ liệu nhập vào form.

  • Kiểm soát hành vi của trình duyệt.

Ví dụ về một sự kiện đơn giản:

<button onclick="alert('Bạn đã nhấn nút!')">Nhấn tôi</button>

Khi người dùng nhấn vào nút, sự kiện onclick được kích hoạt và hiển thị một thông báo.

Tầm quan trọng của sự kiện trong lập trình web

Sự kiện đóng vai trò quan trọng trong lập trình web vì chúng giúp:

  • Tạo trải nghiệm tương tác cho người dùng: Ví dụ, khi nhấn vào một nút, nội dung có thể thay đổi hoặc hiển thị thông báo.

  • Cải thiện khả năng điều hướng và xử lý dữ liệu: Giúp xác thực form, kiểm tra đầu vào trước khi gửi dữ liệu.

  • Tối ưu hóa hiệu suất trang web: JavaScript có thể xử lý sự kiện mà không cần tải lại trang, giúp trải nghiệm người dùng mượt mà hơn.

  • Quản lý hành vi của trình duyệt: Có thể chặn hành động mặc định của trình duyệt, như ngăn chặn gửi form khi chưa nhập đủ dữ liệu.

Các loại sự kiện phổ biến trong JavaScript

Dưới đây là các loại sự kiện phổ biến mà JavaScript hỗ trợ:

Sự kiện chuột (Mouse Events)

  • click – Xảy ra khi người dùng nhấn chuột vào một phần tử.

  • dblclick – Xảy ra khi người dùng nhấp đúp chuột.

  • mouseover – Xảy ra khi di chuột vào một phần tử.

  • mouseout – Xảy ra khi di chuột ra khỏi một phần tử.

  • mousedown / mouseup – Xảy ra khi nhấn và thả chuột.

Ví dụ:

<button id="btn">Nhấn vào tôi</button>
<script>
  document.getElementById("btn").addEventListener("click", function() {
    alert("Bạn vừa nhấn nút!");
  });
</script>

Sự kiện bàn phím (Keyboard Events)

  • keydown – Xảy ra khi nhấn một phím.

  • keyup – Xảy ra khi thả phím.

  • keypress (cũ) – Xảy ra khi nhấn phím ký tự (không khuyến khích sử dụng vì đã bị loại bỏ trong các trình duyệt mới).

Ví dụ:

<input type="text" id="inputBox" placeholder="Nhập gì đó...">
<script>
  document.getElementById("inputBox").addEventListener("keydown", function(event) {
    console.log("Bạn vừa nhấn phím: " + event.key);
  });
</script>

Sự kiện Form (Form Events)

  • submit – Xảy ra khi form được gửi.

  • change – Xảy ra khi giá trị của input thay đổi.

  • focus – Xảy ra khi input được chọn.

  • blur – Xảy ra khi input mất focus.

Ví dụ:

<form id="myForm">
  <input type="text" id="nameInput" placeholder="Nhập tên">
  <button type="submit">Gửi</button>
</form>
<script>
  document.getElementById("myForm").addEventListener("submit", function(event) {
    event.preventDefault(); // Ngăn chặn gửi form
    alert("Form đã được gửi!");
  });
</script>

Sự kiện Tài liệu (Document Events)

  • DOMContentLoaded – Xảy ra khi tài liệu HTML được tải xong.

  • scroll – Xảy ra khi người dùng cuộn trang.

  • resize – Xảy ra khi kích thước cửa sổ trình duyệt thay đổi.

Ví dụ:

<script>
  window.addEventListener("resize", function() {
    console.log("Kích thước trình duyệt đã thay đổi!");
  });
</script>

Cách lắng nghe và xử lý sự kiện trong JavaScript

Trong JavaScript, có nhiều cách để lắng nghe và xử lý sự kiện trên các phần tử HTML. Dưới đây là ba phương pháp phổ biến để thực hiện điều này.

Sử dụng thuộc tính sự kiện trực tiếp trong HTML

Cách đơn giản nhất để xử lý sự kiện là sử dụng các thuộc tính sự kiện trực tiếp trên thẻ HTML, như onclick, onmouseover, onchange, v.v.

Ví dụ:

<button onclick="alert('Bạn đã nhấn nút!')">Nhấn vào tôi</button>

Khi người dùng nhấn vào nút, sự kiện onclick sẽ được kích hoạt và hiển thị hộp thoại cảnh báo.

Ưu điểm:

Dễ hiểu và nhanh chóng triển khai.
Không cần viết JavaScript riêng biệt.

Nhược điểm:

Khó bảo trì khi có nhiều phần tử và sự kiện trong mã HTML.
Không thể gán nhiều sự kiện cho cùng một phần tử.
Vi phạm nguyên tắc tách biệt giữa HTML và JavaScript (không tuân theo chuẩn lập trình tốt).

Sử dụng thuộc tính sự kiện trong JavaScript

Một cách khác là gán sự kiện trực tiếp cho phần tử trong JavaScript bằng cách sử dụng thuộc tính sự kiện (element.event = function).

Ví dụ:

<button id="btn">Nhấn vào tôi</button>
<script>
  document.getElementById("btn").onclick = function() {
    alert("Bạn đã nhấn nút!");
  };
</script>

Ở đây, sự kiện onclick được gán cho phần tử có id="btn" bằng JavaScript thay vì trong HTML.

Ưu điểm:

Giúp tách biệt HTML và JavaScript, dễ bảo trì hơn.
Không cần viết sự kiện trong thẻ HTML.

Nhược điểm:

Nếu gán nhiều sự kiện cùng loại vào một phần tử, sự kiện trước đó sẽ bị ghi đè.
Không thể thêm nhiều trình xử lý cho cùng một sự kiện.

Ví dụ về vấn đề ghi đè sự kiện:

<button id="btn">Nhấn vào tôi</button>
<script>
  let btn = document.getElementById("btn");

  btn.onclick = function() {
    alert("Sự kiện 1");
  };

  btn.onclick = function() {
    alert("Sự kiện 2"); // Sự kiện 1 bị ghi đè, chỉ sự kiện 2 hoạt động.
  };
</script>

Sử dụng addEventListener()

Phương pháp tốt nhất để xử lý sự kiện là sử dụng addEventListener(), cho phép gán nhiều sự kiện cho một phần tử mà không bị ghi đè.

Cú pháp:

element.addEventListener("event", function, useCapture);
  • event: Tên sự kiện (ví dụ: "click", "mouseover", "keydown", ...).

  • function: Hàm thực thi khi sự kiện xảy ra.

  • useCapture (tùy chọn): Giá trị true hoặc false, mặc định là false (sự kiện xảy ra theo hướng nổi bọt - bubbling).

Ví dụ:

<button id="btn">Nhấn vào tôi</button>
<script>
  let btn = document.getElementById("btn");

  btn.addEventListener("click", function() {
    alert("Sự kiện 1");
  });

  btn.addEventListener("click", function() {
    alert("Sự kiện 2");
  });
</script>

Kết quả: Khi nhấn nút, cả hai sự kiện sẽ được kích hoạt lần lượt.

Ưu điểm của addEventListener() so với hai phương pháp trên:

Có thể gán nhiều sự kiện cho cùng một phần tử mà không bị ghi đè.
Hỗ trợ cả sự kiện nổi bọt (bubbling)chặn nổi bọt (capturing).
Cho phép gỡ bỏ sự kiện bằng removeEventListener().
Tách biệt hoàn toàn JavaScript và HTML, giúp mã dễ bảo trì.

Gỡ bỏ sự kiện bằng removeEventListener()

Chúng ta có thể sử dụng removeEventListener() để xóa một sự kiện đã được gán trước đó.

Ví dụ:

<button id="btn">Nhấn vào tôi</button>
<script>
  function showMessage() {
    alert("Sự kiện này sẽ bị xóa sau lần nhấn đầu tiên.");
    btn.removeEventListener("click", showMessage);
  }

  let btn = document.getElementById("btn");
  btn.addEventListener("click", showMessage);
</script>

Kết quả: Sự kiện chỉ chạy một lần duy nhất, sau đó bị xóa.

Lưu ý: Khi dùng removeEventListener(), hàm xử lý sự kiện phải được khai báo riêng biệt (không phải hàm ẩn danh).

Các loại sự kiện phổ biến trong DOM trong JavaScript

Trong JavaScript, sự kiện DOM giúp xử lý các hành động của người dùng trên trang web. Dưới đây là các loại sự kiện phổ biến và cách sử dụng chúng.

Sự kiện chuột (Mouse Events)

Sự kiện chuột liên quan đến các hành động như nhấp, di chuyển, hoặc nhấn giữ chuột.

Các sự kiện chuột thường gặp:

Sự kiện Mô tả
click Kích hoạt khi người dùng nhấp vào một phần tử.
dblclick Kích hoạt khi nhấn đúp chuột vào phần tử.
mouseover / mouseout Khi di chuột vào / ra khỏi phần tử.
mousedown / mouseup Khi nhấn và thả nút chuột.

Ví dụ:

<button id="btn">Nhấn vào tôi</button>
<script>
  let btn = document.getElementById("btn");

  btn.addEventListener("click", function() {
    alert("Bạn đã nhấn vào nút!");
  });

  btn.addEventListener("mouseover", function() {
    btn.style.backgroundColor = "yellow";
  });

  btn.addEventListener("mouseout", function() {
    btn.style.backgroundColor = "";
  });
</script>

Giải thích:

  • Khi nhấp vào nút, hộp thoại cảnh báo xuất hiện.

  • Khi di chuột vào, nền của nút đổi sang màu vàng.

  • Khi di chuột ra, nền trở về như cũ.

Sự kiện bàn phím (Keyboard Events)

Sự kiện bàn phím xảy ra khi người dùng nhấn phím trên bàn phím.

Các sự kiện bàn phím thường gặp:

Sự kiện Mô tả
keydown Kích hoạt khi một phím được nhấn xuống.
keyup Kích hoạt khi một phím được nhả ra.
keypress (Đã lỗi thời) Khi nhấn một phím ký tự (không áp dụng cho phím điều khiển như Shift, Ctrl).

Ví dụ:

<input type="text" id="inputBox" placeholder="Nhập chữ vào đây">
<p id="result"></p>

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

  inputBox.addEventListener("keydown", function(event) {
    result.textContent = "Bạn vừa nhấn phím: " + event.key;
  });
</script>

Giải thích:

  • Khi người dùng nhấn phím, tên phím sẽ hiển thị bên dưới ô nhập liệu.

Sự kiện Form (Form Events)

Các sự kiện này liên quan đến thao tác trên biểu mẫu (form) và các trường nhập liệu (input, select, textarea).

Các sự kiện form thường gặp:

Sự kiện Mô tả
submit Khi form được gửi đi.
change Khi giá trị của ô nhập thay đổi.
focus / blur Khi ô nhập được chọn hoặc mất focus.

Ví dụ:

<form id="myForm">
  <input type="text" id="nameInput" placeholder="Nhập tên của bạn">
  <button type="submit">Gửi</button>
</form>
<p id="message"></p>

<script>
  let form = document.getElementById("myForm");
  let nameInput = document.getElementById("nameInput");
  let message = document.getElementById("message");

  form.addEventListener("submit", function(event) {
    event.preventDefault(); // Ngăn chặn gửi form
    message.textContent = "Form đã được gửi!";
  });

  nameInput.addEventListener("focus", function() {
    nameInput.style.borderColor = "blue";
  });

  nameInput.addEventListener("blur", function() {
    nameInput.style.borderColor = "";
  });
</script>

Giải thích:

  • Khi gửi form, nội dung sẽ hiển thị mà không cần tải lại trang.

  • Khi ô nhập được chọn (focus), viền sẽ đổi sang màu xanh.

  • Khi mất focus (blur), viền sẽ trở lại bình thường.

Sự kiện tài liệu (Document Events)

Các sự kiện này liên quan đến toàn bộ tài liệu HTML (document).

Các sự kiện tài liệu phổ biến:

Sự kiện Mô tả
DOMContentLoaded Khi tài liệu HTML được tải xong.
scroll Khi người dùng cuộn trang.
resize Khi kích thước trình duyệt thay đổi.

Ví dụ về DOMContentLoaded:

<script>
  document.addEventListener("DOMContentLoaded", function() {
    alert("Trang đã tải xong!");
  });
</script>

Giải thích:

  • Khi tài liệu HTML được tải hoàn toàn, thông báo sẽ xuất hiện.

Ví dụ về scroll:

<p id="scrollStatus">Cuộn trang để xem hiệu ứng.</p>

<script>
  window.addEventListener("scroll", function() {
    document.getElementById("scrollStatus").textContent = "Bạn đang cuộn trang!";
  });
</script>

Giải thích:

  • Khi cuộn trang, văn bản sẽ thay đổi thành "Bạn đang cuộn trang!".

Ví dụ về resize:

<p id="resizeStatus">Thay đổi kích thước cửa sổ trình duyệt.</p>

<script>
  window.addEventListener("resize", function() {
    document.getElementById("resizeStatus").textContent = "Cửa sổ đã thay đổi kích thước!";
  });
</script>

Giải thích:

  • Khi thay đổi kích thước trình duyệt, văn bản sẽ cập nhật thông báo mới.

Ngăn chặn và kiểm soát hành vi sự kiện trong JavaScript

Trong JavaScript, các sự kiện có thể có những hành vi mặc định hoặc lan truyền không mong muốn. Để kiểm soát tốt hơn, ta có thể sử dụng các phương thức như event.preventDefault(), event.stopPropagation(), và event.stopImmediatePropagation().

Ngăn chặn hành động mặc định của trình duyệt

event.preventDefault() là gì?

event.preventDefault() dùng để ngăn chặn hành vi mặc định của trình duyệt khi sự kiện xảy ra.

  • Ngăn chặn form gửi khi chưa nhập đủ dữ liệu.

  • Ngăn chặn thao tác mở liên kết (<a href="#"> không làm gì cả).

  • Ngăn chặn menu chuột phải (contextmenu).

Ví dụ 1: Ngăn chặn form gửi khi chưa nhập đủ dữ liệu

<form id="myForm">
  <input type="text" id="name" placeholder="Nhập tên">
  <button type="submit">Gửi</button>
</form>
<p id="error"></p>

<script>
  document.getElementById("myForm").addEventListener("submit", function(event) {
    let nameInput = document.getElementById("name").value;
    if (nameInput.trim() === "") {
      event.preventDefault(); // Ngăn chặn gửi form
      document.getElementById("error").textContent = "Vui lòng nhập tên!";
    }
  });
</script>

Giải thích:

  • Nếu ô nhập liệu trống, form sẽ không gửi và hiển thị thông báo lỗi.

Ví dụ 2: Ngăn chặn mở liên kết

<a href="https://www.google.com" id="myLink">Nhấn vào đây</a>

<script>
  document.getElementById("myLink").addEventListener("click", function(event) {
    event.preventDefault(); // Ngăn chặn chuyển hướng
    alert("Liên kết này đã bị vô hiệu hóa!");
  });
</script>

Giải thích:

  • Khi nhấn vào liên kết, trình duyệt sẽ không điều hướng sang Google.

Ví dụ 3: Ngăn chặn menu chuột phải

<script>
  document.addEventListener("contextmenu", function(event) {
    event.preventDefault();
    alert("Menu chuột phải đã bị vô hiệu hóa!");
  });
</script>

Giải thích:

  • Khi người dùng nhấp chuột phải, menu mặc định sẽ không xuất hiện.

Dừng lan truyền sự kiện (Event Bubbling & Capturing)

Hiện tượng nổi bọt (Event Bubbling) là gì?

Khi một sự kiện xảy ra trên phần tử con, nó sẽ lan truyền lên các phần tử cha.

Ví dụ về nổi bọt:

<div id="parent" style="padding: 20px; background: lightgray;">
  <button id="child">Nhấn vào tôi</button>
</div>

<script>
  document.getElementById("parent").addEventListener("click", function() {
    alert("Sự kiện ở phần tử cha!");
  });

  document.getElementById("child").addEventListener("click", function() {
    alert("Sự kiện ở phần tử con!");
  });
</script>

Giải thích:

  • Khi nhấn vào nút "Nhấn vào tôi", cả nút và phần tử cha đều nhận sự kiện.

event.stopPropagation() – Ngăn chặn lan truyền sự kiện

Để ngăn sự kiện lan lên phần tử cha, dùng event.stopPropagation().

Ví dụ:

<div id="parent" style="padding: 20px; background: lightgray;">
  <button id="child">Nhấn vào tôi</button>
</div>

<script>
  document.getElementById("parent").addEventListener("click", function() {
    alert("Sự kiện ở phần tử cha!");
  });

  document.getElementById("child").addEventListener("click", function(event) {
    event.stopPropagation(); // Chặn lan truyền
    alert("Sự kiện ở phần tử con!");
  });
</script>

Giải thích:

  • Khi nhấn vào nút, chỉ hiển thị "Sự kiện ở phần tử con", không lan đến cha.

event.stopImmediatePropagation() – Ngăn chặn tất cả sự kiện trên phần tử

Nếu một phần tử có nhiều trình xử lý sự kiện, stopPropagation() chỉ chặn lan truyền, còn không chặn các sự kiện khác trên chính phần tử đó.
stopImmediatePropagation() sẽ chặn tất cả sự kiện trên phần tử đó.

Ví dụ:

<button id="myButton">Nhấn vào tôi</button>

<script>
  document.getElementById("myButton").addEventListener("click", function(event) {
    event.stopImmediatePropagation();
    alert("Sự kiện này sẽ chạy duy nhất!");
  });

  document.getElementById("myButton").addEventListener("click", function() {
    alert("Sự kiện này sẽ không bao giờ chạy!");
  });
</script>

Giải thích:

  • Chỉ có thông báo đầu tiên xuất hiện, sự kiện thứ hai bị chặn hoàn toàn.

Phương thức Mô tả
event.preventDefault() Ngăn chặn hành động mặc định của trình duyệt.
event.stopPropagation() Chặn sự kiện lan truyền lên cha.
event.stopImmediatePropagation() Chặn cả lan truyền và các sự kiện khác trên cùng một phần tử.

Ví dụ thực tế về sự kiện trong DOM trong JavaScript

Sự kiện trong JavaScript giúp làm cho trang web trở nên tương tác hơn. Dưới đây là một số ví dụ thực tế về cách xử lý sự kiện trong DOM.

Xử lý sự kiện khi nhấn nút

Khi người dùng nhấn vào nút, một thông báo sẽ được hiển thị.

Ví dụ

<button id="myButton">Nhấn vào tôi</button>
<p id="message"></p>

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

Giải thích:

  • Khi nút được nhấn, nội dung của <p> sẽ thay đổi thành "Bạn đã nhấn vào nút!".

Thay đổi nội dung khi nhập dữ liệu

Nội dung của một phần tử sẽ thay đổi theo dữ liệu mà người dùng nhập vào ô input.

Ví dụ

<input type="text" id="nameInput" placeholder="Nhập tên của bạn">
<p>Xin chào, <span id="displayName">...</span>!</p>

<script>
  document.getElementById("nameInput").addEventListener("input", function() {
    let name = this.value;
    document.getElementById("displayName").textContent = name || "...";
  });
</script>

Giải thích:

  • Khi người dùng nhập tên vào ô input, nội dung của <span> sẽ thay đổi theo.

  • Nếu ô input rỗng, hiển thị dấu "..." thay vì tên.

Thêm và xóa phần tử khi nhấn nút

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

  • Khi nhấn vào nút "Xóa", mục cuối cùng trong danh sách sẽ bị xóa.

Ví dụ

<ul id="itemList">
  <li>Phần tử 1</li>
  <li>Phần tử 2</li>
</ul>
<button id="addItem">Thêm</button>
<button id="removeItem">Xóa</button>

<script>
  document.getElementById("addItem").addEventListener("click", function() {
    let newItem = document.createElement("li");
    newItem.textContent = "Phần tử " + (document.getElementById("itemList").children.length + 1);
    document.getElementById("itemList").appendChild(newItem);
  });

  document.getElementById("removeItem").addEventListener("click", function() {
    let itemList = document.getElementById("itemList");
    if (itemList.children.length > 0) {
      itemList.removeChild(itemList.lastElementChild);
    }
  });
</script>

Giải thích:

  • Khi nhấn "Thêm", một <li> mới được tạo và thêm vào danh sách.

  • Khi nhấn "Xóa", mục cuối cùng trong danh sách sẽ bị xóa (nếu danh sách không rỗng).

Kết bài

Sự kiện trong HTML DOM là một phần quan trọng trong JavaScript giúp trang web trở nên tương tác và linh hoạt hơn. Bằng cách sử dụng các sự kiện như click, input, mouseover, submit, keydown, chúng ta có thể kiểm soát hành vi của người dùng và cải thiện trải nghiệm trên trang web.

Chúng ta đã tìm hiểu về cách lắng nghe sự kiện bằng addEventListener(), cách ngăn chặn hành vi mặc định bằng event.preventDefault(), cũng như cách xử lý các sự kiện phổ biến như chuột, bàn phím, form và tài liệu. Ngoài ra, các ví dụ thực tế như thay đổi nội dung khi nhập dữ liệu, thêm và xóa phần tử bằng JavaScript giúp chúng ta hiểu rõ hơn về cách sự kiện hoạt động trong DOM.

Việc sử dụng sự kiện đúng cách không chỉ giúp tối ưu hiệu suất mà còn làm cho website trở nên mượt mà và chuyên nghiệp hơn. Hãy tiếp tục khám phá và thực hành với các sự kiện trong JavaScript để nâng cao kỹ năng lập trình web của bạn!

Bài viết liên quan