Im Fall von delegierten Ereignishandlern, bei denen Sie möglicherweise Folgendes haben:
<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>
und Ihr JS-Code wie folgt:
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target),
itemId = $target.data('id');
//do something with itemId
});
});
Sie werden höchstwahrscheinlich feststellen, dass itemId ist undefined
, da der Inhalt des LI in a eingeschlossen ist <span>
, was bedeutet, dass das <span>
wahrscheinlich das Ereignisziel ist. Sie können dies mit einem kleinen Scheck umgehen, wie folgt:
$(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
});
});
Oder wenn Sie die Lesbarkeit maximieren möchten (und unnötige Wiederholungen von jQuery-Wrapping-Aufrufen vermeiden möchten):
$(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
});
});
Bei Verwendung der Ereignisdelegierung ist die .is()
Methode von unschätzbarem Wert, um zu überprüfen, ob Ihr Ereignisziel (unter anderem) tatsächlich das ist, was Sie benötigen. Verwenden Sie .closest(selector)
diese Option, um den DOM-Baum zu durchsuchen, und verwenden Sie ihn .find(selector)
(im Allgemeinen gekoppelt mit .first()
, wie in .find(selector).first()
), um ihn zu durchsuchen. Sie müssen es nicht .first()
verwenden .closest()
, da es nur das erste übereinstimmende Vorfahrenelement .find()
zurückgibt , während alle übereinstimmenden Nachkommen zurückgegeben werden.