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

 更新时间:2012年07月16日 01:16:18   作者:  
当某个元素,如:div,同时绑定了click事件和dblclick事件,而这两个事件又要处理相对独立的业务,也就是click的时候不能触发dblclick,dblclick的时候不能触发click
情况描述
  当某个元素,如: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毫秒只是一个大概的。
作者:胡尐睿

相关文章

  • requireJS模块化实现返回顶部功能的方法详解

    requireJS模块化实现返回顶部功能的方法详解

    这篇文章主要介绍了requireJS模块化实现返回顶部功能的方法,结合实例形式详细分析了requireJS的使用步骤及返回顶部功能的相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Vue3基于countUp.js实现数字滚动的插件

    Vue3基于countUp.js实现数字滚动的插件

    本文主要介绍了Vue3基于countUp.js实现数字滚动的插件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • JS实现九宫格拼图游戏

    JS实现九宫格拼图游戏

    这篇文章主要为大家详细介绍了JS实现九宫格拼图游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • js jquery ajax的几种用法总结(及优缺点介绍)

    js jquery ajax的几种用法总结(及优缺点介绍)

    本篇文章只要介绍了js jquery ajax的几种用法总结(及优缺点介绍),需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • JavaScript数学对象之数字进制转换

    JavaScript数学对象之数字进制转换

    这篇文章主要为大家讲解了JavaScript数学对象——数字进制转换的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • js 模块化CommonJS AMD UMD CMD ES6规范详解

    js 模块化CommonJS AMD UMD CMD ES6规范详解

    这篇文章主要为大家介绍了js 模块化CommonJS AMD UMD CMD ES6规范详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • JS forEach和map方法的用法与区别分析

    JS forEach和map方法的用法与区别分析

    这篇文章主要介绍了JS forEach和map方法的用法与区别,结合实例形式分析了forEach和map方法的功能、原理、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-02-02
  • JS全局变量和局部变量最新解析

    JS全局变量和局部变量最新解析

    这篇文章主要介绍了JS全局变量和局部变量最新解析的相关知识,本文给给大家补充js删除局部变量的代码,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-06-06
  • javascript代码优化的8点总结

    javascript代码优化的8点总结

    本篇文章给大家分享了关于javascript代码优化的8点总结,希望我们整理的内容能够帮助到大家。
    2018-01-01
  • 心扬JS分页函数代码

    心扬JS分页函数代码

    通过js实现分页的代码,一般情况下需要指定页数,脚本之家以前也发布过一些,大家结合下即可。
    2010-09-09

最新评论