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 相关文章推荐
一个判断email合法性的函数[非正则]
Dec 09 Javascript
document.createElement()用法及注意事项(ff下不兼容)
Mar 13 Javascript
JS远程获取网页源代码实例
Sep 05 Javascript
javascript显示中文日期的方法
Jun 18 Javascript
javascript之Boolean类型对象
Jun 07 Javascript
getElementById().innerHTML与getElementById().value的区别
Oct 27 Javascript
vue2.0开发实践总结之入门篇
Dec 06 Javascript
微信小程序网络请求的封装与填坑之路
Apr 01 Javascript
jquery+css实现下拉列表功能
Sep 03 jQuery
JavaScript 日期时间选择器一些小结
Apr 02 Javascript
详解如何创建并发布一个 vue 组件
Nov 08 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
Jun 27 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 裁剪图片成固定大小代码方法
2009/09/09 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
javascript下利用arguments实现string.format函数
2010/08/24 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
javascript计时器详解
2015/02/28 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
详解ES6 Symbol 的用途
2018/10/14 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python使用py2exe打包程序介绍
2014/11/20 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
浅谈python中copy和deepcopy中的区别
2017/10/23 Python
浅谈django model postgres的json字段编码问题
2018/01/05 Python
Python查看微信撤回消息代码
2018/06/07 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
实例教程 纯CSS3打造非常炫的加载动画效果
2014/11/05 HTML / CSS
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
程序员岗位职责
2013/11/11 职场文书
2014年党支部承诺书
2014/05/30 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js