* สิ่งนี้ได้รับการแก้ไขเพื่อให้เด็ก ๆ ของคลาสเป้าหมายสามารถทริกเกอร์เหตุการณ์ได้ ดูรายละเอียดด้านล่างของคำตอบ * * * *
คำตอบอื่นเพื่อเพิ่มผู้ฟังเหตุการณ์ให้กับคลาสที่มีการเพิ่มและลบรายการบ่อยครั้ง สิ่งนี้ได้รับแรงบันดาลใจจากon
ฟังก์ชั่นของ jQuery ที่คุณสามารถส่งผ่านตัวเลือกสำหรับองค์ประกอบย่อยที่เหตุการณ์กำลังฟังอยู่
var base = document.querySelector('#base'); // the container for the variable content
var selector = '.card'; // any css selector for children
base.addEventListener('click', function(event) {
// find the closest parent of the event target that
// matches the selector
var closest = event.target.closest(selector);
if (closest && base.contains(closest)) {
// handle class event
}
});
ซอ: https://jsfiddle.net/u6oje7af/94/
สิ่งนี้จะรับฟังการคลิกที่ลูก ๆ ของbase
องค์ประกอบและหากเป้าหมายของการคลิกมีพาเรนต์ที่ตรงกับตัวเลือกเหตุการณ์คลาสจะถูกจัดการ คุณสามารถเพิ่มและลบองค์ประกอบตามที่คุณต้องการโดยไม่ต้องเพิ่มฟังคลิกคลิกไปยังองค์ประกอบแต่ละรายการ สิ่งนี้จะจับพวกมันทั้งหมดแม้กระทั่งองค์ประกอบที่เพิ่มเข้ามาหลังจากผู้ฟังนี้ถูกเพิ่มเข้ามาเช่นเดียวกับฟังก์ชั่น jQuery (ซึ่งฉันคิดว่าค่อนข้างคล้ายกันภายใต้ประทุน)
ขึ้นอยู่กับกิจกรรมที่เผยแพร่ดังนั้นหากคุณstopPropagation
อยู่ในเหตุการณ์ที่อื่นสิ่งนี้อาจไม่ทำงาน นอกจากนี้closest
ฟังก์ชั่นนี้ยังมีปัญหาความเข้ากันได้กับ IE อย่างชัดเจน
นี่อาจเป็นฟังก์ชั่นหากคุณจำเป็นต้องฟังการกระทำประเภทนี้ซ้ำ ๆ เช่น
function addChildEventListener(base, eventName, selector, handler) {
base.addEventListener(eventName, function(event) {
var closest = event.target.closest(selector);
if (closest && base.contains(closest)) {
// passes the event to the handler and sets `this`
// in the handler as the closest parent matching the
// selector from the target element of the event
handler.call(closest, event);
}
});
}
=========================================
แก้ไข: โพสต์นี้เดิมใช้matches
ฟังก์ชั่นสำหรับ องค์ประกอบ DOM บนเป้าหมายเหตุการณ์ แต่สิ่งนี้ จำกัด เป้าหมายของเหตุการณ์ไว้ที่คลาสโดยตรงเท่านั้น มันได้รับการปรับปรุงให้ใช้closest
ฟังก์ชั่นแทนช่วยให้เหตุการณ์ในเด็ก ๆ ของชั้นเรียนที่ต้องการเพื่อเรียกเหตุการณ์เช่นกัน matches
รหัสเดิมสามารถพบได้ที่ซอเดิม:
https://jsfiddle.net/u6oje7af/23/