JS - 解决鼠标单击、双击事件冲突问题(原生js实现)
首先,来了解一下点击事件发生的先后顺序:
单击:mousedown, mouseup, click
双击:mousedown, mouseup, click, mousedown, mouseup, click, dblclick
由于鼠标双击时每一次触发双击事件都会引起两次单击事件和一次双击事件,原生的js不提供专门的双击事件。
因为业务原因,双击和单机都绑定了不同的业务,在双击的时候又触发了单机,影响了页面的正常显示
出现问题的代码:
<!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>
解决办法:
setTimerout
所以双击时为了屏蔽单击事件,引入定时器功能,动态的为每次鼠标单击计时,300ms,300ms内鼠标再次点击会出发双击事件而不走单击事件
解决代码:
<!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>
如果还vue 同样的方法,但是注意有可能会有一些版本不支持,1.0版本是可以,2.0的在线的版本有一些不支持native,到官网中在线引入vue(2019年10月15日)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试单击双击</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<style>
#box{
background-color:pink
}
</style>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
window.onload=function(){
//var clickTimeId;
new Vue({
el:'#box',
data:{
clickTimeId:"",
},
methods:{
onDocumentClick(event) {
// 取消上次延时未执行的方法
clearTimeout(this.clickTimeId);
//执行延时
this.clickTimeId = setTimeout(function() {
//此处为单击事件要执行的代码
console.log("0");
}, 250);
},
onDocumenDblClick(event) {
// 取消上次延时未执行的方法
clearTimeout(this.clickTimeId);
console.log("1");
}
}
});
};
</script>
</head>
<body>
<button id="box" @click="onDocumentClick" @dblclick="onDocumenDblClick">
点我啊
</button>
</body>
</html>
在实际使用过程中还发现了一个有趣的应用,我们知道没有设置定时器的时候,双击的时候是触发两次click的事件,如果设置 定时的时间低于170ms的时候 双击时会触发一次单击的事件 如果有特殊需要也可以控制好定时器的时间
2020年2月15号
在实际组态项目中的时候,因为特殊情况,还是有时间冲突的问题,添加了定时器就导致了页面的其他业务不能正常使用了,所以最后还是放弃了定时器这种做法
最终的解决办法:
在单击的时候记录下鼠标的xy位置,然后双击的结束的时候记录此时鼠标的xy位置,通过两次的xy位置进行对比,如果两次的xy位置相同,或者在一个允许很小的范围,就证明是双击了,其他就当做是单击处理,这样一来的问题就都解决,这种方法推荐,亲测可试
JS - 解决鼠标单击、双击事件冲突问题(原生js实现)的更多相关文章
- electron 系统托盘 单击 双击事件冲突解决方法
部分代码 // 任务栏点击事件 let timeCount = 0 tray.on('click', function (Event) { setTimeout(() => { if (time ...
- JS Event 鼠标拖拽事件
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- js(jquery)鼠标移入移出事件时,出现闪烁、隐藏显示隐藏显示不停切换的情况
<script> $(".guanzhu").hover(function(){ $(".weixinTop").show(); },functio ...
- JQuery如何实现双击事件时不触发单击事件,解决鼠标单双击冲突问题
在jQuery的事件绑定中,如果元素同时绑定了单击事件(click)和双击事件(dblclick),那么执行单击事件(click)时,不会触发双击事件(dblclick), 执行双击事件(dblcli ...
- jquery 单击和双击事件冲突解决方案
先看一下点击事件的执行顺序: 单击(click):mousedown,mouseout,click: 双击(dblclick):mousedown,mouseout,click , mousedown ...
- JQuery解决鼠标单双击冲突问题
转自链接:https://www.shuzhiduo.com/A/xl560MKrzr/ 在jQuery的事件绑定中,如果元素同时绑定了单击事件(click)和双击事件(dblclick),那么执行单 ...
- MVC中使用Echart后台加载数据 实现饼图、折线图、全国地图数据,单击双击事件等
@{ Layout = null; } @if (false) { <script src="~/Js/jquery-easyui-1.5/jquery.min.js"> ...
- JS控制鼠标点击事件
鼠标点击事件就是当鼠标点击元素时,就会出现另一个窗口,类似于百度首页中右上角的“登录”这个按钮,当鼠标点击 登录时,就会出现登录窗口.大体的意思就是这样,直接上代码了,简单易懂. <!DOCTY ...
- JS里关于事件的常被考察的知识点:事件流、事件广播、原生JS实现事件代理
1.JS里面的事件流 DOM2级事件模型中规定了事件流的三个阶段:捕获阶段.目标阶段.冒泡阶段,低版本IE(IE8及以下版本)不支持捕获阶段 捕获事件流:Netscape提出的事件流,即事件由页面元素 ...
随机推荐
- PAT甲 1007. Maximum Subsequence Sum (25) 2016-09-09 22:56 41人阅读 评论(0) 收藏
1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- Java代码优化(一)
前言 2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化.在修改之前,我的说法是这样的: 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸 ...
- Oracle EBS - Setup: 配置文件Profile
http://blog.csdn.net/lfl6848433/article/details/8696939 Oracle EBS - Setup: 配置文件Profile 1.诊断Diagnost ...
- 理解load averages
今天在客户的生产环境中遇到了网络丢包的问题,但是查看我方部署smokeping监控发现对同一条线路监控,我方监控显示正常,判断丢包是由客户服务器负载过高导致,原因及排查思路如下: 使用uptime ...
- 查看Linux服务器被映射的公网ip
查看Linux服务器被映射的公网ip 现在云服务器非常流行,不仅企业甚至是个人都可能拥有自己的云服务器,但是目前的云服务器厂商提供的公网IP大都是映射而来,所以在Linux服务器上执行ifconf ...
- LoadRunner 技巧之 IP欺骗 (推荐)
IP欺骗也是也loadrunner自带的一个非常有用的功能. 需要使用ip欺骗的原因:1.当某个IP的访问过于频繁,或者访问量过大是,服务器会拒绝访问请求,这时候通过IP欺骗可以增加访问频率和访问量, ...
- Linux Mint 楷体问题
很多人都遇见过刚装完的 Linux Mint 界面字体是黑体,然后莫名其妙就变成楷体的问题. 先不说技术层面的原因,只说怎么解决. 造成这种情况,多数是安装输入法或其他某种软件的时候,同时安装了 AR ...
- asp.net—策略模式
一.什么是策略模式 定义:定义一系列算法,把一个个算法封装成独立类并实现同一个接口,使得它们之间可以相互替换. 二.怎么使用策略模式 首先模拟一个场景:有一个用户想买车. 可以有多种方式买车: (1 ...
- ASP.NET Core SignalR CORS 跨域问题
将 SignalR 集成到 ASP.NET Core api 程序的时候,按照官方 DEMO 配置完成,本地访问没有问题,但是发布之后一直报跨域问题,本地是这样设置的: 原始代码: services. ...
- C# Task
Task是一种基于任务的编程模型.它与thread的主要区别是,它更加方便对线程进程调度和获取线程的执行结果. Task类和thread类,前者接收的是Action委托类型,后者接收的是Func委托类 ...