jQuery - 在悬停时使用.one()

时间:2011-01-09 10:29:03

标签: jquery

有没有办法让悬停功能只执行一次?这就是我目前正在尝试的事情:

$('#ask').live('hover', function() {

    $('#homesearch-after').hide(300);

    $.doTimeout( 300, function() {
        hideClosedSearchLink();
        showHomeSearch();
    });

});

但那不起作用。我怎么才能让这个悬停一次激活?

我尝试用.one和.bind改变.live ......导致虚无。

2 个答案:

答案 0 :(得分:11)

您已经自己回答,请使用.one()(不是.live())。

但正如lasseespeholt在评论中指出的那样,.hover()是绑定到mouseentermouseleave的简写,并且本身不是一个事件。

试试这个:

$('#ask').one('mouseenter', function() {

    $('#homesearch-after').hide(300);

    $.doTimeout( 300, function() {
        hideClosedSearchLink();
        showHomeSearch();
    });

});

如果仍然无效,请尝试使用好的“.hover()”,然后在完成后立即.unbind()

$('#ask').hover(function() {

    $('#homesearch-after').hide(300);

    $.doTimeout( 300, function() {
        hideClosedSearchLink();
        showHomeSearch();
    });

    // Again taking into account what lasseespeholt said
    $(this).unbind('mouseenter mouseleave')

});

答案 1 :(得分:8)

hover不是真正的event,而是一种速记方法,用于绑定两个事件mouseentermouseleave的处理程序,因此不适用于{{ 3}}(如图.one所示)。要复制hover的行为,你必须有两个只会触发一次的绑定,如下所示:

$("#foo").one("mouseenter mouseleave", function(e){
    $(this).toggleClass("bar");
});

以上内容与以下内容相同,但只触发一次:

$("#foo").hover(function(){
    $(this).toggleClass("bar");
});

如果您想在mouseentermouseleave上执行不同的操作,则需要绑定不同的处理程序:

$("#foo").one("mouseenter", function(e){
    $(this).addClass("bar").text("Over");
}).one("mouseleave", function(e){
    $(this).removeClass("bar").text("Out");
});

我可以从您的代码中读到的是,您只想绑定mouseenter事件,如下所示:

$('#ask').one('mouseenter', function() {
    $('#homesearch-after').hide(300);
    $.doTimeout( 300, function() {
        hideClosedSearchLink();
        showHomeSearch();
    });
});