JS鼠标3次点击事件实现代码及扩展思路


Posted in Javascript onSeptember 12, 2017

这几天看了一下JavaScript高级程序设计中的Dom事件相关内容,同时看到网上有关鼠标多次点击事件,鼠标事件是简单、常用的事件之一,于是便针对点击事件进行一些小的扩展和实现,增强对Dom事件的进一步理解。其中的实现和思路是自己总结的,有什么不对的地方还请大神们交流指正。

1、制作一个通用的事件处理模块(原生实现)

以下实现基于AMD定义模块方式:

/**
 * 浏览器兼容事件处理组件
 */
define(function () {
  var EventUtil = {
    // 添加事件监听
    addHandler: function (element, type, handler) {
      if (element.addEventListener) {
        element.addEventListener(type, handler, false);// DOM2级事件
      } else if (element.attachEvent) {
        element.attachEvent('on' + type, handler);// DOM2级IE事件
      } else {
        element['on' + type] = handler;// DOM0级事件
      }
    },
    // 移除事件监听
    removeHandler: function (element, type, handler) {
      if (element.removeEventListener) {
        element.removeEventListener(type, handler, false);
      } else if (element.detachEvent) {
        element.detachEvent('on' + type, handler);
      } else {
        element['on' + type] = null;
      }
    },
    // 获取事件对象
    getEvent: function (event) {
      return event ? event : window.event;
    },
    // 获取事件的目标元素
    getTarget: function (event) {
      return event.target || event.srcElement;
    },
    // 禁止事件默认行为
    preventDefault: function (event) {
      if (event.preventDefault) {
        event.preventDefault();
      } else {
        event.returnValue = false;
      }
    },
    // 禁止事件冒泡
    stopPropagation: function (event) {
      if (event.stopPropagation) {
        event.stopPropagation();
      } else {
        event.cancelBubble = true;
      }
    }
  };

  return EventUtil;
});

2、鼠标3击事件实现

鼠标点击事件涉及的事件及执行触发顺序:

mousedown:鼠标任意键按下时触发

mouseup:释放鼠标按钮时触发

click:单击

mousedown

mouseup

dblclick:双击

显然,click是依赖dblclick的,可以考虑根据这两个事件实现鼠标3次连续点击触发执行,设计触发dblclick后监听click事件,如果在短时间内触发了click事件,则构成鼠标连续点击3次的效果,具体实现如下源码: 

<div> 
  <button id="button">鼠标3击</button> 
</div>

js 代码

require(['eventUtil'], function (EventUtil) {
  var button = document.getElementById('button');

  click3Event(button, function (event) {
    console.log('3 click');
  });

  // 鼠标3击事件
  function click3Event(dom, fn) {
    var handler = function (event) {
      var event = EventUtil.getEvent(event),
        target = EventUtil.getTarget(event);

      var handler = function (event) {
        var event = EventUtil.getEvent(event),
          target = EventUtil.getTarget(event);

        EventUtil.removeHandler(target, 'click', handler);

        // 执行内容
        fn();
      };

      EventUtil.addHandler(target, 'click', handler);

      // 为防止双击后较长时间再次单击执行事件
      setTimeout(function () {
        EventUtil.removeHandler(target, 'click', handler);
      }, 300);
    };

    EventUtil.addHandler(dom, 'dblclick', handler);
  }

3、鼠标n击事件实现

由鼠标3击事件联想到,如果实现n次鼠标连击事件触发如何实现。想到的思路是:禁用目标对象的dblclick事件,只用click事件进行连续点击的逻辑判断和操作,在连续的短时间内满足点击n次即可触发执行,否则重新计算累加次数。具体的实现代码如下:

require(['eventUtil'], function (EventUtil) {
  var button = document.getElementById('button');

  nclickEvent(4, button, function (event, n) {
    console.log(n + ' click');
  });


  function nclickEvent (n, dom, fn) {
    // 禁止双击事件
    EventUtil.removeHandler(dom, 'dblclick', null);

    var n = parseInt(n) < 1 ? 1 : parseInt(n),
      count = 0,
      lastTime = 0;

    var handler = function (event) {
      var currentTime = new Date().getTime();

      count = (currentTime - lastTime < 300) ? count + 1 : 0;

      lastTime = new Date().getTime();

      if (count >= n - 1) {
        fn(event, n);
        count = 0;
      }
    };

    EventUtil.addHandler(dom, 'click', handler);
  }
});

最后给大家分享一个jquery版的代码

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<div id="box">234234234234234</div>
	<script src="js/jquery.min.js"></script>
	<script>
	(function(){
		var num=0,d=null;
		$('#box').click(function(){
			if(d){clearTimeout(d)}
			d=setTimeout(function(){
				num=0
			},200);
			num++;
			if(num>=3){
				alert(num+"\n ok")
			}
		})
	})();
	</script>
</body>
</html>

 到此文章就结束了,大家可以根据需要选择自己想用的代码。

Javascript 相关文章推荐
基于jquery &amp; json的省市区联动代码
Jun 26 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
Apr 16 Javascript
jQuery实现表格展开与折叠的方法
May 04 Javascript
功能强大的jquery.validate表单验证插件
Nov 07 Javascript
js实现百度搜索提示框
Feb 05 Javascript
总结js中的一些兼容性易错的问题
Dec 18 Javascript
Angular 容器部署的方法
Apr 17 Javascript
jQuery事件委托代码实践详解
Jun 21 jQuery
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
Jun 10 Javascript
JavaScript浅层克隆与深度克隆示例详解
Sep 01 Javascript
Js实现粘贴上传图片的原理及示例
Dec 09 Javascript
vue监听键盘事件的相关总结
Jan 29 Vue.js
js实现1,2,3,5数字按照概率生成
Sep 12 #Javascript
js数组实现权重概率分配
Sep 12 #Javascript
js 概率计算(简单版)
Sep 12 #Javascript
JavaScript面向对象精要(下部)
Sep 12 #Javascript
在Vue.js中使用Mixins的方法
Sep 12 #Javascript
JavaScript面向对象精要(上部)
Sep 12 #Javascript
JS库之ParticlesJS使用简介
Sep 12 #Javascript
You might like
在线竞拍系统的PHP实现框架(一)
2006/10/09 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
php实现用于验证所有类型的信用卡类
2015/03/24 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
php实现微信支付之企业付款
2018/05/30 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
三种Webpack打包方式(小结)
2018/09/19 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
整理Python 常用string函数(收藏)
2016/05/30 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
执行Python程序时模块报错问题
2020/03/26 Python
Python matplotlib可视化实例解析
2020/06/01 Python
python中return不返回值的问题解析
2020/07/22 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
计算机专业个人求职信范例
2013/09/23 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
意外死亡赔偿协议书
2014/10/14 职场文书
公司感谢信范文
2015/01/22 职场文书
行政文员岗位职责
2015/02/04 职场文书
python基础学习之生成器与文件系统知识总结
2021/05/25 Python