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 相关文章推荐
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
Aug 13 Javascript
jQuery xml字符串的解析、读取及查找方法
Mar 01 Javascript
JS简单循环遍历json数组的方法
Apr 22 Javascript
使用vue.js编写蓝色拼图小游戏
Mar 17 Javascript
jQuery返回定位插件详解
May 15 jQuery
angular select 默认值设置方法
Jun 23 Javascript
vue+swiper实现组件化开发的实例代码
Oct 26 Javascript
微信小程序自定义音乐进度条的实例代码
Aug 28 Javascript
nuxt.js中间件实现拦截权限判断的方法
Nov 21 Javascript
js设计模式之单例模式原理与用法详解
Aug 15 Javascript
解析vue、angular深度作用选择器
Sep 11 Javascript
Vue中key的作用示例代码详解
Jun 10 Javascript
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
php中数字0和空值的区别分析
2014/06/05 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
PHP获取毫秒级时间戳的方法
2015/04/15 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
简单实现js放大镜效果
2017/07/24 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
如何在node环境实现“get数据解析”代码实例
2020/07/03 Javascript
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
python 进程间数据共享multiProcess.Manger实现解析
2019/09/23 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
用css3制作纸张效果(外翻卷角)
2013/02/01 HTML / CSS
英国最大的海报商店:GB Posters
2018/03/20 全球购物
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
人力资源经理的岗位职责范本
2014/02/28 职场文书
期中考试反思800字
2014/05/01 职场文书
推广普通话演讲稿
2014/05/23 职场文书
学校欢迎标语
2014/06/18 职场文书
项目申请汇报材料
2014/08/16 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL