`
MauerSu
  • 浏览: 501104 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

解决jQuery中dbclick事件触发两次click事件

 
阅读更多

源:http://js8.in/610.html

评:

jQuery事件绑定中,dbclick可以触发两次click事件。例如一个DOM元素div,既绑定了 click 事件,又绑定了 dblclick 事件,这两个事件分别要做独立的事情。事件处理上没有冲突,都可以各自完成各自的操作。双击的时候虽然是执行了 dblclick 事件,但是在这之前,也执行了click 事件,那么,如何来禁止或者说屏蔽这次多余的 click 事件呢?本文将提供给您一个比较好的解决办法。

产生原理分析

  首先,来了解一下点击事件发生的先后顺序:

单击:mousedown, mouseup, click
双击:mousedown, mouseup, click, mousedown, mouseup, click, dblclick
  由此看来,dblclick 事件发生之前,实际上发生了两次 click 事件。其中,第一次的 click 是会被屏蔽掉,但是第二次则不会,所以就出现在双击的时候,也触发 click 事件。

解决办法

  知道了原因,接下来自然就是想办法把这次 click 给屏蔽掉,但是由于各浏览器均未提供直接去停止事件的方法,所以值得改变思路。
  由于我们只需要屏蔽一次 click 事件即可,由此联想到,可以利用 setTimeout() 方法来延时完成 click 事件的处理,在需要停止 click 的时候利用 clearTimeout() 方法停止这一事件的处理。这样,就可以比较容易的写出如下的 javascript 代码:

var timer = null; function do_click(event) {
 clearTimeout(timer); // 这里加一句是为了兼容 Gecko 的浏览器 /
if (event.detail == 2) 
return ; 
// 同上句的作用 
timer = setTimeout(function() { 
// click 事件的处理 
}, 300); } 
function do_dblclick(event) { 
clearTimeout(timer);
 // dblclick 事件的处理 
}

问题总结

  从测试结果来看,如果前后两次点击的时间在 300ms 左右的时候,还是很容易出现 click 和 dblclick 事件被“同时”调用的情况,而如果间隔的时间更短或更长,则只会有 click 或 dblclick 事件。
  所以,应该说这个方法已经在很大程度上,避免了 click 和 dblclick 事件的“同时”存在问题。当然,它还没有达到完全解决的程度。

注意

windows 的控制面板里是可以调鼠标的双击速度的(Linux 等系统下能不能调,俺就不清楚了),这点对于程序还是有一定影响,大家可以自己调节下试试看~
经过测试,延时 300ms 是一个比较理想的事件,既考虑到对鼠标操作并不十分顺利的朋友,也兼顾 click 事件的响应速度
以上代码,只在 IE6、FF3、Chrome 中测试过,并未出现问题

w3c标准是没有dblclick的,而是通过event.detail来判断是单击或双击

分享到:
评论

相关推荐

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

    情况描述 当某个元素,如:div,同时绑定了click事件和dblclick事件,而这两个事件又要处理相对独立的业务,也就是click的时候不能触发dblclick,dblclick的时候不能触发click。在实际测试中发现,当dblclick的时候...

    jQuery事件及绑定.pptx

    JavaScript+jQuery 网页特效设计 ...当文本框(包括和中的文本被选中的时触发) scroll() 当滚动条发生变化时触发 resize() 当调整浏览器窗口大小时触发 2、事件的绑定 bind() 方法:可以向被选元素添加一个或多

    jQuery鼠标事件总结

    (2):dbclick事件:dbclick事件在用户完成迅速连续的两次点击之后触发,双击的速度取决于操作系统的设置。一般双击事件在页面中不经常使用。 $('p').dbclick(function(){ alert('dbclick function

    jQuery鼠标事件汇总

    鼠标事件是在用户移动鼠标光标或者使用任意鼠标键点击...2、dbclick事件:迅速连续的两次点击时触发  $(‘p’).dbclick(function(){}); 示例: $(button).dblclick(function(){ $(p).slideToggle(); }); 3、moused

    VB程序设计PPT,初步入门

    学习VB得课件 窗体事件是指窗体能够响应的动作。最常用的有如下事件。 1、 Click事件: 单击窗体,触发Click事件。 2、 DbClick事件:双击窗体,触发DbClick事件

    select不支持双击dbclick事件

    有关select不支持双击事件,下面有个示例,大家可以看看

    关于Jquery中的bind(),on()绑定事件方式总结

    一.bind() ...利用空格分隔多事件,例如 $(selector).bind(“click dbclick mouseout”,data,function); 2.利用大括号灵活定义多事件,例如 $(selector).bind({event1:function, event2:function, …}) 

    双击实体dbclick

    双击实体dbclick

    jquery与js实现全选功能的区别

    click(),dbclick()  focus(),blur()  change()  keydown(),keypress(),keyup()  mousedown(),mouseup() mouseenter(),mouseleave() mouseover(),mouseout() mousemove() 二、jquery挂事件 $(“p”).bind(...

    JQuery入门——用bind方法绑定事件处理函数应用介绍

    可以被type调用的类型包括blur、focus、load、resize、scroll、unload、click、dbclick、mousedown等事件。参数data是作为event.data属性值传递对象的额外数据对象。参数fn是绑定到每个选择元素的事件中的处理函数。...

    Android-DBClickBlocker单击事件防止变成双击事件

    DBClickBlocker 单击事件防止变成双击事件~ avoid fast click event in android

    浅谈Javascript鼠标和滚轮事件

    dbclick:当用户双击鼠标主键时发生触发,这个事件并没有在DOM2级事件中定义但是却被普遍支持了,后来在DOM3级中得到了标准化。 mousedown:当用户按下鼠标任意一个键都会触发,这个事件是不能够通过键盘触发的。 ...

    深入理解JS的事件绑定、事件流模型

    click/dbclick/mouseover/mouseout 2.HTML事件:  onload/onunload/onsubmit/onresize/onchange/onfoucs/onscroll 3.键盘事件:  keydown:键盘按下时触发  keypress:键盘按下并抬起的瞬间触发。  keyup:...

    Visual Basic课件:第6章-常用标准控件new.ppt

    * DbClick:鼠标双击事件 6.1.2 文本框 文本框是一个文本编辑区域,在设计阶段或运行期间可以在这个区域中输入、编辑和显示文本。文本框的主要属性有: * Text:文本框中的文本内容 * SelText:选中文本,用于...

    程序中多个网格控件的编辑代码

    在form窗口中建立两个msflesgrid控件,名称分别为msflexgrid1和msflexgrid2,以及一个text控件,名称为text1,如果程序有超过两个网格控件,则在代码窗口添加相应网格控件的dbclick事件和keypress事件,调用程序的函数...

    vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法

    一、vue中解决chrome浏览器自动播放音频 需求 有新订单的时候,页面自动语音提示和弹出提示框; 问题 chrome浏览器在18年4月起,就在桌面浏览器全面禁止了音视频的自动播放功能。严格地来说,是Chrome不允许在用户对...

    JS触摸事件、手势事件详解

    dbclick 触屏设备不支持双击事件。双击浏览器窗口,会放大画面。 可以通过在head标签内加上这么一行: 代码如下: <meta name=”viewport” content=”width=device-width, minimum-scale=1.0,maximum-scale=...

    VB6.0动态加载ActiveX控件漫谈

    VB6.0已能够解决该问题,只是帮助中没有明确说明,并且没有描述到一些关键功 能,由于以前的版本中可以动态创建进程外服务:如果对象是外部可创建的,可在 Set 语句中用 New 关键字、CreateObject 或 GetObject 从...

    VUE元素的隐藏和显示(v-show指令)

    除了click单击事件,还有mouseover,mouseover等鼠标事件。 dbclick双击事件。 v-on:click/mouseover/mouseover/mousedown/dbclick/... v-show指令 v-show="true/false" //控制元素显示/隐藏 示例代码: <!...

Global site tag (gtag.js) - Google Analytics