如何告诉 .hover() 等待?

IT技术 javascript jquery time hover settimeout
2021-03-16 17:56:04

我有一个下拉菜单。现在,当它下滑到多个级别时,我希望它在它消失之前增加大约 2 秒的等待时间,这样用户可以在他.hover()错误地打破时重新进入

是否可以?

我的幻灯片代码:

$('.icon').hover(function() {
        $('li.icon > ul').slideDown('fast');
    }, function() { 
        $('li.icon > ul').slideUp('fast');
    });
6个回答

这将使第二个函数在执行前等待 2 秒(2000 毫秒):

$('.icon').hover(function() {
    clearTimeout($(this).data('timeout'));
    $('li.icon > ul').slideDown('fast');
}, function() {
    var t = setTimeout(function() {
        $('li.icon > ul').slideUp('fast');
    }, 2000);
    $(this).data('timeout', t);
});

当用户重新悬停时,它还清除超时以避免疯狂行为。

然而,这不是一种非常优雅的方式。您可能应该查看hoverIntent插件,该插件旨在解决此特定问题。

@him056 您的 jsFiddle 存在范围问题。它在这里工作jsfiddle.net/671noauq
2021-04-29 17:56:04
这应该是第一个答案。
2021-04-30 17:56:04
你好。我在这个 jsFiddle 中slideDown()and尝试了同样的方法slideUp(),但slideUp()效果不佳。你能告诉我我在这里错过了什么吗?注意:我试图在不使用hoverIntent()函数的情况下做到这一点
2021-05-16 17:56:04
jquery 插件在typescript中表现不佳,所以这就是我的方式。
2021-05-18 17:56:04

我个人喜欢“hoverIntent”插件:

http://cherne.net/brian/resources/jquery.hoverIntent.html

来自页面:hoverIntent 是一个插件,它试图确定用户的意图......就像一个水晶球,只有鼠标移动!它的工作原理类似于(并且源自)jQuery 的内置悬停。但是,它不是立即调用 onMouseOver 函数,而是等待用户的鼠标速度足够慢,然后再进行调用。

为什么?延迟或防止意外触发动画或 ajax 调用。简单的超时适用于小区域,但如果您的目标区域很大,则无论意图如何,它都可以执行。

var config = {    
 sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)    
 interval: 200, // number = milliseconds for onMouseOver polling interval    
 over: makeTall, // function = onMouseOver callback (REQUIRED)    
 timeout: 500, // number = milliseconds delay before onMouseOut    
 out: makeShort // function = onMouseOut callback (REQUIRED)
};
$("#demo3 li").hoverIntent( config ) 

配置选项

灵敏度: 如果鼠标在轮询间隔之间移动的像素数少于此像素数,则将调用“over”函数。最小灵敏度阈值为 1 时,鼠标不得在轮询间隔之间移动。灵敏度阈值越高,您就越有可能收到误报。默认灵敏度:7

间隔: hoverIntent 在读取/比较鼠标坐标之间等待的毫秒数。当用户的鼠标第一次进入元素时,它的坐标被记录下来。最快可以在单个轮询间隔之后调用“结束”函数。将轮询间隔设置得更高会增加第一次可能的“过度”调用之前的延迟,但也会增加到下一个比较点的时间。默认间隔:100

过: 必须。您想调用 onMouseOver 的函数。您的函数接收与 jQuery 的悬停方法相同的“this”和“event”对象。

timeout: 在调用“out”函数之前的简单延迟,以毫秒为单位。如果用户在超时到期之前将鼠标移回元素上,则不会调用“out”函数(也不会调用“over”函数)。这主要是为了防止草率/人类鼠标轨迹暂时(和无意)使用户离开目标元素......让他们有时间返回。默认超时:0

出: 必须。您想调用 onMouseOut 的函数。您的函数接收与 jQuery 的悬停方法相同的“this”和“event”对象。注意,如果在同一次运行中调用了“over”函数,hoverIntent 只会调用“out”函数。

我使用了很多年,直到我意识到它对于像这个问题这样的案例来说太过分了。此线程中的手动代码示例工作正常。
2021-05-12 17:56:04

一般的想法是使用setTimeout,像这样:

$('.icon').hover(function() {
           $('li.icon > ul').slideDown('fast');
    }, function() { 
           setTimeout(function() {
                $('li.icon > ul').slideUp('fast');
           }, 2000);
    });

但是,如果用户先将鼠标移开然后又快速移入,这可能会违反直觉——当用户再次将鼠标悬停在它上面时,这并不能清除超时。那将需要额外的状态。

以下将阻止滑动触发 2 秒:

$('.icon').hover(function() {
  $('li.icon > ul').delay(2000).slideDown('fast');
}, function() { 
  $('li.icon > ul').slideUp('fast');
});
我认为这基本上实现了相反的效果:悬停动作不会立即触发,但必须悬停至少 2 秒才能发生任何事情。仍然有用,但不完全是问题的答案。我错了吗?
2021-05-03 17:56:04
$('.icon').on("mouseenter mouseleave","li.icon > ul",function(e){
   var $this = $(this);
   if (e.type === 'mouseenter') {
       clearTimeout( $this.data('timeout') );
       $this.slideDown('fast');
   }else{ // is mouseleave:
       $this.data( 'timeout', setTimeout(function(){
           $this.slideUp('fast');
       },2000) );  
   }
 });