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

Я хочу, чтобы функция mouseenter имела stop() и задержку в 1 секунду. Итак, если я нахожусь над #download, то fadeIn должен начинаться после 1 секунды задержки. Если я вытаскиваю, то fadeIn не должен запускаться. Поймай меня?Задержка() или таймаут с остановкой()?

Я действительно не знаю, как это сделать, любые идеи?

+0

@ user239831 - У вас есть выдающийся вопрос по этому вопросу? –

ответ

25

В этом случае необходимо использовать setTimeout() из-за того, как работает .delay() (и ваша неспособность отменить его).

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

Если вы используете .delay(), это приведет к деактивации следующей анимации для элемента, , независимо от того, была ли вы ранее убрана эта очередь. Поэтому вам нужен тайм-аут, который вы получите может отмените, что вышесказанное делает, вручную вызывая setTimeout() и сохраняя результат с $.data(), чтобы вы могли его очистить позже, через clearTimeout().

+2

+1 Чистое и прямолинейное решение. – Tomalak

+0

Отлично. Это очень важно в отношении задержки. Я до сих пор не знаю, как отменить, что означает, что его следует использовать очень осторожно. Это был отличный способ справиться с этим. Благодарю. – Jake

+0

Привет. Я пытаюсь сделать то же самое в [this jsFiddle] (http://jsfiddle.net/GZV5V/84/) для 'slideDown()' и 'slideUp()', но не работает хорошо. Не могли бы вы рассказать мне, что мне здесь не хватает? Примечание. Я пытаюсь сделать это, не используя функцию 'hoverIntent()'. – hims056

3

использовать функцию 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 будет выполнять код внутри функции после указанных миллисекунды (в данном случае 1000).

+1

Вам нужно сохранить/очистить этот тайм-аут, если вы быстро входите и выходите, он завершит это fadeOut() (если он вообще запущен) в 200 мс, а затем через 800 м с очередным fadeIn, не над элементом. Взгляните сюда, чтобы понять, что я имею в виду: http://jsfiddle.net/nick_craver/T9t6N/ Чтобы проверить, быстро наведите указатель мыши и оставьте ссылку. –

0

вы можете использовать это на jquery без использования события задержки.

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

1000 - это ваше время, когда после него $ ('# download') исчезнет.

4

Я искал ответ на подобный вопрос, и я обнаружил, что .animate() также может быть использован для обработки этого, и он подчиняется .stop()

Это будет выглядеть примерно так:

$('.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'); 
}); 
Смежные вопросы