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 相关文章推荐
js鼠标点击图片切换效果代码分享
Aug 26 Javascript
浅析Node.js 中 Stream API 的使用
Oct 23 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
Nov 05 Javascript
如何使用Vuex+Vue.js构建单页应用
Oct 27 Javascript
原JS实现banner图的常用功能
Jun 12 Javascript
JS实现键值对遍历json数组功能示例
May 30 Javascript
React之PureComponent的使用作用
Jul 10 Javascript
在vue中v-bind使用三目运算符绑定class的实例
Sep 29 Javascript
jQuery实现的模仿雨滴下落动画效果
Dec 11 jQuery
如何在Vue中使用CleaveJS格式化你的输入内容
Dec 14 Javascript
Angular脚手架开发的实现步骤
Apr 09 Javascript
微信小程序实现分享商品海报功能
Sep 30 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 和 COM
2006/10/09 PHP
php 日期时间处理函数小结
2009/12/18 PHP
PHP XML数据解析代码
2010/05/26 PHP
关于php mvc开发模式的感想
2011/06/28 PHP
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
初识Node.js
2014/09/03 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
python中while循环语句用法简单实例
2015/05/07 Python
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
《最佳路径》教学反思
2014/04/13 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
2015年妇女工作总结
2015/05/14 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis
java如何实现socket连接方法封装
2021/09/25 Java/Android