如何取消绑定()悬停/鼠标悬停事件?

How to unbind() a hover/ mouseover event?

我的想法很简单。我有一个由 3 个项目的无序列表组成的菜单栏。每个项目都有一个与标题一致的图像。我用 Photoshop 编辑了每个图标的 'active' 版本。每次悬停 list-item 时,我都希望 img 的 src 更改为 'active' 图标。但我也希望 'active' 图标在单击后保持不变。

我对它应该如何编写有一个大概的了解,但我之前从未使用过 bind() 或 unbind()

我想知道正确的写法:

function nav_handler() {
    $(".nav_services").hover(function() {
        var src = $(".nav_services img").attr("src", "files/img/services2.png");
        $(".nav_services").mousedown(function() {
            $(this).unbind(hover);
        });
    }, function() {
        var src = $(".nav_services img").attr("src", "files/img/services.png");
    });
};

我认为这个问题不需要 HTML 或 CSS,但如果您需要,我会 post。这是 3 个 类(列表项)中的 1 个的示例,所以我不知道您是否可以使用它的 parent 并使用 children() 并更改基于悬停或单击 child 的 return 值的图标,但这会更有帮助。


更新

好的,所以我正确使用了unbind,但是列表项中img的src只会改变一次。这意味着如果我一次单击所有这些,则 src 只会更改一次。这是我目前使用的完整功能:

function beta_handler() {
//Hover for Nav-item #1 (Services)
$(".nav_services").hover(function () {
    var src = $(".nav_services img").attr("src", "files/img/services2_active.png");
    $(".nav_services").mousedown(function () {
        if ($(".nav_home").hasClass("nav_active")) {
            $(".nav_home").removeClass("nav_active");
            var src = $(".nav_home img").attr("src", "files/img/home2.png")
            $(this).addClass("nav_active");
            //$(this).unbind("hover");
            $(this).unbind("mouseenter mouseleave");
        }
        else if ($(".nav_contact").hasClass("nav_active")) {
            $(".nav_contact").removeClass("nav_active");
            var src = $(".nav_contact img").attr("src", "files/img/contact2.png")
            $(this).addClass("nav_active");
            //$(this).unbind("hover");
            $(this).unbind("mouseenter mouseleave");
        }
    });
}, function () {
    var src = $(".nav_services img").attr("src", "files/img/services2.png");
});
//Hover for Nav-item #2 (Home)
$(".nav_home").hover(function () {
    var src = $(".nav_home img").attr("src", "files/img/home2_active.png");
    $(".nav_home").mousedown(function () {
        if ($(".nav_services").hasClass("nav_active")) {
            $(".nav_services").removeClass("nav_active");
            var src = $(".nav_services img").attr("src", "files/img/services2.png")
            $(this).addClass("nav_active");
            //$(this).unbind("hover");
            $(this).unbind("mouseenter mouseleave");
        }
        else if ($(".nav_contact").hasClass("nav_active")) {
            $(".nav_contact").removeClass("nav_active");
            var src = $(".nav_contact img").attr("src", "files/img/contact2.png")
            $(this).addClass("nav_active");
            //$(this).unbind("hover");
            $(this).unbind("mouseenter mouseleave");
        }
    });
}, function () {
    var src = $(".nav_home img").attr("src", "files/img/home2.png");
});
//Hover for Nav-item #3 (Contact)
$(".nav_contact").hover(function () {
    var src = $(".nav_contact img").attr("src", "files/img/contact2_active.png");
    $(".nav_contact").mousedown(function () {
        if ($(".nav_services").hasClass("nav_active")) {
            $(".nav_services").removeClass("nav_active");
            var src = $(".nav_services img").attr("src", "files/img/services2.png")
            $(this).addClass("nav_active");
            //$(this).unbind("hover");
            $(this).unbind("mouseenter mouseleave");
        }
        else if ($(".nav_home").hasClass("nav_active")) {
            $(".nav_home").removeClass("nav_active");
            var src = $(".nav_home img").attr("src", "files/img/home2.png")
            $(this).addClass("nav_active");
            //$(this).unbind("hover");
            $(this).unbind("mouseenter mouseleave");
        }
    });
}, function () {
    var src = $(".nav_contact img").attr("src", "files/img/contact2.png");
});
};

Working Demo

取消绑定方法应该这样调用(将事件名称作为字符串传递):

$(this).unbind("hover");

有关更多示例,请阅读手册:.unbind()

hover函数其实是一种快捷方式。它绑定 mouseentermouseleave。要删除绑定,您需要取消绑定这两个事件 (demo):

$('button').hover(function(){
    $(this).addClass('red');
}, function(){
    $(this).removeClass('red');
}).click(function(){
    $(this).unbind('mouseenter mouseleave');
});

更新:您尝试做的所有事情都可以仅使用 CSS 来完成 (demo) - 无需使用 javascript/jQuery.

使事情复杂化

HTML

<div id="nav_container">
    <ul>
        <li class="nav_services"><i></i>SERVICES</li>
        <li class="nav_home nav_active"><i></i>HOME</li>
        <li class="nav_contact"><i></i>CONTACT</li>
    </ul>
</div>

CSS

#nav_container li {
    background: #fff;
    border-color: #b6b5ba;
}
#nav_container li:hover {
    background: #dfdeff;
}
#nav_container li.nav_active {
    background-color: #cecdf6;
}
#nav_container i {
    background-position: center center;
    background-repeat: no-repeat;
    background-size: cover;
    width: 40px;
    height: 40px;
    display: inline-block;
    vertical-align: top;
}
.nav_services i {
    background-image: url(https://cdn4.iconfinder.com/data/icons/ionicons/512/icon-ios7-cog-outline-128.png);
}
.nav_services.nav_active i, .nav_services:hover i {
    background-image: url(https://cdn4.iconfinder.com/data/icons/ionicons/512/icon-ios7-cog-128.png);
}
.nav_home i {
    background-image: url(https://cdn4.iconfinder.com/data/icons/ionicons/512/icon-ios7-contact-outline-128.png);
}
.nav_home.nav_active i, .nav_home:hover i {
    background-image: url(https://cdn4.iconfinder.com/data/icons/ionicons/512/icon-ios7-contact-128.png);
}
.nav_contact i {
    background-image: url(https://cdn4.iconfinder.com/data/icons/ionicons/512/icon-ios7-telephone-outline-128.png);
}
.nav_contact.nav_active i, .nav_contact:hover i {
    background-image: url(https://cdn4.iconfinder.com/data/icons/ionicons/512/icon-ios7-telephone-128.png);
}
#nav_container {
    width: 70%;
    margin: 20px 0 0 15%;
    height: 40px;
    background-color: #ffffff;
    border: 1px #b6b5ba solid;
    border-radius: 2px;
}
#nav_container ul {
    width: 100%;
    height: 100%;
    padding: 0;
    margin: 0;
    display: table;
    table-layout: fixed;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
#nav_container li {
    font-family: Calibri, Verdana;
    display: table-cell;
    line-height: 40px;
    list-style-type: none;
    font-size: 18px;
    text-align: center;
    cursor: pointer;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
.nav_services {
    border-right: 1px #dedede solid;
}
.nav_home {
    border-left: 1px #dedede solid;
    border-right: 1px #dedede solid;
}
.nav_contact {
    border-left: 1px #dedede solid;
}

更新 2:我不确定你的标签系统是如何工作的,但你需要一些脚本来添加或删除 nav_active class 名称:

$(function () {
    $('#nav_container li').click(function () {
        $(this)
            .addClass('nav_active')
            .siblings()
            .removeClass('nav_active');
    });
});