Добавить задержку в mouseleave в jquery - PullRequest
5 голосов
/ 14 сентября 2010

Я использую этот код на своем сайте, и мне было интересно, как я могу добавить задержку для функции отпускания мыши

$target.mouseenter(function(e){
                var $tooltip=$("#"+this._tipid)
                ddimgtooltip.showbox($, $tooltip, e)
            })
            $target.mouseleave(function(e){
             var $tooltip=$("#"+this._tipid);
             setTimeout(function() { ddimgtooltip.hidebox($, $tooltip); }, 4000);
            })

            $target.mousemove(function(e){
                var $tooltip=$("#"+this._tipid)
                ddimgtooltip.positiontooltip($, $tooltip, e)
            })
            if ($tooltip){ //add mouseenter to this tooltip (only if event hasn't already been added)
                $tooltip.mouseenter(function(){
                    ddimgtooltip.hidebox($, $(this))
                })

Ответы [ 4 ]

10 голосов
/ 14 сентября 2010

Проблема только с таймером будет в том случае, если вы щелкнете левой кнопкой мыши, а затем повторно введете его, он все равно будет скрыт после завершения этого таймера. Что-то вроде следующего может работать лучше, потому что мы можем отменить таймер всякий раз, когда мышь входит в цель.

var myTimer=false;
$target.hover(function(){
    //mouse enter
    clearTimeout(myTimer);
},
function(){
    //mouse leave
    var $tooltip=$("#"+this._tipid);
    myTimer = setTimeout(function(){
        ddimgtooltip.hidebox($, $tooltip);
    },500)
});
5 голосов
/ 27 мая 2011
(function($){
   $.fn.lazybind = function(event, fn, timeout, abort){
        var timer = null;
        $(this).bind(event, function(){
            timer = setTimeout(fn, timeout);
        });
        if(abort == undefined){
            return;
        }
        $(this).bind(abort, function(){
            if(timer != null){
                clearTimeout(timer);
            }
        });
    };
})(jQuery);


$('#tooltip').lazybind(
    'mouseout',
    function(){
        $('#tooltip').hide();
    },
    540,
    'mouseover');

http://www.ideawu.com/blog/2011/05/jquery-delay-bind-event-handler-lazy-bind.html

2 голосов
/ 14 сентября 2010

Вы можете использовать setTimeout() и анонимную функцию для этого:

$target.mouseleave(function(e){
 var $tooltip=$("#"+this._tipid);
 setTimeout(function() { ddimgtooltip.hidebox($, $tooltip); }, 250);
})

Это приведет к задержке на 250 мс после выхода, прежде чем оно будет скрыто, вы можете просто отрегулировать это значение по мере необходимости..

1 голос
/ 12 декабря 2014

Вы можете использовать эту функцию, которую я только что написал:

$.fn.hoverDelay = function(handlerIn, handlerOut, delay) {
    if(delay === undefined) delay = 400;
    var timer;
    this.hover(function(eventObject) {
        clearTimeout(timer);
        handlerIn.apply(this,eventObject);
    }, function(eventObject) {
        timer = setTimeout(handlerOut.bind(this, eventObject), delay);
    });
};

Она работает так же, как и обычная $.hover, за исключением того, что перед вызовом события отпускания мыши задерживается 400 мс (который отменяется при перемещенииВаша мышь вернулась в этот период).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...