¿Cómo eliminar todos los controladores de eventos de clic usando jQuery?

121

Tengo un problema. Básicamente, cuando un usuario hace clic en un enlace 'Editar' en una página, se ejecuta el siguiente código de Jquery:

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

Al hacer esto, el evento onClick del botón guardar llama al saveQuestion()método y transmite el ID de la pregunta para la que se hizo clic en el enlace 'Editar'.

Pero si en la misma sesión el usuario hace clic en editar en 2 preguntas, entonces, en lugar de sobrescribir el clickcontrolador de eventos anterior , hace que se ejecuten 2 controladores de eventos, uno que puede llamar saveQuestion(1)y el otro puede llamar saveQuestion(2). Al hacer esta pregunta, una pregunta sobrescribe la otra.

¿Existe alguna forma de eliminar todos los clickeventos anteriores que se han asignado a un botón?

Haga clic en Upvote
fuente

Respuestas:

203

Usaría off () para eliminar un evento como este:

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

pero esto eliminará todos los eventos de clic vinculados a este elemento. Si la función con SaveQuestion es el único evento vinculado, lo anterior lo hará. Si no, haga lo siguiente:

$("#saveBtn").off("click").click(function() { saveQuestion(id); });
TStamper
fuente
31
Desde jQuery 1.7, debe usar encendido y apagado en lugar de vincular y desvincular
Ralph Jansen
@LockTar, ¿puedes sugerir cómo se debería escribir esto en su lugar?
John Magnolia
@JohnMagnolia Vea mis cambios arriba.
Ralph Jansen
1
.addAttr ('al hacer clic'); o .removeAttr ('onclick');
Aliti
13

¿Existe alguna forma de eliminar todos los eventos de clic anteriores que se han asignado a un botón?

$('#saveBtn').unbind('click').click(function(){saveQuestion(id)});
Rafael
fuente
unbind()está obsoleto a partir de jQuery 3.0, y off()se ha recomendado su uso desde 1.7.
Skylar Ittner
7
$('#saveBtn').off('click').click(function(){saveQuestion(id)});
Fo Nko
fuente
2

Si usaste ...

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

... entonces será más fácil desvincularlo más tarde.

Jarrett Meyer
fuente
1
¿Cómo te imaginas? No importa cómo estén vinculados los eventos de un elemento, siempre se pueden desvincular de la misma manera ... $ ('# saveBtn'). Unbind ('cualquier evento (s)'); Ahora, para RE-BIND ... sí, su técnica puede ser más fácil en ciertas circunstancias.
KyleFarris
1
Si desvincula todos los eventos de clic, entonces no es diferente. Pero si solo quisiera desvincular una acción específica, no quisiera reescribir ese evento en dos lugares. Y como dijiste, si quiero volver a vincularlo más tarde, es más fácil hacerlo de nuevo, porque no tengo que escribir la función por tercera vez.
Jarrett Meyer
0
$('#saveBtn').off('click').on('click',function(){
   saveQuestion(id)
});

Uso de jQuery es fuera y en

Ninjaneer
fuente