如何延迟jquery悬停事件

how to delay a jquery hover event

本文关键字:jquery 悬停 事件 延迟 何延迟      更新时间:2023-09-26

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

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

我已经尝试将其更改为以下代码,但无济于事。

 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 );
      });
这是我的HTML代码
  <div class="container">
<ul class="tabs">
    <li class="tab-link current" data-tab="tab-1">Tab One</li>
    <li class="tab-link" data-tab="tab-2">Tab Two</li>
    <li class="tab-link" data-tab="tab-3">Tab Three</li>
    <li class="tab-link" data-tab="tab-4">Tab Four</li>
</ul>
<div id="tab-1" class="tab-content current">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
<div id="tab-2" class="tab-content">
     Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
<div id="tab-3" class="tab-content">
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
</div>
<div id="tab-4" class="tab-content">
    Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>

我仍然是jquery的初学者,所以我不知道该怎么做。一些帮助是有益的。由于

使用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"的简写。它附着一个这两个事件的事件处理程序,处理程序必须检查事件。键入以确定事件是mouseenter还是mouselleave。不要将"hover"伪事件名称与.hover()方法混淆,它接受一个或两个函数。

看到文档。

我将使用$. hoverdelay()插件来做到这一点。它允许您配置'in'和'out'事件的延迟,如下所示:

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