Im Fall von delegierten Ereignishandlern, wo Sie etwas wie dieses haben könnten:
<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 Ihren 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 undefined
da der Inhalt des LI in eine Hülle aus <span>
was bedeutet, dass die <span>
wird wahrscheinlich das Ziel der Veranstaltung sein. Sie können dies mit einer kleinen Prüfung umgehen, etwa so:
$(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 es vorziehen, die Lesbarkeit zu maximieren (und auch unnötige Wiederholungen von jQuery-Wrapping-Aufrufen zu vermeiden):
$(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
});
});
Wenn Sie die Ereignisdelegation verwenden, wird die .is()
Methode ist von unschätzbarem Wert, wenn es darum geht, zu überprüfen, ob Ihr Ereignisziel (neben anderen Dingen) tatsächlich das ist, was Sie brauchen. Verwenden Sie .closest(selector)
um im DOM-Baum nach oben zu suchen, und verwenden Sie .find(selector)
(in der Regel gekoppelt mit .first()
wie in .find(selector).first()
), um es zu durchsuchen. Sie brauchen nicht zu verwenden .first()
bei Verwendung von .closest()
da es nur das erste übereinstimmende Vorgängerelement zurückgibt, während .find()
gibt alle passenden Nachfahren zurück.
26 Stimmen
Ihr Beispiel ist ein wenig merkwürdig. Sie sind ein Klick-Ereignis zu 'a' anhängen, aber haben keine Anker. Ändern Sie es zu $('input.title').click(...) wäre ein wenig klarer für zukünftige Leser Ihrer Frage sein.
3 Stimmen
Sie können verwenden
event.target.id
im Event-Handler, um die ID des Elements zu erhalten, das ein Ereignis ausgelöst hat.0 Stimmen
Sie können
event
als Argument in Ihrer Click-Callback-Funktion und verwenden Sie dannevent.target.id