2010-06-01 4 views
8

Ich habe eine Ajax-App, die Funktionen bei jeder Interaktion ausführen wird. Ich möchte meine Setup-Funktion jedes Mal ausführen können, damit der gesamte Setup-Code für diese Funktion gekapselt bleibt. Das mehrmalige Binden von Elementen bedeutet jedoch, dass der Handler mehr als einmal ausgeführt wird, was offensichtlich unerwünscht ist. Gibt es eine elegante Möglichkeit in jQuery, ein Element mehrfach zu binden, ohne dass der Handler mehr als einmal aufgerufen wird?Gibt es in jQuery eine Möglichkeit, einen Klick nur einmal zu binden?

Antwort

8

Sie könnten das Ereignis document mit der one() Funktion anhängen:

$(document).one('click', function(e) { 
    // initialization here 
}); 

Einmal ausgeführt, dieser Event-Handler wieder entfernt, so dass es wieder nicht laufen wird. Wenn Sie jedoch die Initialisierung benötigen, um vor das Click-Ereignis eines anderen Elements auszuführen, müssen wir uns etwas anderes überlegen. Die Verwendung von mousedown anstelle von click funktioniert dann möglicherweise, da das mousedown-Ereignis vor dem click-Ereignis ausgelöst wird.

+0

Sie vermissen ein ');' drin. – Ben

+0

Oh danke Ben, das reparieren ... –

+0

Wusste nicht von diesem. – DMin

12

Benutzer jQuery one Funktion wie Tom sagte, aber den Handler jedes Mal vor der Bindung wieder zu lösen. Es hilft, den Event-Handler einer Variablen zuzuweisen, anstatt eine anonyme Funktion zu verwenden.

var handler = function(e) { // stuff }; 

$('#element').unbind('click', handler).one('click', handler); 

//elsewhere 
$('#element').unbind('click', handler).one('click', handler); 

Sie können auch .unbind('click') tun alle Klick-Handler auf ein Element angebracht zu entfernen.

1

Die Antwort von Chetan Sastry ist, was Sie wollen. Im Grunde rufen Sie einfach ein $ (Element) .unbind (Ereignis); vor jedem Ereignis.

Also, wenn Sie eine Funktion wie loadAllButtonClicks() aufweisen, die enthält alle

$(element).on("click", function(){}); 

Methoden für jede Taste auf Ihrer Seite, und Sie laufen, dass jedes Mal, wenn eine Taste angeklickt wird, das offensichtlich mehr produzieren als Ein Ereignis für jede Schaltfläche. Um dies zu lösen fügen Sie einfach

$(element).unbind(event); 

vor jedem

$(element).on("click", function(){}); 

und es wird für alle Veranstaltungen an diesem Element lösen, dann die ein Klick-Ereignis.

2

Sie können auch .off() verwenden, wenn die Freigabe nicht funktioniert. Stellen Sie sicher, dass die Wähler und Ereignis gegeben .off genau mit denen übereinstimmen, zunächst vorgesehen .on():

$("div.selector").off("click", "a.another_selector");  
$("div.selector").on("click", "a.another_selector", function(e){ 

Dies ist, was für mich gearbeitet, um die gleiche Ajax bei der Lösung Nachladen Problem.

+0

Ich mag das, weil das $ (element) .unbind (event); Lösung würde alle Ereignisse des Typs (z. B. Klick) aus dem Element entfernen, während diese Methode nur die mit dem betreffenden Selektor verbundene Methode entfernt und andere anfügt, selbst wenn sie denselben Ereignistyp verwenden. –

Verwandte Themen