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.


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


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);

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.


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

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);

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

-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 ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.