Gibt es eine Möglichkeit, one()
mit Ereignisdelegation zu verwenden? ähnlich wie on()
oder live()
, damit es auf DOM-Elemente angewendet wird, die zum Zeitpunkt der Bindung nicht erstellt wurden?
Antworten
Zu viele Anzeigen?Ja. Von den jQuery .one()
Dokumenten:
Die beiden anderen Formen, die in jQuery 1.7 eingeführt wurden, sind identisch mit .on(), außer dass der Handler nach dem ersten Auftreten des Ereignisses am delegierten Element entfernt wird, egal ob der Selektor etwas übereinstimmt oder nicht. Zum Beispiel:
$("#foo").one("click", function() {
alert("Dies wird nur einmal angezeigt.");
});
$("body").one("click", "#foo", function() {
alert("Dies wird angezeigt, wenn #foo das erste ist, was im Body angeklickt wird.");
});
Nachdem der Code ausgeführt wurde, wird ein Klick auf das Element mit der ID foo den Alert anzeigen. Nachfolgende Klicks werden nichts tun.
Dies bedeutet, dass, wenn Sie die Form $(el).one('click', '.selector', handler)
verwenden, es wie live
funktionieren wird - der Event-Handler ist an el
gebunden (das im DOM existieren muss), aber der Event-Handler wird nur bei Klicks auf .selector
ausgeführt, unabhängig davon, ob das Element während Ihres Aufrufs von .one()
existiert.
Bearbeiten: Es scheint, dass die Dokumentation von jQuery dazu falsch ist - zumindest, so wie ich es interpretiere. Laut dem alert
oben,
"Dies wird angezeigt, wenn #foo das erste ist, was im Body angeklickt wird."
Dies lässt mich denken, dass wenn etwas anderes im Body erstens angeklickt wird, der Event-Handler entfernt wird und nicht erneut ausgelöst wird. Dies ist nicht der Fall - der Event-Handler wird existieren, bis #foo
einmal angeklickt wird.
Siehe diese Fiddle für eine Demonstration.