Javascript 当检测到双击事件时,需要取消单击/鼠标悬停事件

Javascript 当检测到双击事件时,需要取消单击/鼠标悬停事件,javascript,jquery,event-handling,click,double-click,Javascript,Jquery,Event Handling,Click,Double Click,这是怎么做到的?这是一个很好的问题,实际上我认为这不容易做到。() 如果拥有此功能对您来说非常重要,您可以像这样破解它: function singleClick(e) { // do something, "this" will be the DOM element } function doubleClick(e) { // do something, "this" will be the DOM element } $(selector).click(function(

这是怎么做到的?

这是一个很好的问题,实际上我认为这不容易做到。()

如果拥有此功能对您来说非常重要,您可以像这样破解它:

function singleClick(e) {
    // do something, "this" will be the DOM element
}

function doubleClick(e) {
    // do something, "this" will be the DOM element
}

$(selector).click(function(e) {
    var that = this;
    setTimeout(function() {
        var dblclick = parseInt($(that).data('double'), 10);
        if (dblclick > 0) {
            $(that).data('double', dblclick-1);
        } else {
            singleClick.call(that, e);
        }
    }, 300);
}).dblclick(function(e) {
    $(this).data('double', 2);
    doubleClick.call(this, e);
});
这是一个例子


正如评论中所指出的,有一个插件可以实现我上面所做的功能,但是可以为您打包,这样您就不必看到丑陋的一面:。

其他答案中概述的技术称为。

Raymond Chen已经讨论了一些-尽管他是在Windows环境下讲的,他所说的与基于浏览器的UI设计相关

基本上,双击所采取的行动应该是在单击一次之后进行的合乎逻辑的事情。因此,例如,在桌面UI中,单击一个项目,然后双击将其打开(例如,打开文件或启动应用程序)。用户必须选择文件才能打开它,因此在双击操作之前执行单击操作并不重要

如果您有一个UI组件,其双击操作与单击操作完全无关,因此有必要在系统意识到它实际上是双击时防止单击操作发生,那么您确实应该重新考虑您的设计。用户会发现它笨拙且违反直觉,因为它不会按照他们习惯的方式行事

如果您仍然想这样做,那么您必须使用去抖动技术(在这种情况下,所有的单击操作都将延迟),或者实现某种机制,双击处理程序将撤销单击处理程序所做的工作


您还应该知道,有些用户设置了很长的双击时间。例如,患有关节炎的手可能在其系统偏好中双击时间超过一秒,因此,基于您选择的任意时间段的去抖动技术将使这些人无法访问您的UI组件,如果执行单键单击操作排除了执行双击操作。据我所知,“撤消单击时刚刚发生的事情”技术是唯一可行的解决方法。

jquerysparkle通过实现一个单击自定义事件,为这一点提供了一个简洁优雅的解决方案。通过这样做,您可以像使用任何其他事件一样使用它,因此:

$('#el').singleclick(function(){});
// or event
$('#el').bind('singleclick', function(){});
它还为一系列单击的最后一次和第一次单击提供自定义事件。而lastclick定制事件实际上会将点击量传递回去!所以你可以这么做

$('#el').lastclick(function(event,clicks){
    if ( clicks === 3 ) alert('Tripple Click!');
});
您可以找到定义自定义事件的源代码

它是AGPL许可证下的开源软件,因此您可以放心地从中获取所需内容它还在日常基础上积极开发,因此您永远不会缺少支持


但最重要的是,它是一个干式插件/效果框架,允许您更轻松地开发插件和扩展。因此,希望这有助于实现这一目标

如果这是针对提交表单的按钮(对于原始海报来说不一定如此,但对于通过谷歌到达这里的其他人来说可能如此),一个更简单的选项是禁用单击事件处理程序中正在单击的元素:

$(selector).click(function(e) {
    $(this).prop('disable', true);
}

对于同一个元素还是整个文档?它似乎可以工作,但它有一个明显的问题,就是在0.5秒内没有检测到定期的点击。当然,我可以缩短时间,但是。。。哦,好吧。我会自己解决的。不管怎样,谢谢。是的,我认为250次或者更少的点击可能是合理的。我一直在用谷歌搜索,显然这是你能得到的最好的。如果它能让你感觉更好,我可以用它制作一个插件来隐藏丑陋的东西实际上,我不能简单地在双击期间阻止后续的单次单击事件吗?我认为这会解决延迟问题。顺便说一句,似乎已经有一个类似Paolo Bergantino的插件解决了这个问题。jQuery插件网站已经关闭,但是GitHub中这个整洁的jQuery扩展链接到jQuery网站上的评论部分,很酷的东西和不错的文章+1用户可以设置自己的双击时间,这一点很好。。。我不想在执行单次单击操作之前等待整整一秒钟,因此等待带有超时的双次单击是切实可行的。有时,双击操作是单次单击之后的逻辑后续操作,在执行单次单击操作之前也可以(我现在就是这样做的),但是,单击操作可能会导致一些额外的负载(或者,在我的例子中,是数据流量),这是您想要防止的(尽管它不会造成确切的伤害)