2009-09-22 74 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 2009-09-22 00:58:12

+0

是的,这是正确的。你正在看窗户。 – user120242 2009-09-22 01:18:44

+0

你可以使用'.children('ul')'而不是'.find('> ul')'顺便说一句。 – 2013-06-04 12:02:32

回答

3

window.setTimeout(),所以这指的是窗口对象。

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

决定采用类似于此的解决方案,谢谢! – DisgruntledGoat 2009-09-22 17:01:56

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 2009-09-22 01:42:13

+1

使用.stop(true,true):http://docs.jquery.com/Effects/stop – user120242 2009-09-22 02:01:17

+0

嗯,不知道这是我需要的。我的意思是,如果菜单已经打开,我想在每个菜单出现之前删除延迟。所以第一个鼠标悬停会有一个短暂的延迟(以防止刷过去时打开菜单)。但是,如果菜单打开,移动到下一个菜单将立即显示它没有延迟。 – DisgruntledGoat 2009-09-22 02:29:23