Xử lý sự kiện của DOM trong JavaScript

Ngày đăng: 03/10/2020   -    Cập nhật: 06/10/2020


Như bạn biết, nhiệm vụ quan trọng hàng đầu của JavaScript là tạo ra tính tương tác ở phía client. Đó chính là đang đề cập đến khả năng xử lý các sự kiện của DOM trong JS.

Xử lý các sự kiện DOM trong JavaScript

Hôm nay chúng ta sẽ học về nó.

1. Sự kiện là gì?


Một trang web với các thao tác như click chuột, hay di chuột,… Đây được xem là các sự kiệnJavaScript có thể bắt các sự kiện này thông qua HTML DOM.

Các sự kiện này được cụ thể bằng các thuộc tính HMTL như: onclick (click chuột), onmouseover (di chuột qua), ….

Và bằng cách lắng nghe các sự kiện và người dùng tương tác, ta gửi trả phản hồi lại tương ứng đó gọi là xử lý sự kiện.

Bạn có thể thêm sự kiện bằng cách thêm thuộc tính sự kiện vào phần tử HTML

Ví dụ một phản ứng với sự kiện click chuột của người dùng:



<button id="btn" onclick="myFunction()">Click vào đây</button>
<script>
    function myFunction() {
        alert("Bạn đã click vào một phần tử trong HTML DOM");
    }
</script>
 

Kết quả ta được:

Kết quả minh họa xử lý sự kiện DOM trong JavaScript

Kết quả minh họa xử lý sự kiện DOM trong JavaScript

2. Các sự kiện phổ biến thường gặp


Dưới đây mô tả các sự kiện phổ biến thường gặp:


onclick Xảy ra khi click vào phần tử HTML
ondbclick Xảy ra khi double click vào phần tử HTML
onchange Xảy ra khi giá trị (hay value) của phần tử HTML được thay đổi. Thường dùng trong các đối thẻ nhập dữ liệu như form input
onmouseover Xảy ra khi con trỏ chuột bắt đầu đi vào phần tử HTML
onmouseout Xảy ra khi con trỏ chuột bắt đầu rời khỏi phần tử HTML
onmouseenter Tương tự như onmouseover
onmouseleave Tương tự như onmouseout
onmousemove Xảy ra khi con chuột di chuyển bên trong phần tử HTML
onkeydown Xảy ra khi gõ một phím bất kì vào ô input
onload Sảy ra khi phần tử HTML bắt đầu chạy, nó giống như hàm khởi tạo trong lập trình hướng đối tượng vậy đó.
onkeyup Xảy ra khi bạn gõ phím nhưng lúc bạn bỏ phím ra sẽ được kích hoạt
onkeypress Xảy ra khi bạn nhấn môt phím vào ô input
onblur Xảy ra khi con trỏ chuột rời khỏi ô input
oncopy Xảy ra khi bạn copy nội dung của phần tử HTML
oncut Xảy ra khi bạn cắt nội dung của phần tử HTML
onpaste Xảy ra khi bạn dán nội dung vào phần tử HTML

 

3. Xử lý sự kiện JavaScript DOM


Đó, bây giờ chúng ta sẽ sử dụng JavaScript để xử lý một số sự kiện phổ biến của DOM nhé.

3.1. Chèn vào thuộc tính sự kiện của HTML DOM


Cú pháp tổng quát để thêm một sự kiện mới vào một phần tử HTML như sau:


document.method().events = function() {
    // Khối lệnh thực thi
}
 

Trong đó:

  • method(): Là hàm xử lý DOM để chỉ định một phần tử HTML
  • events: Là tên sự kiện sẽ được thực thi (tham khảo sự kiện ở bảng trên)
  • function(){ ... }: Là code JavaScript mà khi sự kiện được kích hoạt thì hàm này sẽ thực thi.
 
Ví dụ: Chọn đến button có idbtn và thêm vào đó một sự kiện onclick



<button id="btn">Click vào đây</button>
<script>
    document.getElementById("btn").onclick = function() {
        alert("Bạn đã click vào một phần tử trong HTML DOM");
    };
</script>
 

Chúng ta được kết quả giống với ví dụ đầu tiên.

Nhưng ở đây mình thêm sự kiện bằng JavaScript DOM

Đối với các phần tử HTML mà có nhiều hơn 1 lựa chọn thì bạn cần phải chạy vòng lặp để thêm sự kiện cho nó.

Ví dụ, ta có HTML:



<ul>
    <li class="menu">JAVA</li>
    <li class="menu">JAVASCRIPT</li>
    <li class="menu">PHP</li>
    <li class="menu">PYTHON</li>
</ul>
 

Bây giờ, thực hiện lắng nghe sự kiện click chuột của người dùng. Nếu click vào khóa học nào thì màu của khóa học đó đổi thành màu đỏ.


// Lấy các phần tử có class là menu
let x = document.getElementsByClassName("menu");

// Lặp qua các phần tử có class là menu
for (let i = 0i < x.lengthi++) {
    
    // Lắng nghe sự kiện click
    // và đổi màu chữ thành màu đỏ
    x[i].onclick = function() {
        this.style.color = "red";
    };
}
 

Ở đây bạn thấy mình sử dụng từ khóa this. Từ khóa này mình sẽ giải thích ở một bài khác.

Bây giờ bạn chỉ cần hiểu hoạt động này như là:


"Á À, tao bắt được mày click vào đây rồi nhá. Tô màu đỏ ngay cho thằng cho thằng này (this) thôi"

3.2. Sử dụng phương thức addEvenListener()


Phương thức này cũng cho phép ta gán sự kiện cho một phần tử HTML DOM, điểm khác các phương thức trên là có thể gán một hoặc nhiều events vào một phần tử HTML mà không xóa đi các sự kiện khác.

Khi ta sử dụng phương thức addEventsListenner(), JavaScript sẽ tách biệt nó với HTML Makup.

Bạn cũng có thể dễ dàng xóa bất kỳ event listenner bằng cách sử dụng phương thức removeEvenListenner().

Cú pháp để thêm sự kiện như sau:



element.addEventListener(eventfunctionuseCapture);
 

Trong đó:

  • event: Là tên sự kiện (bạn có thể tham khảo ở bảng phía trên).
  • function: Là hàm JavaScript mà bạn muốn thực thi khi sự kiện kích hoạt.
  • useCapture: Là một giá trị boolean value cho hai lựa chọn: event bubbling hoặc event capturing.

Phương thức này cho phép bạn thêm nhiều events cho một element cùng một lúc.

Ví dụ, ta có một nút:



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

Bây giờ, tiếp tục viết code JS như sau:


// Tạo các hàm xử lý
function suKien1() {
    alert("Lập trình JavaScript căn bản!");
}

function suKien2() {
    alert("Thêm sự kiện thành công");
}
// Chọn đến nút có id là btn
let x = document.getElementById("btn");

// Thêm sự kiện
x.addEventListener("click"suKien1);
x.addEventListener("click"suKien2);
 

Bạn hãy thử chạy trên trình duyệt để xem kết quả.

Và ấn F12 để kiểm tra luôn xem mã HTML có thay đổi gì không nhé.


Nên sử dụng Bubbling hay Event capturing?


Có hai cách để sự kiện được lan truyền (event propagation) trong HTML DOM: bubblingcapturing.

> Khái niệm Event propagation là cách định nghĩa thứ tự của HTML element khi event xảy ra.

Ví dụ nếu ta có một phần tử <p> bên trong một phần tử <div>.



<div onclick="suKienA">
    <p onclick="suKienB"></p>
</div>
 

Thì câu hỏi đặt ra là...

Khi người dùng click lên phần tử <p>, thì sự kiện “click” của phần tử nào sẽ được xử lý trước?

Trong bubbling, sự kiện của phần tử bên trong cùng sẽ được xử lý trước:


  • Với ví dụ trên, sự kiện “click” của phần tử <p> sẽ được xử lý trước
  • Sau đó đến sự kiện của phần tử <div>.

Trong capturing thì ngược lại, sự kiện của phần tử bên ngoài cùng sẽ được xử lý trước:

  • Sự kiện “click” của phần tử <div> được xử lý trước
  • sau đó tới phần tử <p>.

Với phương thức addEventListener(), bạn có thể chỉ định propagation type bằng tham số “useCapture”:


addEventListener(eventfunctionuseCapture);
 

Giá trị mặc định là false (sử dụng bubbling propagation).

Khi giá trị tham số được thiết lập là true, sự kiện sẽ sử dụng capturing propagation.


3.3. Xóa một sự kiện với removeEventListener()


Phương thức removeEventListener() cho phép xóa sự kiện đã được gắn vào phần tử HTML trước đó bằng phương thức addEventListener()

Cú pháp:



element.removeEventListener(eventfunction);
 

Trong đó:

  • event: Là sự kiện cần xóa
  • function: Là hàm thực thi cùng với sự kiện.

Ví dụ, ta có HTML:


<div id="myDIV" style="border: 1px solid black">Di chuột trên DIV này. Sự kiện mousemove sẽ kích hoạt Math.random().
    <p>Click vào nút bên dưới để xóa sự kiện</p>
    <button onclick="xoaSuKienMosemove()" id="myBtn">Thử ngay!</button>
</div>
<p id="myP"></p>
 

Sau đó, ta tạo một hàm tạo số ngẫu nhiên:


// Tao một số ngẫu nhiên từ 0 - 50
function taoSoNgauNhien() {
    document.getElementById("myP").innerHTML = Math.floor(Math.random() * 50);
}
 

Rồi sử dụng addEventListener() để thêm sự kiện vào thẻ div chỉ định.


// Kích hoạt tạo số ngẫu nhiên khi di chuột trên DIV chỉ định
document.getElementById("myDIV").addEventListener("mousemove"taoSoNgauNhien);
 

Và bây giờ là thực hiện xóa sự kiện chỉ định khi sự kiện click được kích hoạt.


// Xóa sự kiện chỉ định khi click
function xoaSuKienMosemove() {
    document.getElementById("myDIV").removeEventListener("mousemove"taoSoNgauNhien);
}
 

> Lưu ý: Phương thức addEventListener()removeEventListener() không được hỗ trợ trong IE 8 và các phiên bản trước đó.

Tổng kết


DOM trong JavaScript có thể thao tác với các phần tử của HTML và xử lý sự kiện.

Như vậy qua bài này mình đã giới thiệu gần như cơ bản nhất về xử lý sự kiện DOM trong JavaScript, bạn cố gắng thực hành lại các ví dụ để hiểu thêm nhé.

Hẹn gặp lại bạn ở bài học tiếp theo.


Bình luận Facebook
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!