zoukankan      html  css  js  c++  java
  • 不完美解决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="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毫秒只是一个大概的。

    新博客地址
    hooray.github.io
  • 相关阅读:
    Java 访问标识符
    Java 类变量与实例变量的区别
    Java 变量
    python install sublime安装
    Failed to resolve com.android.support:support-annotations 26.0.1
    Git的使用及托管代码到GitHub
    Recyclerview点击事件,更新item的UI+更新Recyclerview外的控件
    第一次android混淆实战
    android计算屏幕dp
    显示当前日期时间
  • 原文地址:https://www.cnblogs.com/hooray/p/2591588.html
Copyright © 2011-2022 走看看