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

简介:

情况描述

  当某个元素,如: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();
<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毫秒只是一个大概的。


    本文转自胡尐睿丶博客园博客,原文链接:http://www.cnblogs.com/hooray/archive/2012/07/14/2591588.html,如需转载请自行联系原作者


相关文章
|
3天前
|
JavaScript 前端开发
点击事件中的this|click事件与change事件|v-model
点击事件中的this|click事件与change事件|v-model
13 0
|
8天前
|
JavaScript 前端开发
oninput 和 onchange 事件的区别
oninput 和 onchange 事件的区别
21 9
|
5月前
|
JavaScript
jQuery取消checkbox选中状态
jQuery取消checkbox选中状态
32 0
|
5月前
a标签加onclick点击事件
a标签加onclick点击事件
|
JavaScript
click与addEventListener和removeEventListener事件详解
click与addEventListener和removeEventListener事件详解
click与addEventListener和removeEventListener事件详解
|
存储 JavaScript 前端开发
JavaScript 技巧篇-js增加延迟时间解决单击双击事件冲突,双击事件触发单击事件
JavaScript 技巧篇-js增加延迟时间解决单击双击事件冲突,双击事件触发单击事件
745 0
|
JavaScript
jQuery 解决 click 和 dblclick 冲突
版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82655648 ...
1320 0
|
JavaScript 前端开发 API
tap 和click 事件区别
clike事件和 Zepto.js 中tap的区别  首先介绍下Zepto: 最初是作为移动端开发的库,但是却可以作为JQuery轻量级的替代品,因为API和JQuery相似,而文件更小。 介绍下tap和click的区别: 两者都会在点击时触发,但是在web手机端,clikc会有200-300ms的延时,所以要用tap代替click作为点击事件,singleTap和doubleTap分别作为单次点击和双击,但是使用tap会带来点透事件(事件穿透)。
2066 0
AutoLinkTextView 解决点击事件与长按事件冲突
      小菜最近需要对 TextView 进行校验,包括 URL / Phone / Email / Hashtags / Mentions 的判断,用的封装好的 GitHub:AutoLinkTextView ,整体效果很好,但是根据需求,单击与长按添加不同的效果,特意处理一下点击冲突。
1581 0