4 Stimmen

Verwendung von .one() für einige noch nicht erstellte Elemente (wie bei .live())

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?

4voto

karim79 Punkte 333786

Ja, es gibt:

// Hinzugefügt in jQuery 1.7
// .one( events [, selector] [, data], handler(eventObject) )
$("div").one("click", "span", function (e) {
   $(this).hide(); 
});

1voto

Explosion Pills Punkte 182627

Genau wie .on

$("#to-bind-to").one('event-type', 'delegated-selector', eventFunction);

1voto

Linus Thiel Punkte 37466

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X