2010-09-14 22 views
5

Estoy usando este código en mi sitio y me preguntaba cómo podría añadir un retardo a la función mouseleavedemora a MouseLeave en 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)) 
       }) 

Respuesta

2

Puede utilizar setTimeout() y una función anónima para esto:

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

Esto lo retrasaría 250ms después de salir antes de que se oculte, solo puede ajustar ese valor según sea necesario.

+0

gracias eso es impresionante, ahora cuando mouseOver otra es que hay una manera que puedo omitir que el tiempo de espera? –

+0

@Dustin - Sí, pero no puedo decir cómo exactamente sin ver su función 'mouseenter' para los otros elementos, necesitan un poco más de contexto añade a la pregunta. –

+0

Actualicé el código con más para usted, gracias por su ayuda –

10

El problema con sólo un temporizador habría si izquierdo del ratón y luego volvió a entrar todavía ocultaría después de que el temporizador ha completado. Algo como lo siguiente podría funcionar mejor porque podemos cancelar el temporizador cada vez que el mouse ingresa al objetivo.

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

veo lo que quiere decir, simplemente puso a prueba la primera función y se hizo exactamente lo que dijo, me pueden ayudar edite mis publicaciones editadas para hacer el cambio que sugirió? –

+0

+1 para la lógica de cancelación. Creo que probablemente debería ser '$ target.one ("flotar", la función()' ... para deshacerse del evento después de que se dispara. –

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

funciona perfectamente. Parece que la mejor solución para mí :) Muy bien empaquetado para jQuery , también. ¡Pulgares hacia arriba! – EinLama

0

Puede utilizar esta función que acabo de escribir:

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

Funciona igual que la normal de $.hover excepto que hay un retraso de 400 ms antes del evento licencia ratón es llamado (que se cancela si mueve el mouse dentro de ese marco de tiempo).

Cuestiones relacionadas