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

Ich möchte die mouseenter Funktion eine stop() und eine Verzögerung von 1 Sekunde haben. Also, wenn ich schweben über #download sollte die fadeIn nach einer 1 Sekunde Verzögerung starten. Wenn ich mouse out sollte der fadeIn nicht starten. Fang mich?Verzögerung() oder Timeout mit Stop()?

Ich weiß nicht wirklich, wie man das macht, irgendwelche Ideen?

+0

@ user239831 - Haben Sie eine offene Frage zu diesem Thema? –

Antwort

25

Sie müssen in diesem Fall setTimeout() verwenden, weil .delay() funktioniert (und Ihre Unfähigkeit, es abzubrechen).

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

Wenn Sie .delay() verwenden, wird die nächste Animation für das Element entfernt, unabhängig davon, ob Sie diese Warteschlange früher gelöscht haben. Sie benötigen also eine Zeitüberschreitung, die Sie können Abbrechen, was das obige geschieht, indem Sie setTimeout() manuell aufrufen und das Ergebnis mit $.data() speichern, so dass Sie es später löschen können, über clearTimeout().

+2

+1 Saubere und unkomplizierte Lösung. – Tomalak

+0

Ausgezeichnet. Es ist sehr wichtig über die Verzögerung. Ich weiß immer noch keine Möglichkeit zu stornieren, was bedeutet, dass es sehr sorgfältig verwendet werden sollte. Das war eine großartige Möglichkeit, damit umzugehen. Vielen Dank. – Jake

+0

Hallo. Ich versuche das gleiche in [dieser jsFiddle] (http://jsfiddle.net/GZV5V/84/) für 'slideDown()' und 'slideUp()', aber funktioniert nicht gut. Kannst du mir bitte sagen, was fehlt mir hier? Hinweis: Ich versuche es zu tun, ohne die 'HoverIntent()' Funktion zu benutzen. – hims056

3

eine Funktion 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 verwenden wird, den Code innerhalb der Funktion nach dem angegebenen miliseconds (in diesem Fall 1000) auszuführen.

+1

Sie müssen dieses Zeitlimit auch speichern/löschen, wenn Sie schnell hinein- und hinausfahren, wird fadeOut() (wenn es überhaupt läuft) in 200ms abgeschlossen, dann haben Sie 800ms später ein fadeIn in der Warteschlange, auch wenn Sie nicht über das Element. Schau hier, um zu sehen, was ich meine: http://jsfiddle.net/nick_craver/T9t6N/ Um zu testen, schnell schweben und den Link verlassen. –

0

können Sie dies auf jQuery ohne Verzögerung Ereignis verwenden.

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

1000 ist Ihre Zeit, die es nach $ ('# download') verblassen wird.

4

Ich war für die Antwort auf eine ähnliche Frage suchen, und ich fand, dass .animate() könnte auch verwendet werden, um dies zu handhaben, und es gehorcht .stop()

Es ist etwas würde wie folgt aussehen:

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