javascript - 带有 mouseenter 和 mouseleave 事件的菜单

标签 javascript jquery mouseevent

简介:
大家好。我正在尝试做一个菜单,但我遇到了 mouseenter/mouseleave 事件的问题。

我目前拥有的:

$("#icon").click(function() {
    $("#invis").css("display", "block");
    $("#icon").bind("mouseleave", function(){
        $("#invis").css('display', "none");
    }).bind("mouseenter", function(){
        $("#invis").css('display', "block"); 
    });
    $("#invis").bind("mouseleave", function(){
        $("#invis").css('display', "none");
    }).bind("mouseenter", function(){
        $("#invis").css('display', "block");
    });
});​  

到目前为止,我试过了。我的意思是点击“图标”,这个点击会显示一个菜单/另一个隐藏的元素。现在我想一直保持打开状态,因为有人将鼠标悬停在“图标”或实际菜单上。但是使用我提供的代码,一旦我离开鼠标然后再次输入“图标”,它仍然保持 onmouseenter 事件,并且菜单将再次出现。我知道我可以取消绑定(bind) onmouseenter 事件,但是一旦我离开菜单,进入图标,我的菜单就会关闭,我不希望这样。

我能想到的最简单的例子:http://jsfiddle.net/tzzqM/5/

问题
如何在单击事件时打开“菜单”,然后只要有人将鼠标悬停在菜单或“图标”(两者)上就保持打开状态。一旦鼠标离开两者的区域,菜单将关闭,要打开它,我需要再次单击“图标”。 还有其他方法吗?

最佳答案

鼠标离开对象时,检查鼠标是否仍在菜单上或菜单按钮上,如果没有,则隐藏菜单。基本上,您将事件 mouseleave 绑定(bind)到两个元素,然后检查选择的长度。如果它是 1,你要么在菜单上,要么在按钮上,这使得退出菜单按钮进入菜单本身,不会触发代码的“隐藏”部分,如果选择长度为 0,那么我们还没有结束任何这些元素,我们将其隐藏。

$("#icon").click(function() {
    $("#invis").css("display", "block");
        $("#invis,#icon").bind("mouseleave", function(){
            if($("#invis:hover,#icon:hover").length === 0){
                $("#invis").css('display', "none");
            }
        })
});​

有一把 fiddle here .

或者如果我必须从头开始(只是 jQuery 部分),我会写它的方式,因为请记住,您跳入 DOM 池的次数会更少,而且应该有一点效率更高一些,尽管它的功能与第一个一样。这是 fiddle

var icon = $("#icon"),
    menu = $("#invis");

icon.click(function() {
    menu.show();
        $.merge(icon,menu).bind("mouseleave", function(){
            if($("#icon:hover,#invis:hover").length < 1) menu.hide();
        });
});​

或者使用 jhummel 的建议,我们可以访问具有悬停的新 View 的 ID,并检查它是否是我们要监视的两个 View 之一。这很棒,因为它阻止我们再次跳入池中,这给了我们一个边际性能提升,这里是 fiddle .

var icon = $("#icon"),
    menu = $("#invis");

icon.click(function() {
    menu.show();
        $.merge(icon,menu).bind("mouseleave", function(e){
            if($.inArray(e.relatedTarget.id, ["icon","invis"]) === -1){
                   menu.hide();
            }
        });
});​


相关文档:

关于javascript - 带有 mouseenter 和 mouseleave 事件的菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13781053/

相关文章:

javascript - 范围和插入符位置不匹配

javascript - JQuery——有没有办法解决这个问题?

javascript - 显示工具提示 d3 中数据的内容

c# - 欺骗应用程序关于鼠标位置的信息

javascript - JSON.Stringify 方法替换参数不适用于嵌套对象

javascript - 如何管理 HTML 元素属性,最佳实践

javascript - 水平滚动功能的滚动动画

javascript - 如何将 HTML 页面下载为图像?

javascript - 如何解析来自 Bigquery 结果的 json 响应?

javascript - Ajax 发布响应返回空对象