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 相关文章推荐
javascript 尚未实现错误解决办法
Nov 27 Javascript
jQuery回车实现登录简单实现
Aug 20 Javascript
5秒后跳转到另一个页面的js代码
Oct 12 Javascript
jQuery中animate()方法用法实例
Dec 24 Javascript
jQuery遍历DOM元素与节点方法详解
Apr 14 Javascript
浅谈angular懒加载的一些坑
Aug 20 Javascript
Javascript中引用类型传递的知识点小结
Mar 06 Javascript
详解如何在vue中使用sass
Jun 21 Javascript
详解node如何让一个端口同时支持https与http
Jul 04 Javascript
JS添加或删除HTML dom元素的方法实例分析
Mar 05 Javascript
从0到1构建vueSSR项目之路由的构建
Mar 07 Javascript
vue项目中播放rtmp视频文件流的方法
Sep 17 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
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
react中使用swiper的具体方法
2018/05/15 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
Python中的自定义函数学习笔记
2014/09/23 Python
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
利用python代码写的12306订票代码
2015/12/20 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
python 异或加密字符串的实例
2018/10/14 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
解释DataSet(ds) 和 ds as DataSet 的含义
2014/07/27 面试题
行政工作个人的自我评价
2014/02/13 职场文书
保护母亲河倡议书
2014/04/14 职场文书
给校长的建议书500字
2014/05/15 职场文书
煤矿安全生产标语
2014/06/06 职场文书
园林系毕业生求职信
2014/06/23 职场文书
优秀教师推荐材料
2014/12/16 职场文书
求职自荐信怎么写
2015/03/04 职场文书
求职信范文怎么写
2015/03/19 职场文书
辩论赛主持人开场白
2015/05/29 职场文书
《落花生》教学反思
2016/02/16 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书