“双击”事件上的 jQuery(dblclick 移动版)

IT技术 javascript jquery touch
2021-03-09 01:27:04

我有以下 jquery 事件处理函数:

$('.target').on('dblclick', function() {
    //respond to double click event
});

我的问题是此事件处理程序在触摸设备(iPhone、iPad...)上不起作用。任何人都可以推荐一个可靠的替代方案dblclick,可以在触摸设备上运行并且仍然允许在全尺寸设备上舒适地双击使用吗?

6个回答

我最终构建了一个可以在移动设备和桌面设备上运行的自定义双击功能:

var touchtime = 0;
$(".target").on("click", function() {
    if (touchtime == 0) {
        // set first click
        touchtime = new Date().getTime();
    } else {
        // compare first click to this click and see if they occurred within double click threshold
        if (((new Date().getTime()) - touchtime) < 800) {
            // double click occurred
            alert("double clicked");
            touchtime = 0;
        } else {
            // not a double click so set as a new first click
            touchtime = new Date().getTime();
        }
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<div class="target">Double click me</div>

或者,这里是JSfiddle 演示

我发现“捏缩放”手势触发了双击——至少在 IOS 上是这样。我使用 if ((now - touchtime) < 800 && (now - touchtime) > 150) 来解决它...
2021-05-07 01:27:04
@matteo,对我来说它适用于移动设备,但是在您单击一次后检测单击时存在一些问题
2021-05-11 01:27:04

将此添加到您的 index.html

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>

我发现移动缩放功能会摆脱 Jquery 的 dblclick。基本上它说你的视口不会有效地改变关闭缩放。这适用于我的 Nexus 5 运行 Chrome。

应该是 user-scalable=no 还是两个值相同?
2021-04-20 01:27:04
酷!这很有效,也很有意义,请参阅我在已接受的解决方案stackoverflow.com/questions/54828764/...
2021-05-10 01:27:04

您可以在元素上绑定多个事件侦听器,并tap为触摸设备使用 jQuery事件。

$( ".target" ).on({
  dbclick: function() {
    //do stuff
  }, touch: function() {
    //do the same stuff
  }
});

感谢您的解决方案 - 我所做的唯一一件事就是添加一个超时,以便它们可以被视为单独的事件

var touchtime = 0;
var delay = 800;
var action = null;
$(".target").on("click", function() {
  /*Double Click */
  if((new Date().getTime() - touchtime) < delay){
     clearTimeout(action)
     alert('dbl');
     touchtime=0;
  }
  /* Single Click */
  else{
     touchtime = new Date().getTime();
     action = setTimeout(function(){
        alert('single');
     },delay);
  }
}));

尽管我还没有测试过,但也可能值得将以下内容添加到任何 HTML 的标题部分<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>“user-scalable=no”或不“user-scalable=no”

我知道这个问题已经得到回答,但我认为值得把我一直使用的解决方案放在一边,干杯:

    var doubleClicked = false;
    $('.target').on('click', function() {   
        if (doubleClicked) {
            //do what you want to do on double click here
        }
        doubleClicked = true;
        setTimeout(() => {
            doubleClicked = false;
        }, 300);
    });