¿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?

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

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

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

2

Si usaste ...

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

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.