2009-04-12 13 views
68

Ich werde versuchen, das Problem mit einem einfachen Code zu erklären.Wie überschreiben jquery Event Handler

var fireClick = function() { alert('Wuala!!!') }; 

$('#clickme').click(fireclick); 
$('#clickme').click(fireclick); 

So jetzt wird es offensichtlich 2 mal warnen, aber ich brauche es nur einmal zu warnen. Versucht so viele Wege, aber kein Ergebnis.

Danke.

+0

Können Sie einen Kontext angeben, wie der Aufruf zum Binden des Ereignisses zweimal auftritt? Vielleicht können Sie verhindern, dass der zweite Anruf die Funktionsweise Ihres Codes ändert. –

+1

Related: http://stackoverflow.com/questions/209029/best-way-to-remove-an-event-handler-in-jquery –

+17

Es ist, "Voila". :) –

Antwort

121

Ab jQuery 1.7 sollten Sie off verwenden, um Ereignishandler zu entfernen, und on, um sie hinzuzufügen, obwohl Sie immer noch die click Kurzschrift verwenden können.

$('#clickme').off('click').on('click', fireclick); 
$('#clickme').off().on('click', fireclick); 

Ursprüngliche Antwort:

Wenn Sie alle Klick-Handler zu ersetzen, rufen unbind zunächst ohne Funktionsargument. Wenn Sie alle Ereignishandler ersetzen möchten, geben Sie den Ereignistyp nicht an.

$('#clickme').unbind('click').click(fireclick); 
$('#clickme').unbind().click(fireclick); 
+1

Bah! Sie gewinnen, um den Anruf zu verketten, aber vielleicht verfeinern Sie Ihre Antwort so, dass nur der bestimmte Handler entfernt wird, der neu hinzugefügt wird? Also: $ ('# clickme'). Unbind ('click', fireclick) .click (fireclick) –

+4

Die Frage war "überschreiben jquery Eventhandler" - ich ging davon aus, dass er sie alle ersetzen wollte. Dazu muss er jedes Mal die Verbindung aufheben (weshalb ich den Aufruf für beide wiederholt habe) und kein Funktionsargument angeben. – tvanfosson

+3

Dies war definitiv der richtige Weg, um dies zu tun, wenn Sie die Frage beantwortet haben, also habe ich upvoted. Das heißt, ich glaube der "neue und verbesserte" Weg ist mit den on() und off() Methoden. Da diese Antwort das erste Google-Ergebnis für die Suche "jquery replace event handler" ist, kann es hilfreich sein, zu Ihrer Antwort hinzuzufügen. '$ ('# clickme'). off ('click'). on ('click', fireclick);' oder einfach '$ ('# clickme'). off ('click') .click (fireclick);' . – chucksmash

3

Ich würde versuchen, die zusätzlichen Anrufe zu beseitigen, aber kurz von tyhat Sie konnte jedes Mal diese beiden nennen stellen Sie sicher:

$('#clickme').unbind('click', fireclick); 
$('#clickme').click(fireclick); 
+0

Danke, es funktioniert jetzt :) – taras

18

Sie verwenden die jQuery-Funktion unbind die erste zu entfernen Ereignis:

var fireClick = function() { alert('Wuala!!!') }; 

$('#clickme').click(fireclick); 
$('#clickme').unbind('click', fireClick); // fireClick won't fire anymore... 
$('#clickme').click(fireclick); // ...but now it will 
-8

Sie sollten setInterval verwenden. Das Problem ist, dass nicht gleichzeitig zwei Warnmeldungen ausgegeben werden können. Zuerst muss man sich schließen erste oder die zweite auf dem Bildschirm nicht angezeigt werden können ...

+5

Haben Sie die Frage gelesen? – kapa

20

einen Namespace verwenden, um sicherzustellen, dass Sie nicht entfernen alle anderen Zuhörer:

$('#clickme').off('click.XXX').on('click.XXX', fireclick); 

Solange kein anderer Code verwendet XXX, können Sie sicher sein, dass Sie ein anderes Verhalten, das Sie nicht wussten, nicht durcheinander gebracht haben.