W przypadku obsługi zdarzeń delegowanych, gdzie możesz mieć coś takiego:
<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>
i twój kod JS tak:
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target),
itemId = $target.data('id');
//do something with itemId
});
});
Prawdopodobnie zauważysz, że itemId jest undefined, ponieważ zawartość LI jest owinięta w <span>, co oznacza, że <span>prawdopodobnie będzie to cel zdarzenia. Możesz obejść ten problem za pomocą małego czeku, takiego jak:
$(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
});
});
Lub, jeśli wolisz zmaksymalizować czytelność (a także uniknąć niepotrzebnego powtarzania wywołań zawijania jQuery):
$(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
});
});
Podczas korzystania z delegowania zdarzeń .is()metoda ta jest nieoceniona w celu sprawdzenia, czy cel zdarzenia (między innymi) jest faktycznie tym, czego potrzebujesz. Użyj, .closest(selector)aby wyszukać drzewo DOM i użyj .find(selector)(zwykle w połączeniu z .first(), jak w .find(selector).first()), aby przeszukać to drzewo . Nie musisz używać .first()podczas używania .closest(), ponieważ zwraca tylko pierwszy pasujący element przodka, podczas gdy .find()zwraca wszystkich pasujących potomków.