在 JQuery 中隐藏有延迟的子菜单

Hiding sub menu with delay in JQuery

本文关键字:菜单 延迟 JQuery 隐藏      更新时间:2023-09-26

我有一个带有子菜单的菜单。当您单击菜单项时,子菜单将可见。当鼠标离开菜单时,子菜单将在 1 秒后隐藏。我想要的是,如果在 1 秒隐藏功能终止之前鼠标返回菜单。

这是我所做的:

js小提琴

.HTML

<ul>
    <li><span>Item</span></li>
    <li><span>Item</span>
        <ul>
            <li><span>Item2</span></li>
            <li><span>Item2</span></li>
            <li><span>Item2</span></li>
            <li><span>Item2</span></li>
        </ul>
    </li>
    <li><span>Item</span></li>
    <li><span>Item</span>
        <ul>
            <li><span>Item3</span></li>
            <li><span>Item3</span></li>
            <li><span>Item3</span></li>
            <li><span>Item3</span></li>
        </ul>
    </li>
</ul>

.CSS

body,htnl,ul{
    padding:0;
    margin:0;
}
ul {
    list-style:none;
    background:#ddd;
    overflow:hidden;
}
li{
    float:left;
    display:block;
    padding:3px 10px;
    margin:4px;
    background:#bbb;
}
ul ul{
    position:absolute;
    display:none;
    left:0;
}

jQuery

$("ul li").click(function(){
    $(this).find("ul").show();
}).parent().mouseleave(function(){
    setTimeout(function(){
        $("ul li").find("ul").hide();
    },1000);
}).parent().mouseenter(function(){
    $("ul li").stop(true,true);
});

您需要对超时进行一些引用,以后可以使用它来取消:

var timeout;
$("ul li").click(function(){
    $(this).find("ul").show();
}).parent().mouseout(function(){
    clearTimeout(timeout)
    timeout = setTimeout(function(){
        $("ul li").find("ul").hide();
    },1000);
}).mouseover(function(){
    clearTimeout(timeout)
});

编辑:鼠标悬停/退出而不是鼠标输入/离开,并在鼠标退出中添加clearTimeout(有助于在 1000 毫秒内多次点击)

小提琴 : http://jsfiddle.net/MnL6m/

将超时分配给变量并使用 clearTimeout。

var timeout;
$("ul li").click(function(){
    $(this).find("ul").show();
}).parent().mouseleave(function(){
    timeout = setTimeout(function(){
        $("ul li").find("ul").hide();
    },1000);
}).parent().mouseenter(function(){
    clearTimeout(timeout);
    $("ul li").stop(true,true);
});

写这个:

$("li ul").hide();

$("ul li").click(function(){
    $("li ul").hide();//added here
    $(this).find("ul").show();
}).parent().mouseleave(function(){......

在这里摆弄。