实现一个hoverDelay延迟hover

author: @TiffanysBear

需求背景

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

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

先来看一下效果演示:

See the Pen Vue.js | Mouseover & Mouseleave by AAA_TTT
(@AAA_TTT) on CodePen.

问题思考

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

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

代码封装

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

  1. /**
  2. * @file: 鼠标滑动延迟执行的JQUERY扩展方法
  3. * @author: TiffanysBear
  4. *
  5. */
  6. $.fn.hoverDelay = function (options) {
  7. var defaults = {
  8. hoverDuring: 200,
  9. outDuring: 200,
  10. hoverEvent: function () {
  11. $.noop();
  12. },
  13. outEvent: function () {
  14. $.noop();
  15. }
  16. };
  17. var sets = $.extend(defaults, options || {});
  18. var hoverTimer;
  19. var outTimer;
  20. return $(this).each(function () {
  21. $(this).hover(function () {
  22. clearTimeout(outTimer);
  23. hoverTimer = setTimeout(sets.hoverEvent, sets.hoverDuring);
  24. }, function () {
  25. clearTimeout(hoverTimer);
  26. outTimer = setTimeout(sets.outEvent, sets.outDuring);
  27. });
  28. });
  29. };

代码使用

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

  1. $(this).hoverDelay({
  2. hoverDuring: 500,
  3. outDuring: 300,
  4. hoverEvent: function () {
  5. },
  6. outEvent: function () {
  7. }
  8. });

后续思考

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

html结构:

  1. .<div id="mouse">
  2. <a
  3. v-on:mouseover="mouseover"
  4. v-on:mouseleave="mouseleave">
  5. {{message}}
  6. </a>
  7. </div>

css样式:

  1. body {
  2. background: #333;
  3. #mouse {
  4. position: absolute;
  5. top: 50%;
  6. left: 50%;
  7. transform: translate(-50%, -50%);
  8. display: block;
  9. width: 280px;
  10. height: 50px;
  11. margin: 0 auto;
  12. line-height: 50px;
  13. text-align: center;
  14. color: #fff;
  15. background: #007db9;
  16. a {
  17. display: block;
  18. width: 100%;
  19. height: 100%;
  20. cursor: pointer;
  21. }
  22. }
  23. }

JS代码:

  1. new Vue({
  2. el: '#mouse',
  3. data: {
  4. message: 'Hover Me!' ,
  5. timer: null,
  6. hoverEnterTime: 500,
  7. hoverLeaveTime: 300
  8. },
  9. methods: {
  10. mouseover: function(){
  11. clearTimeout(this.timer);
  12. this.timer = setTimeout(() => {
  13. this.message = 'Good!'
  14. }, this.hoverEnterTime);
  15. },
  16. mouseleave: function(){
  17. clearTimeout(this.timer);
  18. this.timer = setTimeout(() => {
  19. this.message = 'Hover Me!!'
  20. }, this.hoverEnterTime);
  21. }
  22. }
  23. })

代码效果和功能演示

See the Pen Vue.js | Mouseover & Mouseleave by AAA_TTT
(@AAA_TTT) on CodePen.

实现一个hoverDelay延迟hover的更多相关文章

  1. jquery实现一个标签图标hover到上面的时候显示tooltip

    设计图: 解决思路:1.在thumbnailbox.js这个插件中加入tags弹出框显示的内容,一开始让这些内容display:none; 然后再用css画出来一个三角形 实现方法: 知识点:Jque ...

  2. 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法

    [源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...

  3. JS实现类似QQ好友头像hover时显示资料卡的效果

    一.应用场景 鼠标hover弹出div,并且鼠标离开后不能马上隐藏,因为这个div上还有功能入口.比如: 鼠标经过好友列表中的好友头像时显示资料卡的效果 hover时显示二维码 二.实现 用如下这样一 ...

  4. 移动端:active,:hover无法很好触发动画的解决方案

    移动端:active,:hover无法很好触发动画的解决方案 1:问题环境: 用css3定义了一个动画,使用:hover伪类调用动画时在移动端不能很好的进行动画. 2:解决方案: 定义一个open类, ...

  5. 实现了一个百度首页的彩蛋——CSS3 Animation简介

    在百度搜索中有这样一个彩蛋:搜索“旋转”,“跳跃”,“反转”等词语,会出现相应的动画效果(搜索“反转”后的效果).查看源码可以发现,这些效果正是通过CSS3的animation属性实现的. 实现这个彩 ...

  6. 【Win 10应用开发】延迟共享

    延迟共享是啥呢,这么说吧,就是在应用程序打开共享面板选择共享目标时,不会设置要共享的数据,而是等到共享目标请求数据时,才会发送数据,而且,延迟操作可以在后台进行. 这样说似乎过于抽象,最好的诠释方法, ...

  7. ThreadPoolTimer -延迟执行, 周期执行

    介绍重新想象 Windows 8 Store Apps 之 线程池 通过 ThreadPoolTimer 实现延迟执行 通过 ThreadPoolTimer 实现周期执行 通过 ThreadPool ...

  8. Unity3D游戏开发初探—4.开发一个“疯狂击箱子”游戏

    一.预备知识—对象的”生“与”死“ (1)如何在游戏脚本程序中创建对象而不是一开始就创建好对象?->使用GameObject的静态方法:CreatePrimitive() 以上一篇的博文中的“指 ...

  9. iOS 分析一个支持GIF的UIImage扩展:SwiftGIF

    Github:https://github.com/bahlo/SwiftGif 这个extension代码不多,主要通过Apple的ImageIO框架进行解析GIF. 整个扩展最核心还是下面的函数, ...

随机推荐

  1. 关于Ad-hoc

    Ad-hoc是wifi的一个模式,依托普通无线局域网802.11家族.网络中所有结点的地位平等,无需设置任何的中心控制结点,省去了无线中介设备AP.比如一台电脑建立了一个网络,这个时候加入了两台电脑. ...

  2. linux管道和重定向

    管道 管道应该是等左边的程序执行完,才使用左边的程序的输出执行右边的程序. 但是在测试的时候,如果左边的程序无限循环且不等待的输出,那么左边的程序执行时右边的程序也会执行,个人感觉这是linux的机制 ...

  3. node.js 微信开发1-接入

    准备工作1 域名准备 无论是个人开发还是做公司项目域名都是必不可少的 前期我个人用过花生壳做个开发测试,挺好用的,就是现在要收费了,开通花生壳要收费,开通内网穿透要收费(为啥要内网穿透呢,因为微信接入 ...

  4. [LeetCode] 300. 最长上升子序列 ☆☆☆(动态规划 二分)

    https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/dong-tai-gui-hua-she-ji-fan ...

  5. awk 概述及常用方法总结

    awk 简介 awk是一个文本处理工具,通常用于处理数据并生成结果报告, awk的命名是它的创始人 Alfred Aho.Peter Weinberger和Brian Kernighan 姓氏的首个字 ...

  6. String.getBytes()方法中的中文编码问题

    得到一个操作系统默认的编码格式的字节数组.这表示在不同的操作系统下,返回的东西不一样! byte[] a= "中".getBytes() String.getBytes(Strin ...

  7. linux使用文本编辑器vi常用命令

    一:翻页 ctrl+u向上翻半页 ctrl+d   向下翻半页 ctrl+f/page up向上翻一页 ctrl+b/page on   向下翻一页 H光标移到当前页的第一个字符 M光标移到当前页的中 ...

  8. C++——构造和析构函数

    现在学习进入第三阶段,对c++要有更深入的学习,关于构造函数和析构函数这一块需要总结一下,来深刻理解这两个函数的意义. 什么是构造函数和析构函数呢呢?听着就很高大上,但是要从心里藐视它.就像自然万物有 ...

  9. centOS7 下 安装mysql8.x

    第一部分 CentOS7安装mysql1.1 安装前清理工作:1.1.1 清理原有的mysql数据库:使用以下命令查找出安装的mysql软件包和依赖包: rpm -pa | grep mysql 显示 ...

  10. 移动端自适应js

    window.addEventListener('resize', setHtmlFontSize) setHtmlFontSize(); function setHtmlFontSize() { v ...