Dans le cas des gestionnaires d'événements délégués, où vous pourriez avoir quelque chose comme ceci:
<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>
et votre code JS comme ceci:
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target),
itemId = $target.data('id');
//do something with itemId
});
});
Vous constaterez très probablement que itemId l'est undefined
, car le contenu du LI est enveloppé dans un <span>
, ce qui signifie que ce <span>
sera probablement la cible de l'événement. Vous pouvez contourner cela avec un petit chèque, comme ceci:
$(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
});
});
Ou, si vous préférez maximiser la lisibilité (et éviter également la répétition inutile d'appels de jQuery wrapping):
$(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
});
});
Lorsque vous utilisez la délégation d'événements, la .is()
méthode est inestimable pour vérifier que votre cible d'événement (entre autres) est réellement ce dont vous avez besoin. Utilisez .closest(selector)
pour rechercher dans l'arborescence DOM et utilisez .find(selector)
(généralement couplé avec .first()
, comme dans .find(selector).first()
) pour le rechercher. Vous n'avez pas besoin de l'utiliser .first()
lors de l'utilisation .closest()
, car il ne renvoie que le premier élément ancêtre correspondant, tandis que .find()
renvoie tous les descendants correspondants.