2010-04-07 12 views
13

Tengo una etiqueta de anclaje <a class="next">next</a> hecha en un "botón". A veces, esta etiqueta debe ocultarse si no hay nada nuevo que mostrar. Todo funciona bien si simplemente oculto el botón con .hide() y lo vuelvo a visualizar con .show(). Pero quería utilizar .fadeIn() y .fadeOut() en su lugar.¿Cómo puedo "volver a vincular" el evento de clic después de desvincular ('clic')?

El problema que tengo es que si el usuario hace clic en el botón durante la animación fadeOut, puede causar problemas con la lógica que tengo al ejecutar el programa. La solución que encontré fue desvincular el evento de clic del botón después de que la función de clic original comienza, y luego volver a unirlo una vez que se completa la animación.

$('a.next').click(function() { 
    $(this).unbind('click'); 
    ... 
    // calls some functions, one of which fades out the a.next if needed 
    ... 
    $(this).bind('click'); 
} 

la última parte del ejemplo anterior no funciona. El evento click no se vuelve a vincular al delimitador. ¿Alguien sabe la forma correcta de lograr esto?

Soy un chico jquery autodidacta, por lo que algunos de los aspectos de nivel superior como unbind() y bind() están por encima de mi cabeza, y la documentación de jquery no es lo suficientemente simple como para que yo pueda entender.

Respuesta

15

me acaba de agregar una comprobación para ver si se anima primera:

$('a.next').click(function() { 
    if (!$(this).is(":animated")) { 
     // do stuff 
    } 
}); 
+0

Gracias nickf, Eso funcionó perfectamente. Pero todavía tengo curiosidad sobre cómo "volver a vincular" el evento click si alguien sabe. – Ben

6

Al volver a vincular el evento click, vas a empezar todo de nuevo. Debe proporcionar la función que tiene la intención de manejar los eventos. jQuery no los recuerda después de llamar "desvinculación".

En este caso particular, es un poco más complicado. El problema es que cuando inicias esas animaciones estás poniendo en movimiento una serie de acciones impulsadas por un temporizador. Por lo tanto, desvincular y volver a vincular el controlador de "clic" dentro del controlador de clic en sí realmente no ayudará a nada. Lo que sería ayuda (asumiendo que no se quiere resolver el problema con el truco is(":animated")) sería desvincular el controlador y luego volver a enlazar en la devolución de llamada "finalizada" de la animación.

Cuando se configura el "clic" manejador en el primer lugar, se puede separar la declaración de la función de la llamada a "Click()":

var handler = function() { 
    $(this).whatever(); 
}; 
$('a.next').click(handler); 

Luego, en caso de que terminan queriendo para desvincular/vincular, puede repetir esa llamada para "hacer clic" y referirse a la función "manejar" de la misma manera.

+0

Entiendo lo que dices, pero no sé cómo traducirlo en código. La función que quiero que ocurra es exactamente lo que solía ser el clic(). ¿Cómo codifico eso? – Ben

+0

Bueno, ¿cómo se "enlaza" el "clic" en primer lugar (antes de llamar "desvincular")? Oh, ya veo, ese * es * el manejador de clics. OK espera y editaré mi respuesta. – Pointy

+0

Creo que entiendo lo que dices.En su ejemplo anterior, "handler" es una función, y creo que cuando llama a una función necesita los paréntesis de apertura y cierre(). – Ben

2

Una solución más sencilla y corta

(sin utilizar el bind/método unbind)

es añadir una clase para el objeto si quieres desvincularla luego retire esta clase para volver a enlazar ex;

$('#button').click(function(){ 
    if($(this).hasClass('unbinded')) return; 
    //Do somthing 
}); 

$('#toggle').click(function(){ 
    $('#button').toggleClass('unbinded'); 
}); 
Cuestiones relacionadas