2009-06-02 10 views
8

tengo una función jquery que al hacer clic produce un tiempo de espera establecido al hacer visible un div.finaliza una función setTimeout antes de su hora configurada

Sin embargo, si se selecciona otra opción durante la duración del tiempo de ajuste, me gustaría saber cómo destruir esta función y agachar cualquier otra cosa que ocurra.

mi código actual es:

$(document).ready(function(){ 

$('li#contact').click(function() { 
     $('ul.image_display').css('display', 'none'); 
     $('ul.projects').fadeOut().hide(); 
     $('li#cv').removeClass('cur'); 
     $('li#projects').removeClass('cur'); 
     $('li#contact').addClass('cur'); 
     $('ul.contact').fadeIn(function() 
         { 
         setTimeout(function() 
         { 
         $('ul.contact').fadeOut('slow'); 
         }, 8000); 
         }); 
     setTimeout(function() { 
      $('li#contact').removeClass('cur'); 
      $('li#cv').addClass('cur'); 
      $('ul.projects').fadeIn('slow'); 
      $('ul.image_display').css('display', 'block'); 
      }, 8625); 

}); 

}); 

un poco engorroso, pero funciona hasta que esto se hace clic en:

$(document).ready(function(){ 

$('#projects').click(function() { 
     $('li#cv').removeClass('cur'); 
     $('ul.contact').fadeOut().hide(); 
     $('#contact').removeClass('cur'); 
     $('ul.projects').fadeIn('slow'); 
     $('#projects').addClass('cur'); 
     $('ul.image_display').css('display', 'block'); 
}); 

}); 

si el segundo se hace clic justo después de la primera de 'act' clase todavía aparece en li # cv después del tiempo establecido.

¿Tiene esto sentido !!!! ????

Espero que sí!

+0

Sé que el código es una mierda, pero todavía soy nuevo en esta jquery malarkey. – DanC

+0

por cierto setTimeout es una función javascript nada que ver con jQuery (con respecto a su título) :) –

+0

que tal vez por qué no pude encontrar nada en los documentos jquery al respecto! Cheers dude – DanC

Respuesta

18

La función setTimeout devuelve un identificador a ese tiempo de espera. A continuación, puede cancelar ese tiempo de espera con la función clearTimeout. Así que usted puede hacer algo como esto (llene los espacios en blanco con su código):

var timer; 
$(function() { 
    $(...).click(function() { 
     ... 
     timer = setTimeout(...); 
     ... 
    }); 

    $(...).click(function() { 
     clearTimeout(timer); 
    }); 
}); 

Sin embargo, no es particularmente muy limpio para mantener una variable global para esto,. Puede almacenar el temporizador en el atributo data de cualquier elemento que tenga más sentido para su situación. Algo como esto:

$(function() { 
    $(...).click(function() { 
     ... 
     var timer = setTimeout(...); 
     $(someelement).data('activetimer', timer); 
     ... 
    }); 

    $(...).click(function() { 
     var timer = $(someelement).data('activetimer'); 
     if(timer) { 
      clearTimeout(timer); 
      $(someelement).removeData('activetimer'); 
     } 
    }); 
}); 

Realmente no aspecto más limpio, pero es una forma alternativa para almacenar el temporizador ...

+0

lo siento, ¿podría elaborar un poco para mí? ¿Dónde iría esto en el código? – DanC

+1

Cuando establece el tiempo de espera, guarde el valor de retorno de setTimeout en una variable, en el ejemplo, "timer". Cuando desee finalizarlo, puede llamar a clearTimeout() en "timer", que simplemente cancelará el evento inminente. No hará que el evento Timeout suceda antes de tiempo, simplemente hará que nunca suceda, por lo que también deberá programar una forma de que el código que ingresó al Timeout se ejecute de otra manera. – Hober

+0

¡Impresionante! esto funciona genial! ¡Salud por la ayuda! – DanC

3

Usted puede utilizar clearTimeout() de hacer eso. Necesitará mantener el valor devuelto desde setTimeout() en una variable para pasar al clearTimeout().

+0

genial, ¡salud para la ayuda! – DanC

Cuestiones relacionadas