เลือกอิลิเมนต์บนหน้าเว็บ ตอบสนองต่อการคลิก และนำการมอบหมายเหตุการณ์ (event delegation) มาใช้เพื่อโค้ดที่มีประสิทธิภาพ
เปิดบทเรียนนี้ใน KodokonDOM คือตัวแทนที่มีชีวิตของหน้า HTML ของคุณ: การจัดการมันคือวิธีที่ JavaScript ทำให้อินเทอร์เฟซโต้ตอบได้ คู่หูสำคัญคือ เลือกอิลิเมนต์ แล้วฟังสิ่งที่เกิดขึ้นกับมัน เรามาเริ่มด้วยโครงสร้างตั้งต้นเล็ก ๆ กันก่อน
<button id="save-btn" class="btn">Save</button>
<ul class="task-list">
<li>Buy groceries</li>
<li>Call the client</li>
</ul>querySelector รับตัวเลือก CSS ใด ๆ ก็ได้ (#id, .class, ul li, [data-id]) และคืนอิลิเมนต์แรกที่ตรงเงื่อนไข หรือคืน null ส่วน querySelectorAll คืนอิลิเมนต์ทั้งหมดที่ตรงเงื่อนไขในรูปของ NodeList ซึ่งคุณสามารถวนซ้ำได้ด้วย forEach
const button = document.querySelector("#save-btn");
const firstTask = document.querySelector(".task-list li");
const tasks = document.querySelectorAll(".task-list li");
console.log(tasks.length); // 2
console.log(firstTask.textContent); // "Buy groceries"หากต้องการตอบสนองต่อการกระทำของผู้ใช้ addEventListener จะผูกฟังก์ชันเข้ากับประเภทของเหตุการณ์: click, input, submit, keydown... ฟังก์ชันจะได้รับออบเจกต์ event ที่อธิบายสิ่งที่เกิดขึ้น จากนั้นคุณสามารถเปลี่ยนเนื้อหาด้วย textContent และเปลี่ยนสไตล์ด้วย classList ได้
const button = document.querySelector("#save-btn");
button.addEventListener("click", () => {
button.textContent = "Saved!";
button.classList.add("success");
});นิสัยที่ดีของมืออาชีพ: รายการที่มี 200 สมาชิกไม่สมควรมี listener ถึง 200 ตัว ให้ผูก listener เพียงตัวเดียวไว้ที่พาเรนต์ แล้วระบุอิลิเมนต์ที่ถูกคลิกด้วย event.target นี่คือการมอบหมายเหตุการณ์ (event delegation): มันใช้ได้แม้กระทั่งกับอิลิเมนต์ที่ถูกเพิ่มเข้ามาภายหลังด้วย
const list = document.querySelector(".task-list");
list.addEventListener("click", (event) => {
const item = event.target.closest("li");
if (item) {
item.classList.toggle("done");
}
});document.querySelector(".btn") คืนค่าอะไรหากมีหลายอิลิเมนต์ที่มีคลาส btn?addEventListener มีบทบาทอะไร?event.target แทนอะไร?