Jak usunąć wszystkie programy obsługi zdarzeń kliknięcia za pomocą jQuery?

121

Mam problem. Zasadniczo, gdy użytkownik kliknie link „Edytuj” na stronie, uruchamiany jest następujący kod Jquery:

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

W ten sposób zdarzenie onClick przycisku zapisywania wywołuje saveQuestion()metodę i przekazuje identyfikator pytania, dla którego został kliknięty link „Edytuj”.

Ale jeśli w tej samej sesji użytkownik kliknie edytuj na 2 pytaniach, to zamiast nadpisać poprzednią clickprocedurę obsługi zdarzeń, spowoduje to uruchomienie 2 programów obsługi zdarzeń, z których jeden może wywołać, saveQuestion(1)a drugi może wywołać saveQuestion(2). W ten sposób jedno pytanie zastępuje drugie.

Czy istnieje sposób na usunięcie wszystkich poprzednich clickzdarzeń, które zostały przypisane do przycisku?

Kliknij opcję Głos za
źródło

Odpowiedzi:

203

Możesz użyć off (), aby usunąć takie wydarzenie:

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

ale spowoduje to usunięcie wszystkich kliknięć powiązanych z tym elementem. Jeśli funkcja z SaveQuestion jest jedynym powiązanym zdarzeniem, zrobi to powyższe. Jeśli nie, wykonaj następujące czynności:

$("#saveBtn").off("click").click(function() { saveQuestion(id); });
TStamper
źródło
31
Od wersji jQuery 1.7 należy używać włączania i wyłączania zamiast wiązania i rozpinania
Ralph Jansen.
@LockTar Czy możesz zasugerować, jak należy to napisać zamiast tego?
John Magnolia
@JohnMagnolia Zobacz moje zmiany powyżej.
Ralph Jansen
1
.addAttr ('onclick'); lub .removeAttr ('onclick');
Aliti,
13

Czy istnieje sposób na usunięcie wszystkich poprzednich kliknięć, które zostały przypisane do przycisku?

$('#saveBtn').unbind('click').click(function(){saveQuestion(id)});
Rafael
źródło
unbind()jest przestarzałe od wersji jQuery 3.0, a off()od 1.7.
Skylar Ittner
7
$('#saveBtn').off('click').click(function(){saveQuestion(id)});
Fo Nko
źródło
2

Jeśli użyłeś ...

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

... wtedy łatwiej będzie później rozpiąć.

Jarrett Meyer
źródło
1
Jak to sobie wyobrażasz? Bez względu na to, w jaki sposób zdarzenie elementu jest powiązane, zawsze można je odłączyć w ten sam sposób ... $ ('# saveBtn'). Unbind ('jakiekolwiek zdarzenia'); Teraz, aby PONOWNIE BIND ... tak, twoja technika może być łatwiejsza w pewnych okolicznościach.
KyleFarris
1
Jeśli usuniesz powiązanie wszystkich zdarzeń kliknięcia, nie będzie inaczej. Ale gdybyś chciał rozwiązać tylko jedną konkretną akcję, nie chciałbym przepisać tego zdarzenia w dwóch miejscach. I jak powiedziałeś, jeśli chcę to później zmienić, to znowu jest łatwiejsze, ponieważ nie muszę pisać funkcji po raz trzeci.
Jarrett Meyer
0
$('#saveBtn').off('click').on('click',function(){
   saveQuestion(id)
});

Zastosowanie jQuery jest wyłączone , a na

Ninjaneer
źródło