2010-09-14 29 views
5

Tôi đang sử dụng mã này vào trang web của tôi và tôi đã tự hỏi làm thế nào tôi có thể thêm một sự chậm trễ đến chức năng MouseLeaveThêm chậm trễ để MouseLeave trong 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)) 
       }) 

Trả lời

2

Bạn có thể sử dụng setTimeout() và một chức năng ẩn danh cho điều này:

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

Điều này sẽ trì hoãn 250ms sau khi thoát trước khi ẩn, bạn chỉ có thể điều chỉnh giá trị đó nếu cần.

+0

cảm ơn bạn thật tuyệt vời, bây giờ khi tôi di chuột qua một số khác thì có cách nào tôi có thể bỏ qua thời gian chờ đó không? –

+0

@Dustin - Vâng, nhưng tôi không thể nói chính xác như thế nào mà không thấy chức năng 'mouseenter' của bạn cho các phần tử khác, cần thêm một chút ngữ cảnh vào câu hỏi. –

+0

Tôi đã cập nhật mã với nhiều hơn cho bạn, nhờ sự giúp đỡ của bạn –

10

Sự cố chỉ với bộ hẹn giờ sẽ là nếu bạn di chuột sang trái và sau đó nhập lại nó sẽ vẫn ẩn sau khi bộ hẹn giờ đó hoàn tất. Một cái gì đó như sau có thể làm việc tốt hơn bởi vì chúng tôi có thể hủy bỏ bộ đếm thời gian bất cứ khi nào chuột vào mục tiêu.

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

Tôi hiểu ý bạn là gì, chỉ cần kiểm tra hàm đầu tiên và nó đã làm chính xác những gì bạn đã nói, bạn có thể trợ giúp không chỉnh sửa bài đăng đã chỉnh sửa của tôi để thực hiện thay đổi mà bạn đã đề xuất? –

+0

+1 cho logic hủy. Tôi nghĩ rằng nó có lẽ nên là '$ target.one (" hover ", function() ...' để loại bỏ sự kiện sau khi nó cháy. –

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

Hoạt động hoàn hảo. Có vẻ như giải pháp tốt nhất cho tôi :) Được đóng gói độc đáo cho jQuery , quá. Thumbs up! – EinLama

0

Bạn có thể sử dụng chức năng này tôi chỉ viết:

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

Nó hoạt động giống như bình thường $.hover trừ có sự chậm trễ 400ms trước khi sự kiện nghỉ chuột được gọi (bị hủy nếu bạn di chuyển chuột vào trong khung thời gian đó).

Các vấn đề liên quan