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

Chcę, aby funkcja mouseenter miała stop() i opóźnienie o 1 sekundę. Tak więc, jeśli umieściłem kursor myszy nad #download, fadeIn powinien rozpocząć się po 1 sekundowym opóźnieniu. Jeśli jednak wyłączysz mysz, fadeIn nie powinien się uruchomić. Daj mi?opóźnienie() lub limit czasu z zatrzymaniem()?

Naprawdę nie wiem, jak to zrobić, jakieś pomysły?

+0

@ user239831 - Czy masz do tego zaległe pytanie? –

Odpowiedz

25

Musisz użyć setTimeout() w tym przypadku, ponieważ działa .delay() (i nie można go anulować).

$('.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.

Jeśli użyjesz .delay(), usuniesz kolejną animację elementu, , niezależnie od tego, czy wyczyściłeś tę kolejkę wcześniej:. Potrzebujesz więc limitu czasu, który możesz anulować ,, co oznacza, że ​​ręcznie dzwonisz pod numer setTimeout() i zapisujesz wynik za pomocą $.data(), dzięki czemu możesz go skasować później, poprzez clearTimeout().

+2

+1 Czyste i proste rozwiązanie. – Tomalak

+0

Doskonały. Jest to bardzo ważne w przypadku opóźnienia. Wciąż nie wiem, jak to anulować, co oznacza, że ​​powinien być używany bardzo ostrożnie. To był świetny sposób, aby sobie z tym poradzić. Dzięki. – Jake

+0

Witam. Próbuję to samo w [this jsFiddle] (http://jsfiddle.net/GZV5V/84/) dla 'slideDown()' i 'slideUp()', ale nie działa dobrze. Czy możesz mi powiedzieć, czego tu brakuje? Uwaga: Próbuję to zrobić bez użycia funkcji 'hoverIntent()'. – hims056

3

użycie funkcji 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 wykona kod wewnątrz funkcji Po podanym milisekund (w tym przypadku 1000).

+1

Musisz również zachować/wyzerować ten limit czasu, jeśli szybko i szybko umieścisz kursor myszy, to zakończy on działanie fadeOut() (jeśli działa w ogóle) w ciągu 200ms, a następnie 800ms później będzie mieć kolejkę fadeIn, nawet jeśli " nie przekraczaj tego elementu. Zobacz, co mam na myśli: http://jsfiddle.net/nick_craver/T9t6N/ Aby przetestować, szybko najedź kursorem i pozostaw link. –

0

można użyć tego na jquery bez użycia zdarzenia opóźnienia.

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

1000 to twój czas, po którym $ ("# download") zniknie.

4

szukałem odpowiedzi na podobne pytanie, i stwierdziliśmy, że .animate() może być również używany do obsługi tego, a ona słucha .Zatrzymaj()

będzie to wyglądać mniej więcej tak:

$('.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'); 
});