JavaScript
DOM Manipulation
Event listeners
เรียนรู้การใช้ addEventListener เพื่อฟัง event เช่น click และ input พร้อมทำความเข้าใจ event object และ event types ที่ใช้บ่อย
Event คืออะไร
Event คือเหตุการณ์ที่เกิดขึ้นในหน้าเว็บ เช่น ผู้ใช้คลิกปุ่ม พิมพ์ข้อความ เลื่อน scroll หรือโหลดหน้าเสร็จ JavaScript ไม่ได้รอดูทุก event ตลอดเวลา — เราต้อง "บอก" ว่าอยากรับ event ไหน บน element ไหน แล้วจะทำอะไร
วิธีที่ใช้บ่อยที่สุดคือ `addEventListener` ซึ่งผูกฟังก์ชัน (handler) เข้ากับ event ที่ต้องการฟัง
`addEventListener` — ผูกฟังก์ชันกับ event
syntax: `element.addEventListener(eventType, handler)` - `eventType` — ชื่อ event เช่น `"click"`, `"input"`, `"submit"` - `handler` — ฟังก์ชันที่จะทำงานเมื่อ event เกิดขึ้น
ทุกครั้งที่คลิก #btn ฟังก์ชันจะทำงาน — ผูกได้กี่ฟังก์ชันก็ได้บน event เดียวกัน
const btn = document.querySelector("#btn");
btn.addEventListener("click", function() {
console.log("ปุ่มถูกคลิกแล้ว");
});handler จะได้รับ **event object** เป็น argument แรกโดยอัตโนมัติ event object เก็บข้อมูลเกี่ยวกับ event นั้น ๆ เช่น element ที่ถูกคลิก ชนิดของ event และพิกัด mouse
Event object — ข้อมูลที่มาพร้อม event
เมื่อ handler ถูกเรียก มันจะได้รับ event object เสมอ เรามักตั้งชื่อพารามิเตอร์นั้นว่า `e` หรือ `event` properties ที่ใช้บ่อย: - `e.target` — element ที่ผู้ใช้โต้ตอบโดยตรง - `e.type` — ชนิดของ event เช่น `"click"` - `e.key` — ปุ่มที่กด (สำหรับ keyboard events)
e.target คือ element ที่ถูก event กระทำ — ต่างจาก this ซึ่งขึ้นอยู่กับ context
const btn = document.querySelector("#btn");
btn.addEventListener("click", function(e) {
console.log(e.target); // <button id="btn">...</button>
console.log(e.type); // "click"
});
const input = document.querySelector("#search");
input.addEventListener("input", function(e) {
console.log(e.target.value); // ข้อความที่พิมพ์ล่าสุด
});ประเภท event ที่ใช้บ่อย
| Event type | เกิดเมื่อ | ตัวอย่าง element |
|---|---|---|
| `click` | คลิก mouse หรือแตะ | button, a, div |
| `input` | ค่าใน input เปลี่ยน (ทุกครั้งที่พิมพ์) | input, textarea |
| `change` | ค่าเปลี่ยนและ element เสีย focus | select, checkbox, radio |
| `submit` | ส่ง form | form |
| `keydown` | กดปุ่มค้างไว้ | input, document |
| `mouseover` | mouse ชี้เข้า element | div, img, a |
| `focus` | element ได้รับ focus | input, button |
| `blur` | element เสีย focus | input, button |
ข้อควรระวัง
- **Anonymous function ลบไม่ได้** — `removeEventListener` ต้องการ reference ของฟังก์ชันเดิม ถ้าผูกด้วย anonymous function `function() {}` จะลบออกไม่ได้ ต้องประกาศฟังก์ชันแยกไว้
- **ผูกซ้ำ = ทำงานสองรอบ** — การเรียก `addEventListener` สองครั้งด้วยฟังก์ชันคนละตัวจะผูก handler สองตัว ต่างจาก `onclick = fn` ที่เขียนทับได้
- **`this` ใน arrow function** — ถ้าใช้ arrow function เป็น handler `this` จะไม่ชี้ที่ element นั้น ให้ใช้ `e.target` แทน หรือใช้ regular function ถ้าต้องการ `this`