js不完美解决click和dblclick事件冲突问题


Posted in Javascript onJuly 16, 2012

情况描述

当某个元素,如:div,同时绑定了click事件和dblclick事件,而这两个事件又要处理相对独立的业务,也就是click的时候不能触发dblclick,dblclick的时候不能触发click。在实际测试中发现,当dblclick的时候,总会出现1次click。下文将要解决的就是这个问题。
情况分析

首先我们要清楚click和dblclick的执行顺序,测试过程略,下面是测试结果:

click:mousedown -- mouseup -- click

dblclick:mousedown -- mouseup -- click -- mousedown -- mouseup -- click -- dblclick

由此看来,在dblclick触发之前,实际上是执行了2次click,而第一次的click是会屏蔽掉的(为什么?好把,我也不知道)。
解决方案

最先想到的是否可以停止事件,但发现浏览器并未提供相应方法,如果自己去实现难度太大,因为单击事件所关联的行为必须做成是可以被cancel的才行。

于是考虑用延迟,也是我唯一能想到的解决办法,利用setTimeout()来延迟完成click事件的处理,然后在需要屏蔽click的时候用clearTimeout()来停止。
具体代码

var test = (function(){ 
var clickText = 'click<br>'; 
var dblclickText = 'dblclick<br>'; 
var timer = null; 
return { 
click: function(){ 
clearTimeout(timer); 
timer = setTimeout(function(){ 
$('body').append(clickText); 
}, 300); 
}, 
dblclick: function(){ 
clearTimeout(timer); 
$('body').append(dblclickText); 
}, 
init: function(){ 
$(function(){ 
$('div').click(test.click).dblclick(test.dblclick); 
}); 
} 
} 
})(); 
test.init();

html代码
<div style="width:100px;height:100px;background:red;text-align:center;line-height:33px;-moz-user-select:none;-khtml-user-select:none;user-select:none">click<br>or<br>dblclick</div>

后续

文章标题里就说了,是不完美的,因为windows下,控制面板里是可以调鼠标的双击速度的(其他系统不清楚),所以我设置系统设置的双击速度较慢,则上面那个demo就不生效了。所以300毫秒只是一个大概的。
作者:胡??

Javascript 相关文章推荐
jquery实现带二级菜单的导航示例
Apr 28 Javascript
JS实现向表格行添加新单元格的方法
Mar 30 Javascript
JavaScript数据类型详解
Apr 01 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
Sep 15 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
Apr 19 Javascript
Vue组件的使用教程详解
Jan 05 Javascript
Angular17之Angular自定义指令详解
Jan 21 Javascript
微信小程序显示倒计时功能示例【测试可用】
Dec 03 Javascript
vue里的data要用return返回的原因浅析
May 28 Javascript
JavaScript快速调试的两个技巧
Nov 04 Javascript
vue特效之翻牌动画
Apr 20 Vue.js
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
Apr 30 Vue.js
js jquery数组介绍
Jul 15 #Javascript
js限制文本框只能输入数字(正则表达式)
Jul 15 #Javascript
基于jquery的图片幻灯展示源码
Jul 15 #Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
Jul 15 #Javascript
EasyUI 中 MenuButton 的使用方法
Jul 14 #Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 #Javascript
jQuery Tools tab(幻灯片)
Jul 14 #Javascript
You might like
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
随机头像PHP版
2006/10/09 PHP
深入了解php4(1)--回到未来
2006/10/09 PHP
PHP MSSQL 存储过程的方法
2008/12/24 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
JavaScript 动态生成方法的例子
2009/07/22 Javascript
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
SpringMVC简单整合Angular2的示例
2017/07/31 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
nodejs检测因特网是否断开的解决方案
2019/04/17 NodeJs
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
Python面向对象编程之继承与多态详解
2018/01/16 Python
如何将 awk 脚本移植到 Python
2019/12/09 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
python——全排列数的生成方式
2020/02/26 Python
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
什么是反射?如何实现反射?
2016/07/25 面试题
计算机专业推荐信范文
2013/11/27 职场文书
大学生专科学习生活的自我评价
2013/12/07 职场文书
大学生自我鉴定
2013/12/08 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
电子商务专业应届毕业生求职信
2014/06/21 职场文书
服务行业演讲稿
2014/09/02 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
2015年推普周活动总结
2015/03/27 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
go goroutine 怎样进行错误处理
2021/07/16 Golang
淡雅古典唯美少女娇媚宁静迷人写真
2022/03/21 杂记