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?

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

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

unbind()jest przestarzałe od wersji jQuery 3.0, a off()od 1.7.
Skylar Ittner

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

2

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

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

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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.