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 相关文章推荐
一个对于js this关键字的问题
Jan 09 Javascript
js可突破windows弹退效果代码
Aug 09 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
Sep 13 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
Oct 17 Javascript
js的toUpperCase方法用法实例
Jan 27 Javascript
JavaScript实现的背景自动变色代码
Oct 17 Javascript
微信支付 JS API支付接口详解
Jul 11 Javascript
浅谈Vue-cli 命令行工具分析
Nov 22 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
Jun 05 Javascript
javascript面向对象三大特征之多态实例详解
Jul 24 Javascript
vue 实现v-for循环回来的数据动态绑定id
Nov 07 Javascript
在vant中使用时间选择器和popup弹出层的操作
Nov 04 Javascript
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
PHPShop存在多个安全漏洞
2006/10/09 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
jquery ui resizable bug解决方法
2010/10/26 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
javascript中的五种基本数据类型
2015/08/26 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
微信小程序实现自定义modal弹窗封装的方法
2018/06/15 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Python最基本的输入输出详解
2015/04/25 Python
Python的迭代器和生成器
2015/07/29 Python
python实现百度语音识别api
2018/04/10 Python
关于Python的一些学习总结
2018/05/25 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
Python collections模块使用方法详解
2019/08/28 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
python 绘制国旗的示例
2020/09/27 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
南京导游词
2015/02/03 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
Java中的继承、多态以及封装
2022/04/11 Java/Android