So überschreiben Sie JQuery-Ereignishandler

74

Ich werde versuchen, das Problem mit einem einfachen Code zu erklären.

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

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

Jetzt wird es natürlich zweimal alarmiert, aber ich brauche es nur einmal. Versuchte so viele Möglichkeiten, aber kein Ergebnis.

Vielen Dank.

Taras
quelle
Können Sie einen Zusammenhang angeben, wie der Aufruf zum Binden des Ereignisses zweimal auftritt? Vielleicht können Sie verhindern, dass der zweite Aufruf die Funktionsweise Ihres Codes ein wenig verändert.
Mark Renouf
1
Siehe auch
Crescent Fresh
19
Es ist "Voila". :)
Mark Allen
2
Bitte markieren Sie eine Antwort, wenn sie Ihre Frage zum Nutzen anderer Benutzer beantwortet, die möglicherweise auf diese Frage verweisen müssen.
Sayan

Antworten:

134

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

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

Ursprüngliche Antwort:

Wenn Sie alle Klick-Handler ersetzen möchten, rufen Sie zuerst unbind ohne Funktionsargument auf. Wenn Sie alle Ereignishandler ersetzen möchten, geben Sie den Ereignistyp nicht an.

$('#clickme').unbind('click').click(fireclick);
$('#clickme').unbind().click(fireclick);
Tvanfosson
quelle
1
Bah! Sie gewinnen für die Verkettung des Anrufs, verfeinern aber möglicherweise Ihre Antwort, sodass nur der bestimmte Handler entfernt wird, der erneut hinzugefügt wird? Also: $ ('# clickme'). Unbind ('click', Feuerklick) .click (Feuerklick)
Mark Renouf
4
Die Frage lautete "JQuery Event Handler überschreiben" - ich ging davon aus, dass er sie alle ersetzen wollte. Dazu muss er jedes Mal die Bindung aufheben (weshalb ich den Aufruf für beide wiederholt habe) und kein Funktionsargument angeben.
Tvanfosson
3
Dies war definitiv der richtige Weg, dies zu tun, als Sie die Frage beantworteten, also habe ich gestimmt. Trotzdem glaube ich, dass der "neue und verbesserte" Weg mit den Methoden on () und off () besteht. Da diese Antwort das erste Google-Ergebnis für die Suche "jquery replace event handler" ist, kann es hilfreich sein, Ihre Antwort zu ergänzen. $('#clickme').off('click').on('click', fireclick);oder einfach $('#clickme').off('click').click(fireclick);.
Chuckmash
@IamChuckB danke für das Update, das habe ich meiner Antwort hinzugefügt.
Tvanfosson
24

Verwenden Sie einen Namespace, um sicherzustellen, dass Sie keine anderen Listener entfernen:

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

Solange kein anderer Code verwendet wird XXX, können Sie sicher sein, dass Sie kein anderes Verhalten durcheinander gebracht haben, das Ihnen nicht bekannt war.

Neil Stevens
quelle
18

Sie können die jQuery-Funktion zum Aufheben der Bindung verwenden , um das erste Ereignis zu entfernen:

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

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

Ich würde versuchen, die zusätzlichen Anrufe zu eliminieren, aber kurz davor könnten Sie sicherstellen, dass Sie beide jedes Mal anrufen:

$('#clickme').unbind('click', fireclick);
$('#clickme').click(fireclick);
Mark Renouf
quelle
0
$(document).off('click', '#clickme').on('click', '#clickme', fireclick);
Hassan Ejaz
quelle
-11

Sie sollten setInterval verwenden. Das Problem ist, dass nicht zwei Warnungen gleichzeitig angezeigt werden können. Zuerst muss man zuerst schließen oder der zweite kann nicht auf dem Bildschirm erscheinen ...

LeroyV
quelle