webentwicklung-frage-antwort-db.com.de

Überschreiben von JQuery-Ereignishandlern

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

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

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

Also jetzt wird es offensichtlich 2 Mal alarmieren, aber ich brauche es nur einmal alarmieren. Versuchte so viele Möglichkeiten, aber kein Ergebnis.

Vielen Dank.

73
taras

Ab jQuery 1.7 sollten Sie off verwenden, um Event-Handler zu entfernen, und on , um sie hinzuzufügen, obwohl Sie weiterhin die Kurzform click verwenden können.

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

Ursprüngliche Antwort:

Wenn Sie alle Click-Handler ersetzen möchten, rufen Sie zunächst nbind 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);
130
tvanfosson

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

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

Solange kein anderer Code XXX verwendet, können Sie sicher sein, dass Sie kein anderes Verhalten durcheinander gebracht haben, von dem Sie nichts gewusst haben.

22
Neil Stevens

Sie können die jQuery-Funktion nbind 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
18
moff

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

$('#clickme').unbind('click', fireclick);
$('#clickme').click(fireclick);
3
Mark Renouf