本文详细解析了JavaScript中鼠标多次点击事件的实现原理,重点介绍了基于mousedown、mouseup和click事件序列的3次点击逻辑。通过原生AMD模块封装通用事件处理工具,并扩展至N次点击的实现思路,最后提供jQuery版本的简化代码示例,帮助开发者深入理解事件触发顺序与连续点击的处理机制。
引言与背景
近期研读了《JavaScript高级程序设计》中关于DOM事件的章节,并注意到网络上关于鼠标多次点击事件的讨论。鼠标事件作为Web开发中最基础且常用的交互方式之一,本文旨在对点击事件进行适度扩展与实现,以加深对其底层机制的理解。以下总结的实现逻辑与思路均源于个人实践,若存在疏漏之处,欢迎技术同仁批评指正。
通用事件处理模块构建
第一步:构建通用的事件处理模块(原生JavaScript实现)
该模块基于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;
});
鼠标3次点击事件实现
第二步:实现鼠标3次连续点击事件
理解鼠标点击事件及其触发顺序是实现的基础:
mousedown:鼠标任意按键按下时触发
mouseup:释放鼠标按键时触发
click:单击操作
mousedown
mouseup
dblclick:双击操作
从事件序列可以看出,dblclick(双击)通常依赖于click事件的逻辑。因此,可以通过监听这两个事件来推导3次连续点击的效果。具体策略是:在触发dblclick后,立即监听后续的click事件;若在极短时间窗口内再次触发click,则视为完成了3次连续点击。具体源码实现如下:
<div>
<button id="button">鼠标3击</button>
</div>
JavaScript代码示例
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);
}
鼠标N次点击事件扩展
第三步:鼠标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版本实现
最后,提供一个基于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>
文章至此结束,开发者可根据实际项目需求选择适合的代码方案。