Wie entferne ich alle Klickereignishandler mit jQuery?


121

Ich habe ein Problem. Wenn ein Benutzer auf einer Seite auf den Link "Bearbeiten" klickt, wird grundsätzlich der folgende Jquery-Code ausgeführt:

$("#saveBtn").click(function () {
    saveQuestion(id);
});

Auf diese Weise ruft das Ereignis onClick der Schaltfläche Speichern die saveQuestion()Methode auf und gibt die ID der Frage weiter, für die auf den Link 'Bearbeiten' geklickt wurde.

Wenn der Benutzer jedoch in derselben Sitzung auf "Bearbeiten" für zwei Fragen klickt, werden anstelle des vorherigen clickEreignishandlers zwei Ereignishandler ausgeführt, von denen einer möglicherweise aufruft saveQuestion(1)und der andere möglicherweise aufruft saveQuestion(2). Auf diese Weise überschreibt eine Frage die andere.

Gibt es eine Möglichkeit, alle vorherigen clickEreignisse zu entfernen , die einer Schaltfläche zugewiesen wurden?

Antworten:


202

Sie würden off () verwenden , um ein Ereignis wie folgt zu entfernen:

$("#saveBtn").off("click");

Dadurch werden jedoch alle an dieses Element gebundenen Klickereignisse entfernt. Wenn die Funktion mit SaveQuestion das einzige gebundene Ereignis ist, wird dies von den oben genannten ausgeführt. Wenn nicht, gehen Sie wie folgt vor:

$("#saveBtn").off("click").click(function() { saveQuestion(id); });

31
Seit jQuery 1.7 sollten Sie Ein und Aus verwenden, anstatt zu binden und zu lösen
Ralph Jansen

@LockTar kannst du vorschlagen, wie dies stattdessen geschrieben werden soll?
John Magnolia

@ JohnMagnolia Siehe meine Änderungen oben.
Ralph Jansen

1
.addAttr ('onclick'); oder .removeAttr ('onclick');
Aliti

13

Gibt es eine Möglichkeit, alle vorherigen Klickereignisse zu entfernen, die einer Schaltfläche zugewiesen wurden?

$('#saveBtn').unbind('click').click(function(){saveQuestion(id)});

unbind()ist ab jQuery 3.0 veraltet und die Verwendung von off()wird seit 1.7 empfohlen.
Skylar Ittner

7
$('#saveBtn').off('click').click(function(){saveQuestion(id)});

2

Wenn Sie verwendet haben ...

$(function(){
    function myFunc() {
        // ... do something ...
    };
    $('#saveBtn').click(myFunc);
});

... dann ist es später einfacher, die Bindung aufzuheben.


1
Wie denkst du? Unabhängig davon, wie das Ereignis eines Elements gebunden ist, können sie immer auf dieselbe Weise ungebunden werden ... $ ('# saveBtn'). Unbind ('was auch immer Ereignis (e)'); Nun zum erneuten Binden ... ja, Ihre Technik kann unter bestimmten Umständen einfacher sein.
KyleFarris

1
Wenn Sie alle Klickereignisse aufheben, ist dies nicht anders. Aber wenn Sie nur eine bestimmte Aktion aufheben möchten, möchte ich dieses Ereignis nicht an zwei Stellen neu schreiben. Und wie Sie sagten, wenn ich es später erneut binden möchte, ist das wieder einfacher, da ich die Funktion nicht ein drittes Mal schreiben muss.
Jarrett Meyer

0
$('#saveBtn').off('click').on('click',function(){
   saveQuestion(id)
});

Verwenden Sie jquery's aus und an

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.