Come rimuovere tutti i gestori di eventi di clic utilizzando jQuery?


121

Ho un problema Fondamentalmente, quando un utente fa clic su un collegamento "Modifica" su una pagina, viene eseguito il seguente codice Jquery:

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

In questo modo, l'evento onClick del pulsante di salvataggio richiama il saveQuestion()metodo e trasmette l'ID della domanda per la quale è stato cliccato il link "Modifica".

Ma se nella stessa sessione l'utente fa clic su Modifica su 2 domande, invece di sovrascrivere il clickgestore di eventi precedente , provoca invece l'esecuzione di 2 gestori di eventi, uno che potrebbe chiamare saveQuestion(1)e l'altro potrebbe chiamare saveQuestion(2). In questo modo 1 domanda sovrascrive l'altra.

C'è un modo per rimuovere tutti gli clickeventi precedenti che sono stati assegnati a un pulsante?

Risposte:


203

Dovresti usare off () per rimuovere un evento in questo modo:

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

ma questo rimuoverà tutti gli eventi di clic legati a questo elemento. Se la funzione con SaveQuestion è l'unico evento associato, lo farà quanto sopra. In caso contrario, procedi come segue:

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

31
Da jQuery 1.7, dovresti usare on e off invece di bind e unbind
Ralph Jansen

@ LockTar puoi suggerire come dovrebbe essere scritto invece?
John Magnolia

@ JohnMagnolia Vedi le mie modifiche sopra.
Ralph Jansen

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

13

C'è un modo per rimuovere tutti gli eventi di clic precedenti che sono stati assegnati a un pulsante?

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

unbind()è deprecato a partire da jQuery 3.0 e l'uso di off()è stato incoraggiato dalla 1.7.
Skylar Ittner,

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

2

Se hai usato ...

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

... allora sarà più facile sciogliersi in seguito.


1
Come immagini? Non importa come gli eventi di un elemento siano legati, possono sempre essere slegati allo stesso modo ... $ ('# saveBtn'). Unbind ('qualunque evento (i)'); Ora, per RE-BIND ... sì, la tua tecnica potrebbe essere più facile in determinate circostanze.
KyleFarris

1
Se svincoli tutti gli eventi clic, non è diverso. Ma se volessi svincolare solo un'azione specifica, non vorrei riscrivere quell'evento in due punti. E come hai detto, se voglio rileggerlo in seguito, è ancora più facile da fare, perché non devo scrivere la funzione una terza volta.
Jarrett Meyer

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

Usa jquery's off and on

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.