如何延迟jquery悬停事件

时间:2015-10-15 06:42:07

标签: javascript jquery html css

我正在尝试延迟jquery悬停事件。 下面的代码是我正在使用的代码。

bytes[]

我尝试将其更改为以下代码无效。

$(document).ready(function(){

        $('ul.tabs li').hover(function(){
            var tab_id = $(this).attr('data-tab');

            $('ul.tabs li').removeClass('current');
            $('.tab-content').removeClass('current');

            $(this).addClass('current');
            $("#"+tab_id).addClass('current');
        })

    })

这是我的HTML代码

 var delay=1000, setTimeoutConst;
    $('ul.tabs li').on('hover', function() {
         setTimeoutConst = setTimeout(function(){
               var tab_id = $(this).attr('data-tab');

        $('ul.tabs li').removeClass('current');
        $('.tab-content').removeClass('current');

        $(this).addClass('current');
        $("#"+tab_id).addClass('current');

         }, delay);
    }, function(){
         clearTimeout(setTimeoutConst );

      });

我仍然是jquery的初学者所以我不知道该怎么做。 一些帮助将有所帮助。 感谢

2 个答案:

答案 0 :(得分:2)

使用on('hover')是一个坏主意,您应该使用.hover()on('mouseenter')on('mouseleave')

下面的代码对我有用,请注意你不能在超时函数中使用this,将id存入变量会解决这个问题。

如果鼠标在延迟过期之前离开,我假设您要取消超时,这就是我删除mouseleave上的超时的原因。

http://jsfiddle.net/k4wm1jr5/19/

var delay=1000, setTimeoutConst;
var tab_id, tab_id_this;

$(document).on("mouseenter", "ul.tabs li", function() {
     console.log("MOUSEENTER");
     tab_id = $(this).attr('data-tab');
     tab_id_this = $(this).attr('id');
     setTimeoutConst = setTimeout(function(){
               //Do whatever you like here
               //your code would be approximate like this:

               $('ul.tabs li').removeClass('current');
               $('.tab-content').removeClass('current');

               $("#"+tab_id_this).addClass('current');
               $("#"+tab_id).addClass('current');
      }, delay);
});
$(document).on("mouseleave", "ul.tabs li", function() {
    clearTimeout(setTimeoutConst );
});

on('hover')是一个坏主意,因为:

  

在jQuery 1.8中不推荐使用,在1.9中删除:名称“hover”用作   字符串“mouseenter mouseleave”的简写。它附单   这两个事件的事件处理程序,处理程序必须检查   event.type,用于确定事件是mouseenter还是mouseleave。   不要将“hover”伪事件名称与.hover()方法混淆,   它接受一个或两个功能。

请参阅documentation

答案 1 :(得分:0)

我会使用$.hoverDelay() plugin来做到这一点。它允许您配置' in'的延迟。和' out'像这样的事件:

$('ul.tabs li').hoverDelay({
  delayIn: 200,
  delayOut:700,
  handlerIn: function($element){
    $element.css({backgroundColor: 'red'});  
  },
  handlerOut: function($element){
    $element.css({backgroundColor: 'auto'});  
  }
});