2009-09-22 5 views
2

Я работаю над выпадающим меню jQuery, которое исчезает, когда вы наводите верхние элементы верхнего уровня. Я хочу настроить его так, чтобы при перемещении мыши меню не исчезало мгновенно. У меня есть этот код:Затухание меню jQuery после задержки

$(document).ready(function(){ 
    $('ul#menu > li').hover(
    // mouseover 
    function(){ 
     $(this).find('>ul').fadeIn('fast'); 
    }, 
    // mouseout 
    function(){ 
     setTimeout(function(){ 
     alert('fadeout'); 
     $(this).find('>ul').fadeOut('fast') 
     }, 1000); 
    } 
); 
}); 

Через секунду происходит предупреждение, но меню не исчезает.

+0

Я просто думал, это могло быть, потому что «это» указывает на что-то еще внутри 'функции setTimeout'? – DisgruntledGoat

+0

Да, это правильно. Вы получаете окно. – user120242

+0

Вы можете использовать '.children ('ul')' вместо '.find ('> ul')' btw. –

ответ

3

window.setTimeout(), поэтому это относится к объекту окна.

// mouseout 
function(){ 
    var el=this; 
    setTimeout(function(){ 
    alert('fadeout'); 
    $(el).find('>ul').fadeOut('fast') 
    }, 1000); 
} 
+0

Решил пойти с решением, подобным этому, спасибо! – DisgruntledGoat

3

Посмотрите на hoverIntent. Это даст вам больший контроль над поведением mouseover/mouseout событий по конфигурации:

var config = {  
    sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)  
    interval: 200, // number = milliseconds for onMouseOver polling interval  
    timeout: 500, // number = milliseconds delay before onMouseOut  
}; 

$(document).ready(function(){ 
    $('ul#menu > li').hoverIntent(
    // mouseover 
    function(){ 
     $(this).find('>ul').fadeIn('fast'); 
    }, 
    // mouseout 
    function(){ 
     $(this).find('>ul').fadeOut('fast'); 
    } 
); 
}); 
+0

Это выглядит довольно круто, спасибо! У меня есть одна проблема: мне нужен тайм-аут, когда я полностью отхожу от меню, но если я перейду от одного пункта меню к следующему, я хочу немедленно отключить старое меню - это возможно? – DisgruntledGoat

+1

Используйте .stop (true, true): http://docs.jquery.com/Effects/stop – user120242

+0

Хм, не уверен, что это то, что мне нужно. Я имел в виду, что я хочу удалить задержку до появления каждого меню, если меню уже открыто. Таким образом, самый первый указатель мыши будет иметь небольшую задержку (чтобы предотвратить открытие меню при чистке). Но если меню открыто, переход в следующее меню будет отображаться мгновенно без задержки. – DisgruntledGoat