2010-07-25 10 views
20
$('.file a').live('mouseenter', function() { 
    $('#download').stop(true, true).fadeIn('fast'); 
}).live('mouseleave', function() { 
    $('#download').stop(true, true).fadeOut('fast'); 
}); 

Quiero que la función mouseenter tenga un stop() y un retraso de 1 segundo. Por lo tanto, si se pasa el mouse sobre #download, el fadeIn debe iniciarse después de un retraso de 1 segundo. Si saco el mouse mientras tanto, el fadeIn no debería comenzar. ¿Consígueme?delay() o timeout con stop()?

Realmente no sé cómo hacer eso, ¿alguna idea?

+0

@ user239831 - ¿Tiene una pregunta pendiente sobre esto? –

Respuesta

25

Necesita usar setTimeout() en este caso debido a cómo funciona .delay() (y su incapacidad para cancelarlo).

$('.file a').live('mouseenter', function() { 
    $.data(this, 'timer', setTimeout(function() { 
     $('#download').stop(true, true).fadeIn('fast'); 
    }, 1000)); 
}).live('mouseleave', function() { 
    clearTimeout($.data(this, 'timer')); 
    $('#download').stop(true, true).fadeOut('fast'); 
}); 

You can give it a try here.

Si usa .delay(), dequeará la animación siguiente para el elemento, independientemente de si ha borrado esa cola anteriormente. Por lo tanto, necesita un tiempo de espera para que can cancelar, que lo anterior hace llamando manualmente al setTimeout() y almacenando el resultado con $.data() para que pueda borrarlo más tarde, a través de clearTimeout().

+2

+1 Solución limpia y directa. – Tomalak

+0

Excelente. Es muy importante acerca de la demora. Aún no sé cómo cancelar, lo que significa que debe usarse con mucho cuidado. Esta fue una gran manera de lidiar con eso. Gracias. – Jake

+0

Hola. Estoy intentando lo mismo en [este jsFiddle] (http://jsfiddle.net/GZV5V/84/) para 'slideDown()' y 'slideUp()', pero no funciona bien. ¿Puedes decirme qué me falta aquí? Nota: Estoy tratando de hacerlo sin usar la función 'hoverIntent()'. – hims056

3

utilizar una función setTimeout

$('.file a').live('mouseenter', function() { 
setTimeout(function(){ 
    $('#download').stop(true, true).fadeIn('fast'); 
}, 1000); 
}).live('mouseleave', function() { 
    $('#download').stop(true, true).fadeOut('fast'); 
}); 

setTimeout ejecutará el código dentro de la función después de los milisegundos especificado (en este caso 1000).

+1

También debe almacenar/borrar el tiempo de espera, si se desplaza hacia adentro y hacia afuera rápidamente, completará ese fadeOut() (si se ejecuta) en 200ms, luego 800ms más tarde tendrá un fadeIn en cola, aunque usted ' re no sobre el elemento. Eche un vistazo aquí para ver lo que quiero decir: http://jsfiddle.net/nick_craver/T9t6N/ Para probar, desplace rápidamente y deje el enlace. –

0

puede usar esto en jquery sin usar el evento de retraso.

$('.file a').hover(function() { 
    time = setTimeout(function() { 
    $('#download').fadeIn(); 
    },1000); 
},function(){ 
    clearTimeout(time); 
}); 

1000 es el tiempo que después de él $ ('# download') se desvanecerá.

4

que estaba buscando la respuesta a una pregunta similar y me encontré con que .animate() también podría ser utilizado para manejar esto, y que obedece a .Stop()

Se vería algo como esto:

$('.file a').live('mouseenter', function() { 
    $('#download') 
     .stop(true, true) 
     .animate({opacity:0}, 1000);   // one second delay 
     .animate({opacity:1}, 'fast', 'swing'); 
}).live('mouseleave', function() { 
    $('#download') 
     .stop(true, true) 
     .animate({opacity:0}, 'slow', 'swing'); 
});