JS - 解决鼠标单击、双击事件冲突问题(同时实现两种事件响应)
1,问题描述
如果想让一个 DOM 对象既可以被单击,也可以被双击,可以在该对象上同时绑定单击(click)和双击(dblclick)事件。<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
/*
* 页面初始化
*/
function onload() {
document.addEventListener('click', onDocumentClick);
document.addEventListener('dblclick', onDocumenDblClick);
}
/*
* 鼠标单击事件响应
* event 鼠标事件对象
*/
function onDocumentClick(event) {
console.log("鼠标单击");
}
/*
* 鼠标双击事件响应
* event 鼠标事件对象
*/
function onDocumenDblClick(event) {
console.log("鼠标双击");
}
</script>
</head>
<body onload="onload()">
</body>
</html>
(1)测试了下单击是没问题的,控制台输出如下:

(2)但如果是双击会发现,除了触发双击事件,在双击事件之前还会连续触发两次单击事件:

2,解决办法
通过设置两次点击事件的间隔时间(setTimeout 方法),来实现双击、单击事件并存。
- 单击后不立刻执行相关的代码,而是让其延时执行(比如:200ms)
- 如果随后发生了双击事件,则取消延时执行的方法,只执行双击事件方法。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
//单击延时触发
var clickTimeId;
/*
* 页面初始化
*/
function onload() {
document.addEventListener('click', onDocumentClick);
document.addEventListener('dblclick', onDocumenDblClick);
}
/*
* 鼠标单击事件响应
* event 鼠标事件对象
*/
function onDocumentClick(event) {
// 取消上次延时未执行的方法
clearTimeout(clickTimeId);
//执行延时
clickTimeId = setTimeout(function() {
//此处为单击事件要执行的代码
console.log("鼠标单击");
}, 250);
}
/*
* 鼠标双击事件响应
* event 鼠标事件对象
*/
function onDocumenDblClick(event) {
// 取消上次延时未执行的方法
clearTimeout(clickTimeId);
console.log("鼠标双击");
}
</script>
</head>
<body onload="onload()">
</body>
</html>
再次双击,可以发现不会再执行单击的方法了。
