Tôi cho rằng câu hỏi của bạn là về phiên bản Event Delegation của .on
.
Trong JavaScript, hầu hết các sự kiện bubble trong hệ thống phân cấp DOM. Điều đó có nghĩa là, khi một sự kiện có thể bong bóng cháy cho một phần tử, nó sẽ phát tán lên DOM cho đến mức document
.
Cân nhắc đánh dấu cơ bản này:
<div>
<span>1</span>
<span>2</span>
</div>
Bây giờ chúng ta áp dụng đoàn sự kiện:
$('div').on('click', 'span', fn);
Các xử lý sự kiện được gắn hoàn toàn vào yếu tố div
. Vì số span
nằm trong số div
, bất kỳ lần nhấp nào trong các nhịp sẽ bong bóng lên đến số div
, kích hoạt trình xử lý nhấp chuột của div
. Tại thời điểm đó, tất cả những gì còn lại là kiểm tra xem event.target
(hay bất kỳ phần tử nào giữa mục tiêu và delegateTarget
) khớp với bộ chọn mục tiêu của đại biểu.
Hãy làm cho phức tạp hơn một chút:
<div id="parent">
<span>1</span>
<span>2 <b>another nested element inside span</b></span>
<p>paragraph won't fire delegated handler</p>
</div>
Logic cơ bản là như sau:
//attach handler to an ancestor
document.getElementById('parent').addEventListener('click', function(e) {
//filter out the event target
if (e.target.tagName.toLowerCase() === 'span') {
console.log('span inside parent clicked');
}
});
Mặc dù ở trên sẽ không phù hợp khi event.target
được lồng vào bên trong bộ lọc của bạn. Chúng ta cần một số logic lặp:
document.getElementById('parent').addEventListener('click', function(e) {
var failsFilter = true,
el = e.target;
while (el !== this && (failsFilter = el.tagName.toLowerCase() !== 'span') && (el = el.parentNode));
if (!failsFilter) {
console.log('span inside parent clicked');
}
});
Fiddle
chỉnh sửa: Cập nhật mã để phù hợp với chỉ các yếu tố hậu duệ như jQuery .on
làm.
Lưu ý: Các đoạn mã này nhằm mục đích giải thích, không được sử dụng trong thế giới thực. Trừ khi bạn không có kế hoạch để hỗ trợ IE cũ, tất nhiên. Đối với IE cũ, bạn cần phải thử nghiệm tính năng với addEventListener
/attachEvent
cũng như event.target || event.srcElement
và có thể một số điều khác như kiểm tra xem đối tượng sự kiện có được chuyển đến hàm xử lý hay có sẵn trong phạm vi toàn cục hay không. Rất may jQuery làm tất cả những gì liền mạch đằng sau hậu trường cho chúng tôi.=]
tốt đó là tất cả OK về jQuery và làm thế nào để sử dụng jQuery.on(), tôi quan tâm là nó có thể viết một đoạn mã tương tự chỉ trên JavaScript và DOM? –
@Zlatan Vâng. Mặc dù không sizzle nó, bạn sẽ không có nhiều lựa chọn phái đoàn ưa thích. Tôi sẽ thêm một ví dụ JS thuần túy. –
OK. Tôi nghĩ bạn có thể viết một ví dụ với: 'document.querySelector()' hoặc 'document.querySelectorAll()' :) –