Dalam hal penangan acara yang didelegasikan, di mana Anda mungkin memiliki sesuatu seperti ini:
<ul>
<li data-id="1">
<span>Item 1</span>
</li>
<li data-id="2">
<span>Item 2</span>
</li>
<li data-id="3">
<span>Item 3</span>
</li>
<li data-id="4">
<span>Item 4</span>
</li>
<li data-id="5">
<span>Item 5</span>
</li>
</ul>
dan kode JS Anda seperti itu:
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target),
itemId = $target.data('id');
//do something with itemId
});
});
Anda kemungkinan besar akan menemukan itemId itu undefined
, karena konten LI dibungkus dengan a <span>
, yang berarti <span>
mungkin akan menjadi target acara. Anda dapat menyiasatinya dengan cek kecil, seperti:
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target).is('li') ? $(event.target) : $(event.target).closest('li'),
itemId = $target.data('id');
//do something with itemId
});
});
Atau, jika Anda lebih suka memaksimalkan keterbacaan (dan juga menghindari pengulangan panggilan pembungkus jQuery yang tidak perlu):
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target),
itemId;
$target = $target.is('li') ? $target : $target.closest('li');
itemId = $target.data('id');
//do something with itemId
});
});
Saat menggunakan delegasi acara, .is()
metode ini sangat berharga untuk memverifikasi bahwa target acara Anda (antara lain) sebenarnya adalah apa yang Anda inginkan. Gunakan .closest(selector)
untuk mencari pohon DOM, dan gunakan .find(selector)
(umumnya ditambah dengan .first()
, seperti pada .find(selector).first()
) untuk mencari ke bawah. Anda tidak perlu menggunakan .first()
saat menggunakan .closest()
, karena hanya mengembalikan elemen leluhur yang cocok pertama, sementara .find()
mengembalikan semua keturunan yang cocok.