* Điều này đã được chỉnh sửa để cho phép trẻ em của lớp mục tiêu kích hoạt các sự kiện. Xem dưới cùng của câu trả lời để biết chi tiết. *
Một câu trả lời thay thế để thêm một người nghe sự kiện vào một lớp nơi các mục thường xuyên được thêm và xóa. Điều này được lấy cảm hứng từ on
chức năng của jQuery nơi bạn có thể chuyển qua bộ chọn cho một phần tử con mà sự kiện đang lắng nghe.
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
}
});
Câu đố: https://jsfiddle.net/u6oje7af/94/
Điều này sẽ lắng nghe các nhấp chuột vào base
phần tử con của phần tử và nếu mục tiêu của một nhấp chuột có cha mẹ khớp với bộ chọn, sự kiện lớp sẽ được xử lý. Bạn có thể thêm và xóa các thành phần tùy thích mà không cần phải thêm nhiều người nghe nhấp chuột vào các thành phần riêng lẻ. Điều này sẽ nắm bắt tất cả chúng ngay cả đối với các phần tử được thêm vào sau khi trình nghe này được thêm vào, giống như chức năng của jQuery (mà tôi tưởng tượng là hơi giống nhau dưới mui xe).
Điều này phụ thuộc vào sự kiện lan truyền, vì vậy nếu bạn stopPropagation
vào sự kiện ở nơi khác, điều này có thể không hoạt động. Ngoài ra, closest
chức năng có một số vấn đề tương thích với IE rõ ràng (những gì không?).
Điều này có thể được thực hiện thành một chức năng nếu bạn cần thực hiện loại hành động này nghe nhiều lần, như
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);
}
});
}
=========================================
EDIT: Bài đăng này ban đầu sử dụng matches
chức năng cho Các phần tử DOM trên mục tiêu sự kiện, nhưng điều này đã giới hạn các mục tiêu của sự kiện chỉ cho lớp trực tiếp. Nó đã được cập nhật để sử dụng closest
chức năng thay thế, cho phép các sự kiện trên trẻ em của lớp mong muốn cũng kích hoạt các sự kiện. matches
Mã ban đầu có thể được tìm thấy tại fiddle gốc:
https://jsfiddle.net/u6oje7af/23/