2011-09-28 36 views
6

Busco una manera de desactivar un .toggle() unido a un divdesactivar un método jQuery .toggle()

if (condition) { 
    $("#div").toggle(
     function() { 
      do this 
     }, 
     function() { 
      do that 
     } 
    ); 
} 
else { 

    // How do I achieve this? 
    $("#div").disableToggle(

    ); 
} 

Más explicación:

Esta es una aplicación de mapas. El toggle en cuestión está vinculado a un botón de imagen. El mapa se carga a nivel de zoom 4. El usuario amplía y el botón en cuestión solo se activa cuando el usuario amplía más que el nivel de zoom 6. Una vez que el usuario reduce a menos del nivel 6, quiero que el botón de alternar vuelve a estar inactivo

+0

La mejor manera es para desenlazar los eventos 'click' que alternan añade. Publicaba una respuesta, pero ahora estoy fuera de tiempo. –

+0

Probablemente no deberías estar usando alternar() en este caso; toggle() utiliza un contador interno y es muy probable que se vuelva a usar el bork si intenta encenderlo y apagarlo. – Kato

+0

No es que intente apagar 'toggle()'. Es más como si quisiera deshabilitarlo en alguna condición. La aplicación depende de un cierto nivel de zoom del mapa. Solo con el zoom correcto, la palanca debe estar activa. Cuando el usuario se mueve fuera del rango del zoom, el botón de alternar debe desactivarse. – punkish

Respuesta

6

¿Por qué no desenlazar el clic?

$('#div').unbind('click'); 
+0

'toggle' no es un evento o un controlador de eventos. Es una función de conveniencia que realmente agrega' click' manipuladores. –

+1

Así que acabo de descubrir. Sin embargo, parece que la anulación del evento click funciona. http://jsfiddle.net/finbarr/gePha/ – Finbarr

+0

exactamente como mi primer comentario sobre la pregunta del OP dijo;) ~~ "La mejor manera es desvincular los eventos de clic que alternan agrega. Publicaba una respuesta, pero estoy fuera de tiempo en este momento ". La respuesta que actualmente no tengo tiempo para publicar (técnicamente estoy trabajando) iba a eliminar específicamente ese controlador de eventos en particular. Tu respuesta los elimina a todos. Para muchos proyectos, ese método draconiano está bien, así que elevé tu respuesta. Agregaría una advertencia, aunque señale que esto eliminará los controladores * all * click. –

3

Se puede poner condition dentro de la función:

$("#div").toggle(
    function() { 
     if (condition) { 
      //do this 
     } 
    }, 
    function() { 
     if (condition) { 
      //do that 
     } 
    } 
); 
1

Si no estaban de paso a funciones anónimas toggle(), se puede utilizar la técnica descrita on this forum post para desenlazar los eventos.

+0

lamentablemente, no funciona. Activa el alternar, pero la desvinculación no ocurre. – punkish

3

Puede utilizar .cleanData():

// this will destroy all data bound to that element 
$.cleanData($("#div")); 

Demo.

+0

Su código de demostración no parece hacer nada. Además, ¿qué se supone que significa esa sintaxis? –

+0

@Ben Lee: comente la última declaración y haga clic en los divs volverá a funcionar. Mata el 'toggle()'. – karim79

+0

¿Está CleanData documentado en algún lugar? Lo estoy buscando en Google, pero no puedo encontrar una página que explique lo que se supone que debe hacer. –

2

Aquí está una manera:

Retire la clase que se ha seleccionado para alternar. Violín aquí: http://jsfiddle.net/leifparker/rSP34/2/

HTML

<div class="button_toToggle"> Toggle it! </div> 
<div class="button_disableToggle"> Disable Toggle </div> 
<div class="happyDiv togglable">&nbsp;</div> 

JS

$('.button_toToggle').click(function(){ 
    $('.togglable').toggle(); 
}); 
$('.button_disableToggle').click(function(){ 
    $('.happyDiv').removeClass('togglable'); 
});