2010-09-14 9 views
5

Używam tego kodu w moim miejscu, a ja zastanawiałem się, w jaki sposób mogę dodać opóźnienie do funkcji mouseLeaveDodaj opóźnienie mouseLeave w jQuery

$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)) 
       }) 

Odpowiedz

2

Można wykorzystać setTimeout() i anonimowej funkcji tego:

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

To opóźniłoby to 250ms po opuszczeniu przed ukryciem, możesz po prostu dostosować tę wartość w razie potrzeby.

+0

dziękuję, że jest niesamowicie, teraz kiedy najecham na myszkę, drugi jest sposób, że mogę pominąć ten czas oczekiwania? –

+0

@Dustin - Tak, ale nie mogę powiedzieć, jak dokładnie bez zobaczenia funkcji 'mouseenter' dla innych elementów, potrzebuję nieco więcej kontekstu dodanego do pytania. –

+0

Zaktualizowałem kod z więcej dla ciebie, dzięki za pomoc –

10

Problem z zegarem byłby tylko wtedy, gdyby po lewej stronie myszy, a następnie ponownie wprowadzone, nadal będzie się ukrywać po zakończeniu tego czasu. Coś takiego jak poniżej może działać lepiej, ponieważ możemy anulować timer za każdym razem, gdy mysz wejdzie w cel.

var myTimer=false; 
$target.hover(function(){ 
    //mouse enter 
    clearTimeout(myTimer); 
}, 
function(){ 
    //mouse leave 
    var $tooltip=$("#"+this._tipid); 
    myTimer = setTimeout(function(){ 
     ddimgtooltip.hidebox($, $tooltip); 
    },500) 
}); 
+0

Widzę, co masz na myśli, po prostu przetestowałem pierwszą funkcję i zrobiłem dokładnie to, co powiedziałeś, czy możesz pomóc? edytować moje edytowane posty, aby wprowadzić sugerowaną zmianę? –

+0

+1 dla logiki anulowania. Myślę, że prawdopodobnie powinien to być '$ target.one (" hover ", function() ...' aby pozbyć się zdarzenia po jego uruchomieniu –

4
(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

+0

Działa doskonale.Jest to dla mnie najlepsze rozwiązanie :) Ładnie zapakowane dla jQuery , także. Kciuki w górę! – EinLama

0

Można użyć tej funkcji po prostu napisał:

$.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); 
    }); 
}; 

To działa jak normalny $.hover wyjątkiem jest 400ms opóźnienie przed wydarzeniem urlopu myszy jest call (który zostanie anulowany, jeśli ponownie włączysz mysz w tym przedziale czasowym).

Powiązane problemy