博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
给一个元素同时绑定click和dbclick存在的问题
阅读量:6483 次
发布时间:2019-06-23

本文共 1985 字,大约阅读时间需要 6 分钟。

这是一个我面试的面试题

代码实例

    
demo

运行上面的代码我们会发现不论我们怎么单击按钮都无法出现弹出框显示内容为‘double click’

我在面试时遇到这个问题,由于时间有限我想到了用定时器来解决,用一个状态值标志着出发了一次还是两次。现在回想当时的面试感觉回答的还是漏洞百出。

解决方案

我在stackflow中找到了这样一个

先贴个代码:

// Author:  Jacek Becela// Source:  http://gist.github.com/399624// License: MITjQuery.fn.single_double_click = function(single_click_callback, double_click_callback, timeout) {  return this.each(function(){    var clicks = 0, self = this;    jQuery(this).click(function(event){      clicks++;      if (clicks == 1) {        setTimeout(function(){          if(clicks == 1) {            single_click_callback.call(self, event);          } else {            double_click_callback.call(self, event);          }          clicks = 0;        }, timeout || 300);      }    });  });}

这个代码的实现跟我的思路相同,但是在stackflow中并未找到兼容大部分浏览器的方案,这个代码 在chrome,safari,FF,opera上没多大问题,存在比较明显的问题就是IE,ie<9不支持

访问有正宗的解释(访问这个链接需要翻墙)

IE兼容性处理

$(this).bind("dblclick", function(event) {    clicks = 2;    double_click_callback.call(self, event);});$(this).bind("click", function(event) {    setTimeout(function() {        if (clicks != 2) {            single_click_callback.call(self, event);        }        clicks = 0;    }, timeout || 300);});

由于在ie<9中click 和 dbclick的触发判断时间更短,会造成dbclick失效的问题,测试连续出发三次会出现想要dbclick的效果,所以需要将代码改成上面的实现格式,同时也会出现现弹出两个弹出框第一个内容为‘double click’, 第二个内容为‘single click’。

依然存在的问题

根据该连接上提供的解决方案,判断浏览器的类型和版本的代码发现还是有问题,你会发现结果无法执行,【IE兼容性处理】中我们提到过click和dbclick的判断时间很短,用上面的代码判断浏览器的类型和版本存在问题,不能执行,所以提供了如下的解决方案

(window.ActiveXObject && parseInt(navigator.appVersion.split(";")[1].replace(/[ ]/g, "").replace("MSIE","")) < 9)

根据浏览器的特有对象来判定浏览器的类型是个不错的方法

javascript原生实现的方法

click me

这是一个不错的方法,但是频繁操作dom属性的代码性能较差,不如换成变量

但代码还是存在着缺陷,ie的时间间隔更短

The order of events for a dblclick is:mousedownmouseupclickmousedownmouseupclickdblclickThe one exception to this rule is (of course) Internet Explorer with their custom order of:mousedownmouseupclickmouseupdblclick

通过比较浏览器的事件发生顺序我们可以得到答案

demo

提供一个供大家参考

文章来源于

转载地址:http://jbbuo.baihongyu.com/

你可能感兴趣的文章
原创 Oracle RAC系统安装视频教程
查看>>
Exchange Server 2010部署(五)在Mailbox服务器上配置DAG
查看>>
QTP系列讲座:输出值系列讲座(一)
查看>>
一个IO的传奇一生(12)-- 磁盘阵列1
查看>>
【转】烂泥:网盘的秒传原理
查看>>
Shell常用命令总结
查看>>
第四组视频:在bash脚本中使用脚本选项
查看>>
SCOM 2007 R2监控系统安装部署(二)安装Operation Manager 2007 R2管理服务器
查看>>
Drupal8系列(二):安装Drush工具 -Ubuntu 14.04 LTS
查看>>
SpreadJS 在 Angular2 中支持哪些事件?
查看>>
MySQL innodb_flush_method 与 File I/O (Linux)
查看>>
Entity Framework框架Code First Fluent API
查看>>
继续聊WPF——如何获取ListView中选中的项
查看>>
DB连接池备忘
查看>>
SQL Server的还原
查看>>
QQ密码忘记怎么办 教你找回QQ密码
查看>>
T-SQL_常用内置函数和操作
查看>>
vmware workstation 克隆linux后修改网卡为eth0方法。
查看>>
java volatile
查看>>
JavaScript:SpiderMonkey中的函数序列化
查看>>