jQuery's One - Einmaliges Löschen mit mehreren Ereignistypen

7

Gemäß den Dokumenten für one :

  

Wenn das erste Argument mehrere durch Leerzeichen getrennte Ereignistypen enthält, wird der Ereignishandler einmal für jeden Ereignistyp aufgerufen.

Gibt es eine Möglichkeit, eine einzelne Funktion einmal auszulösen, wenn ein Ereignis ausgelöst wird?

Beispiel:

%Vor%

Ich möchte die Funktion nur einmal aufrufen, unabhängig davon, welches Ereignis ausgelöst wurde.

Derzeit wird die Funktion für jeden Ereignistyp einmal ausgelöst.

Demo in Geige

  

Hinweis : Ich suche hier nicht nach dem focus -Ereignis ... dies ist nur ein Beispiel.

    
KyleMit 05.07.2014, 17:55
quelle

4 Antworten

14

Anstatt .one zu verwenden, verwenden Sie .on und entfernen Sie die Bindung manuell mit .off .

%Vor%

Geige: Ссылка

Dies kann etwas eleganter mit Namespaces gemacht werden:

%Vor%

Dadurch können wir einen einzelnen Bezeichner (foo) verwenden, um eine beliebige Anzahl von Bindungen zu entfernen, und wir werden keine anderen mouseup- oder keyup-Bindungen beeinflussen, die das Element haben könnte.

Geige: Ссылка

    
Mooseman 05.07.2014, 17:57
quelle
7

Tolle Antworten! Um sie in eine Funktion einzubinden, folgt hier eine jQuery-Erweiterung, die auf den aktuellen Antworten basiert:

%Vor%

Dann ruf so an:

%Vor%

Demo in Geige

  

Bonus : Dies hat den zusätzlichen Vorteil, dass nur die Handler für diese spezielle Funktion getrennt werden, indem Original-Handler für die Off-Funktion . Andernfalls benötigen Sie benutzerdefinierte Namespaces.

Zusätzlich Wenn Sie möchten, dass ein Handler nur einmal auslöst, sobald eines der Elemente eines der Ereignisse auslöst und sich dann sofort löst, entfernen Sie einfach each aus der Erweiterung like das:

%Vor%     
KyleMit 05.07.2014 18:08
quelle
2

Sie könnten einfach $('input').off(); am Ende Ihrer Funktion hinzufügen.

    
Grim... 05.07.2014 17:57
quelle
1

Um einmal zu feuern und weiterzuschießen, kann das folgende Snippet verwendet werden:

Ссылка

%Vor%

Dies funktioniert, indem die Ereignisse vorübergehend mit der Funktion internalCallback deaktiviert und asynchron ( setTimeout ) wieder aktiviert wird.

Die meisten anderen Vorschläge in diesem Thread deaktivieren alle zukünftigen Ereignisse auf dem Ziel. Während OP mit früheren Antworten zufrieden scheint, erwähnt seine Frage nicht die permanente Deaktivierung von Ereignissen.

    
Kafoso 31.03.2016 10:34
quelle

Tags und Links