Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >实现一个hoverDelay延迟hover

实现一个hoverDelay延迟hover

作者头像
Tiffany_c4df
发布于 2019-09-04 08:21:02
发布于 2019-09-04 08:21:02
1.6K00
代码可运行
举报
文章被收录于专栏:前端小课堂前端小课堂
运行总次数:0
代码可运行

需求背景

经常在页面开发中,需要使用hover事件来触发相应的网络请求或页面DOM元素显示切换,需要考虑的问题就有了:

  • hover动作非常快,如果一hover就请求,会造成多余请求的浪费,造成后端接口不必要的压力
  • 如何判断这个用户hover是想做一定的操作,而不是鼠标误触
  • 构造这个hover延迟的时候,怎样封装才能通用使用

先来看一下效果演示:

<br> See the Pen <a href="https://codepen.io/AAA_TTT/pen/VorrpN/" target="_blank" rel="noopener">Vue.js | Mouseover &amp; Mouseleave</a> by AAA_TTT<br> (<a href="https://codepen.io/AAA_TTT" target="_blank" rel="noopener">@AAA_TTT</a>) on <a href="https://codepen.io" target="_blank" rel="noopener">CodePen</a>.<br>

问题思考

基于上述的问题,思考是如下:

  • 当用户hover停留在某一DOM元素上一定时长时,比如500ms,才认为这个用户是实际想要做某种操作,这时候在实际的进行相应的网络请求或页面DOM元素显示切换
  • 如果在500ms之前就移开,就算是用户误触误滑,不做任何处理
  • 构造hover通用封装时,采用jQuery的插件开发的方式,形成通用的解决方案

代码封装

基于jQuery的插件系统,实现的hoverDelay插件方法;在每次事件之前,清空所有的计时器,重新设置延时定时器,则进行相应操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @file: 鼠标滑动延迟执行的JQUERY扩展方法
 * @author: TiffanysBear
 *
 */
$.fn.hoverDelay = function (options) {
    var defaults = {
        hoverDuring: 200,
        outDuring: 200,
        hoverEvent: function () {
            $.noop();
        },
        outEvent: function () {
            $.noop();
        }
    };
    var sets = $.extend(defaults, options || {});
    var hoverTimer;
    var outTimer;
    return $(this).each(function () {
        $(this).hover(function () {
            clearTimeout(outTimer);
            hoverTimer = setTimeout(sets.hoverEvent, sets.hoverDuring);
        }, function () {
            clearTimeout(hoverTimer);
            outTimer = setTimeout(sets.outEvent, sets.outDuring);
        });
    });
};

代码使用

因为该方法是放在jQuery的原型方法上,因此所有jQuery对象都有这个方法可以使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$(this).hoverDelay({
    hoverDuring: 500,
    outDuring: 300,
    hoverEvent: function () {
        
    },
    outEvent: function () {
        
    }
});

后续思考

类似与Vue这种类似于MVVM框架的项目应该如何做hoverDelay呢?原理也是一致的;但是在细节的处理上有些不同,通过Vue绑定的 mouseovermouseleave对定时器进行设置和清理也能实现需求。

html结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.<div id="mouse">
  <a
    v-on:mouseover="mouseover"
    v-on:mouseleave="mouseleave">
    {{message}}
  </a>
</div>

css样式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
body {
  
  background: #333;
  
  #mouse {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    display: block;
    width: 280px;
    height: 50px;
    margin: 0 auto;
    line-height: 50px;
    text-align: center;
    color: #fff;
    background: #007db9;

    a {
      display: block;
      width: 100%;
      height: 100%;
      cursor: pointer;
    }
  }
}

JS代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new Vue({
  el: '#mouse',
  data: {
    message: 'Hover Me!' ,
    timer: null,
    hoverEnterTime: 500,
    hoverLeaveTime: 300
  }, 
  methods: {
    mouseover: function(){
      clearTimeout(this.timer);
      this.timer = setTimeout(() => {
        this.message = 'Good!'
      }, this.hoverEnterTime);
    },    
    mouseleave: function(){
      clearTimeout(this.timer);
      this.timer = setTimeout(() => {
        this.message = 'Hover Me!!'
      }, this.hoverEnterTime);
    }
  }
})

代码效果和功能演示

<br> See the Pen <a href="https://codepen.io/AAA_TTT/pen/VorrpN/" target="_blank" rel="noopener">Vue.js | Mouseover &amp; Mouseleave</a> by AAA_TTT<br> (<a href="https://codepen.io/AAA_TTT" target="_blank" rel="noopener">@AAA_TTT</a>) on <a href="https://codepen.io" target="_blank" rel="noopener">CodePen</a>.<br>

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript动画 —— 弹动动画
缓动和弹动都是那对象从已有位置移动到目标位置的方法。但是缓动是指物体滑动到目标点就停下来;而弹动是指物体来回反弹一段时间后,最终停在目标点的运动。
大师级码师
2021/09/19
1.7K0
Fisher–Yates shuffle 洗牌算法
简单来说 Fisher–Yates shuffle 算法是一个用来将一个有限集合生成一个随机排列的算法(数组随机排序)。这个算法生成的随机排列是等概率的。同时这个算法非常高效。
零式的天空
2022/03/28
9170
jquery改变链接移上光标时的颜色实例
效果体验http://hovertree.com/texiao/jquery/18/
全栈程序员站长
2022/07/15
1.3K0
8 个 DOM 功能
你肯定用 addEventListener() 处理过将事件附加到 Web 文档中的元素。通常 addEventListener() 调用看起来像这样:
疯狂的技术宅
2019/06/01
2K0
自定义 Tooltip 制作
事情的起因其实很简单。某天我在项目中给一个按钮加了个 title="删除该条记录",本以为万事大吉,结果设计师悠悠地飘过来说:“这个提示太丑了,能不能搞个像 Ant Design 那种 hover 提示?稍微延迟点,再漂亮点,别那么生硬。”我苦笑了一下,心里明白,这玩意是得自己撸一套 Tooltip 了。
繁依Fanyi
2025/05/09
1100
flask 鼠标进入时显示弹窗(flask 99)
$(function () { var default_error_message = 'Server error, please try again later.';
用户5760343
2019/08/21
1.1K0
QQ聊天插件,鼠标划入划出显示隐藏效果。
其中遇到了 mouse 事件的问题,可以参照:JQuery几个mouse事件的区别和用法
德顺
2019/11/13
1.3K0
QQ聊天插件,鼠标划入划出显示隐藏效果。
JavaScript动漫作品(闭幕)
原文链接:http://code.tutsplus.com/tutorials/javascript-animation-that-works-part-4-of-4–net-35263
全栈程序员站长
2022/07/06
1.2K0
uni-app/vue 结合element ui实现菜单分类导航(类似于小米商城首页的分类导航那种)
elementui文档地址 https://element.eleme.cn/#/zh-CN/component/installation
代码哈士奇
2021/10/25
1.6K0
uni-app/vue 结合element ui实现菜单分类导航(类似于小米商城首页的分类导航那种)
typecho 博客程序底部添加 跳动的鱼特效
用户9131103
2023/08/08
3580
JQuery实现图片切换(自动切换+手动切换)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/43342089
DannyHoo
2018/09/13
7.2K0
jq实现图像旋转木马:轮焦点+关于控制+自己主动旋转木马
打包下载:http://download.csdn.net/detail/u011043843/7994017
全栈程序员站长
2022/07/05
3.8K0
22.jQuery(实例)
1.开关灯效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .hide{ display: none; } </style> </head> <body> <input id="i1" type="button" value="开关" /> <div class="c
zhang_derek
2018/04/11
1.7K0
也许vue+css3做交互特效更简单
做项目就难免会开发交互效果或者特效,而我最近开发的项目一直在使用vue,开发技术栈方面,理所当然就使用了vue+css3开发,过程中发现使用vue+css3开发特效,和javascript/jquery+css3的思维方式不一样,但是比javascript/jquery+css3简单一点点。今天就分享三个简单的小实例,希望能起到拓展思维的作用,让大家明白vue+css3应该怎样开发交互效果!如果大家有什么好的建议,或者觉得我哪里写错了,欢迎指出!
守候i
2018/08/22
6490
也许vue+css3做交互特效更简单
改善应用程序性能和代码质量:通过代理模式组合HTTP请求
假设我们的产品具有一项功能,即每当用户单击 li 标记时,客户端都会向服务器发送一个HTTP请求。
张张
2021/04/08
4850
改善应用程序性能和代码质量:通过代理模式组合HTTP请求
又一个前端框架 - dagger.js
推荐一个轻量完备的开源前端框架:dagger.js:https://daggerjs.org
zz_jesse
2022/10/27
2.6K0
JS throttle与debounce的区别
一般在项目中我们会对input、scroll、resize等事件进行节流控制,防止事件过多触发,减少资源消耗;在vue的官网的例子中就有关于lodash的debounce方法的使用,当时也提到了throttle,但一直没搞明白节流 throttle 与 去抖 debounce具体区别在哪里,所以花了点时间来搞清楚。
前端下午茶
2018/10/22
2.9K0
JS throttle与debounce的区别
一颗红心,三手准备,分别基于图片(img)/SCSS(样式)/SVG动画实现动态拉轰的点赞按钮特效
    华丽炫酷的动画特效总能够让人心旷神怡,不能自已。艳羡之余,如果还能够探究其华丽外表下的实现逻辑,那就是百尺竿头,更上一步了。本次我们使用图片、SCSS样式以及SVG图片动画来实现“点赞”按钮的动画特效,并比较不同之处。
用户9127725
2022/09/28
1.4K0
一颗红心,三手准备,分别基于图片(img)/SCSS(样式)/SVG动画实现动态拉轰的点赞按钮特效
你不知道的 MutationObserver
在某些场景下,我们希望能监视 DOM 树的变动,然后做一些相关的操作。比如监听元素被插入 DOM 或从 DOM 树中移除,然后添加相应的动画效果。或者在富文本编辑器中输入特殊的符号,如 # 或 @ 符号时自动高亮后面的内容等。要实现这些功能,我们就可以考虑使用 MutationObserver API,接下来阿宝哥将带大家一起来探索 MutationObserver API 所提供的强大能力。
阿宝哥
2020/08/24
3.8K0
你不知道的 MutationObserver
写一个网页进度 loading
来自:简书 作者:jack_lo 原文:www.jianshu.com/p/4c93f5bd9861 loading随处可见,比如一个app经常会有下拉刷新,上拉加载的功能,在刷新和加载的过程中为了让用户感知到 load 的过程,我们会使用一些过渡动画来表达。最常见的比如“转圈圈”,“省略号”等等。 网页loading有很多用处,比如页面的加载进度,数据的加载过程等等,数据的加载loading很好做,只需要在加载数据之前(before ajax)显示loading效果,在数据返回之后(ajax co
顶级程序员
2018/05/03
2.7K1
相关推荐
JavaScript动画 —— 弹动动画
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验