JQuery в событии "двойного щелчка" (dblclick для мобильных устройств)

У меня есть следующая функция обработки событий jquery:

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

Моя проблема в том, что этот обработчик событий не работает на сенсорных устройствах (iPhone, iPad...). Может ли кто-нибудь рекомендовать надежную альтернативу dblclick, которая работает на сенсорных устройствах и по-прежнему позволяет удобно использовать двойной щелчок на полноразмерных устройствах?

Ответы

Ответ 1

В итоге я создал собственную функцию двойного щелчка, которая будет работать как на мобильном, так и на настольном компьютере:

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>

Ответ 2

Вы можете связать несколько прослушивателей событий с элементом и использовать событие jQuery tap для сенсорных устройств.

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

Ответ 3

Отмеченный ответ @JRulle, похоже, работает только для одного объекта, если у вас много экземпляров с тем же классом, они будут рассматриваться как один объект см. пример
Пример скрипта

Мое решение, похоже, работает в таких случаях

var touchtime = 0;
$('.target').on('click', function() {
  if (touchtime == 0) {
    touchtime = new Date().getTime();
  } else {
    if (((new Date().getTime()) - touchtime) < 800) {
      alert("double clicked");
      touchtime = 0;
    } else {
      touchtime = 0;
    }
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<p class="target">click me!</p>
<p class="target">then click me!</p>

<a href="#">click link</a>

Ответ 4

Добавьте это в ваш index.html

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

Я обнаружил, что функция мобильного масштабирования будет сбрасывать Jquery dblclick. В основном это говорит о том, что ваш видовой экран не изменится эффективно, отключив зум. Это работает для меня на моем Nexus 5 под управлением Chrome.

Ответ 5

У меня есть усовершенствование кода выше, который не обнаружил двойной щелчок после одного щелчка:

var touchtime = 0;
$(".target").on("click", function() {
  if (((new Date().getTime()) - touchtime) < 500) {
    alert("double clicked");
  }
  touchtime = new Date().getTime();
});

Этот код обнаруживает все двойные клики. Я также уменьшил время касания до 500 мс (стандартное время двойного клика).

Ответ 6

Спасибо за решение - я только добавил время ожидания, чтобы их можно было рассматривать как отдельные события.

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 "

Ответ 7

Это оно... в CoffeeScript

onDblClick = -> "...your function to be fired..."
dbl_click = null
$(element).on 'mousedown', ->
   onDblClick() if dbl_click
   dbl_click = true
   setTimeout () ->
       dbl_click = false            
   , 250

Ответ 8

Вам нужно ввести "return false" в конец функции, как показано ниже

var touchtime = 0;
$('.dbclickopen').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
            touchtime = 0;
            window.location = this.href;
        } else {
            //not a double click so set as a new first click
            touchtime = new Date().getTime();
        }
    }
    return false;
});