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的相对父元素和相对文档定位示例代码
Aug 02 Javascript
js判断一个字符串是否包含一个子串的方法
Jan 26 Javascript
JavaScript实现更改网页背景与字体颜色的方法
Feb 02 Javascript
javascript制作网页图片上实现下雨效果
Feb 26 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
Jul 09 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
Oct 29 Javascript
基于vue实现多引擎搜索及关键字提示
Mar 16 Javascript
vue文件树组件使用详解
Mar 29 Javascript
微信小程序云开发之云函数详解
May 16 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
Nov 06 Javascript
javascript使用Blob对象实现的下载文件操作示例
Apr 18 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
Jan 29 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
第六节 访问属性和方法 [6]
2006/10/09 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
JS实现获取自定义属性data值的方法示例
2018/12/19 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
Python算法应用实战之栈详解
2017/02/04 Python
Python反转序列的方法实例分析
2018/03/21 Python
django反向解析和正向解析的方式
2018/06/05 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
Python字符串的常见操作实例小结
2019/04/08 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
Python中的With语句的使用及原理
2020/07/29 Python
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
美发活动策划书
2014/01/14 职场文书
技能竞赛活动方案
2014/02/21 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
高中生综合素质评价范文
2015/08/18 职场文书