16: Events Handling
ดักจับทุกการกระทำของผู้ใช้ (Click, Type, Submit) เพื่อสั่งงาน JavaScript
1. Event Listener (นักดักฟัง)
แทนที่จะเขียน onclick="..." ใน HTML (ซึ่งเก่าแล้ว) จะใช้คำสั่ง .addEventListener() ใน JS แทน เพราะยืดหยุ่นกว่าและเขียนซ้อนกันได้
Syntax
element.addEventListener("เหตุการณ์", ฟังก์ชันที่จะทำ)
let btn = document.querySelector("#myBtn");
// เมื่อมีการคลิก -> ให้รันฟังก์ชัน
btn.addEventListener("click", () => {
alert("ปุ่มถูกกดแล้ว!");
console.log("Button Clicked");
});
2. Events ที่พบบ่อย
เหตุการณ์ในหน้าเว็บมีเยอะมาก แต่ที่ใช้จริงบ่อย ๆ มีดังนี้:
click: เมื่อคลิกเมาส์ซ้ายdblclick: เมื่อดับเบิ้ลคลิกmouseenter: เมื่อเอาเมาส์ชี้ (Hover)mouseleave: เมื่อเอาเมาส์ออก
keydown: เมื่อกดปุ่มคีย์บอร์ดลง (กดค้างจะรัว)keyup: เมื่อปล่อยปุ่มคีย์บอร์ดsubmit: เมื่อกดส่งฟอร์ม สำคัญinput: เมื่อพิมพ์ข้อความ (ทำงานทันทีทุกตัวอักษร)change: เมื่อเปลี่ยนค่าเสร็จ (เช่น เลือก Dropdown, ติ๊ก Checkbox)
3. The Event Object (ตัวแปร e)
ทุกครั้งที่เกิดเหตุการณ์ Browser จะส่ง Object พิเศษ (มักตั้งชื่อว่า e หรือ event) มาให้ ซึ่งเก็บรายละเอียดของเหตุการณ์นั้นไว้
document.addEventListener("keydown", (e) => {
console.log(e); // ดูข้อมูลทั้งหมด
console.log("ปุ่มที่กด:", e.key);
console.log("รหัสปุ่ม:", e.code);
});
สมบัติสำคัญใน e:
e.target: คือ Element ตัวไหนที่เป็นต้นเหตุe.key: ปุ่มคีย์บอร์ดที่ถูกกด (เช่น "Enter", "a")e.preventDefault(): สั่งห้ามการทำงานปกติ (ดูข้อถัดไป)
4. Form & Prevent Default
โดยปกติเมื่อกดปุ่ม Submit ในฟอร์ม หน้าเว็บจะ Refresh (โหลดใหม่) เสมอ ซึ่งทำให้ข้อมูลหายหมดและ JS หยุดทำงาน
ทางแก้: e.preventDefault()
ต้องใช้คำสั่งนี้บรรทัดแรก เพื่อ "ห้าม" ไม่ให้หน้าเว็บโหลดใหม่
let form = document.querySelector("#myForm");
form.addEventListener("submit", (e) => {
e.preventDefault(); // 1. ห้ามรีเฟรชหน้าจอ
// 2. ดึงค่าจาก Input
let input = document.querySelector("#myInput");
console.log("ข้อมูลที่กรอก:", input.value);
// 3. เคลียร์ค่า
input.value = "";
});
Workshop: To-Do List
รายการสิ่งที่ต้องทำ
- ยังไม่มีรายการ...
Logic การทำงาน:
- เลือก
form,input,ulมารอไว้ - ดักจับ Event
submitที่ฟอร์ม - สั่ง
e.preventDefault()กันหน้าเว็บรีเฟรช - สร้าง HTML
<li>ใหม่ ใส่ค่าจาก input - ใช้
ul.innerHTML += ...เพื่อเพิ่มรายการต่อท้าย
Practice Mission: สมุดเยี่ยมชม
โจทย์:
จงสร้างระบบคอมเมนต์ง่ายๆ ที่มีช่องกรอก ชื่อ และ ข้อความ เมื่อกดส่ง ให้เก็บข้อมูลเป็น Object แล้วนำไปแสดงผลด้านล่าง (โดยไม่รีเฟรชหน้า)
สิ่งที่ต้องทำ:
- Event Listener: ดักจับ
submitของฟอร์ม และใช้e.preventDefault() - Object Creation: รับค่าจาก input ทั้งสอง แล้วสร้างเป็น Object เช่น
{ name: "Jo", msg: "Hello" } - Validation: ถ้าชื่อหรือข้อความว่างเปล่า ให้
alert("กรุณากรอกข้อมูล")และไม่ทำต่อ - DOM Render: สร้าง HTML String จาก Object นั้น แล้วยัดใส่
div#guestList(ใช้ Template Literal)