Como remover todos os manipuladores de eventos de clique usando o jQuery?

121

Estou com um problema. Basicamente, quando um usuário clica em um link 'Editar' em uma página, o seguinte código Jquery é executado:

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

Ao fazer isso, o evento onClick do botão Salvar chama o saveQuestion()método e transmite o ID da pergunta na qual o link 'Editar' foi clicado.

Mas se na mesma sessão o usuário clicar em editar em 2 perguntas, em vez de sobrescrever o clickmanipulador de eventos anterior , ele fará com que dois manipuladores de eventos sejam executados, um que pode chamar saveQuestion(1)e o outro pode chamar saveQuestion(2). Ao fazer isso, uma pergunta substitui a outra.

Existe uma maneira de remover todos os clickeventos anteriores que foram atribuídos a um botão?

Click Voto a favor
fonte

Respostas:

202

Você usaria off () para remover um evento como este:

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

mas isso removerá todos os eventos de clique vinculados a esse elemento. Se a função com SaveQuestion for o único evento vinculado, o acima será feito. Caso contrário, faça o seguinte:

$("#saveBtn").off("click").click(function() { saveQuestion(id); });
TStamper
fonte
31
Desde jQuery 1.7, você deve usar dentro e fora, em vez de ligar e unbind
Ralph Jansen
@ LockTar, você pode sugerir como isso deve ser escrito?
John Magnolia
@JohnMagnolia Veja minhas alterações acima.
Ralph Jansen
1
.addAttr ('onclick'); ou .removeAttr ('onclick');
Aliti
13

Existe uma maneira de remover todos os eventos de clique anteriores que foram atribuídos a um botão?

$('#saveBtn').unbind('click').click(function(){saveQuestion(id)});
Rafael
fonte
unbind()foi descontinuado a partir do jQuery 3.0 e o uso de off()é incentivado desde 1.7.
Skylar Ittner
7
$('#saveBtn').off('click').click(function(){saveQuestion(id)});
Fo Nko
fonte
2

Se você usou ...

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

... será mais fácil desvincular mais tarde.

Jarrett Meyer
fonte
1
Como você imagina? Não importa como o evento de um elemento seja vinculado, ele sempre poderá ser desvinculado da mesma maneira ... $ ('# saveBtn'). Unbind ('qualquer evento (s)'); Agora, para RE-BIND ... sim, sua técnica pode ser mais fácil em determinadas circunstâncias.
KyleFarris 5/05
1
Se você desassociar todos os eventos de clique, não será diferente. Mas se você quiser apenas desassociar uma ação específica, não gostaria de reescrever esse evento em dois lugares. E, como você disse, se eu quiser recolocá-lo mais tarde, é mais fácil fazê-lo, porque não preciso escrever a função pela terceira vez.
Jarrett Meyer
0
$('#saveBtn').off('click').on('click',function(){
   saveQuestion(id)
});

Use jquery é off e on

Ninjaneer
fonte