javascript 如何使ondblclick事件在手机上工作?

bvjveswy  于 2023-05-16  发布在  Java
关注(0)|答案(6)|浏览(127)

我想在一个特定的div上实现双击事件,如下所示:

<div   id="divID" ondblclick = 'alert("double click!!");' >

它在谷歌Chrome浏览器上工作,但当我用手机打开它时,它不工作,顺便说一下,单击工作。
ps:我加了这两个东西

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

还有这个

body {
-ms-touch-action: manipulation;
touch-action: manipulation;}

但是它不起作用!

aor9mmx1

aor9mmx11#

我也有同样的问题。在触摸设备上,如果你想检测双击手势,并且在大多数情况下使用ondblclick事件,它将不起作用,而且问题是它也会触发onclick。解决方案之一是使用以下代码示例实现双击检测模式:

var doubletapDeltaTime_ = 700;
var doubletap1Function_ = null;
var doubletap2Function_ = null;
var doubletapTimer = null;

function tap(singleTapFunc, doubleTapFunc) {
    if (doubletapTimer==null) {
    // First tap, we wait X ms to the second tap
        doubletapTimer_ = setTimeout(doubletapTimeout_, doubletapDeltaTime_);
        doubletap1Function_ = singleTapFunc;
        doubletap2Function_ = doubleTapFunc;
    } else {
    // Second tap
        clearTimeout(doubletapTimer);
        doubletapTimer_ = null;
        doubletap2Function_();
    }
}

function doubletapTimeout() {
// Wait for second tap timeout
    doubletap1Function_();
    doubleTapTimer_ = null;
}

你可以把它叫做

<div   id="divID" onclick="tap(tapOnce, tapTwice)" >

tapOnce和tapTwice是您的函数,将在相应的情况下调用。这个解决方案也适用于浏览器。
参考文献

jhdbpxl9

jhdbpxl92#

下面是外部函数'doubletap',它可能会有所帮助:

/*
 * jQuery Double Tap
 * Developer: Sergey Margaritov (sergey@margaritov.net)
 * Date: 22.10.2013
 * Based on jquery documentation http://learn.jquery.com/events/event-extensions/
 */

(function($){

  $.event.special.doubletap = {
    bindType: 'touchend',
    delegateType: 'touchend',

    handle: function(event) {
      var handleObj   = event.handleObj,
          targetData  = jQuery.data(event.target),
          now         = new Date().getTime(),
          delta       = targetData.lastTouch ? now - targetData.lastTouch : 0,
          delay       = delay == null ? 300 : delay;

      if (delta < delay && delta > 30) {
        targetData.lastTouch = null;
        event.type = handleObj.origType;
        ['clientX', 'clientY', 'pageX', 'pageY'].forEach(function(property) {
          event[property] = event.originalEvent.changedTouches[0][property];
        })

        // let jQuery handle the triggering of "doubletap" event handlers
        handleObj.handler.apply(this, arguments);
      } else {
        targetData.lastTouch = now;
      }
    }
  };

})(jQuery);
htzpubme

htzpubme3#

将jQuery移动的加载到您的项目中,并尝试使用taphold或通过该API提供的其他一些特定于移动设备的触摸事件。
以下是jQuery移动的文档,其中包含您可以使用的所有事件:http://api.jquerymobile.com/category/events/

ffvjumwh

ffvjumwh4#

以下是TS React用户的代码片段。传入click事件,这样只有在同一元素被单击两次时才会调用双击

import React from "react";

type CallBack = () => any;
type TapParams = { onSingleTap?: CallBack; onDoubleTap?: CallBack };

var DELTA_TIME_THRESHOLD_MS = 700;
var timer: NodeJS.Timeout | null = null;
var target: EventTarget;

export function tap(
  e: React.MouseEvent,
  { onSingleTap, onDoubleTap }: TapParams
) {

  if (timer == null) {
    // First tap
    onSingleTap?.();

    timer = setTimeout(() => {
      timer = null;
    }, DELTA_TIME_THRESHOLD_MS);
  } else {
    // Second tap
    if (e.target === target) {
      onDoubleTap?.();
    }

    clearTimeout(timer);
    timer = null;
  }
  target = e.target;
}

用途

<div
  onClick={(e) => tap(e, { onSingleTap, onDoubleTap })}
>Tap or doubletap</div>
hc2pp10m

hc2pp10m5#

仅使用JavaScript

您可以使用“touchstart”事件进行单次触摸,
而是计算他应该再次点击的时间
我使用400(0.4s),因为它是两次触摸之间的较长持续时间
这只是一个估计,但仍然是一个合理的时间

let expired

let doubleClick = function () {
    console.log('double click')
}

let doubleTouch = function (e) {
    if (e.touches.length === 1) {
        if (!expired) {
            expired = e.timeStamp + 400
        } else if (e.timeStamp <= expired) {
            // remove the default of this event ( Zoom )
            e.preventDefault()
            doubleClick()
            // then reset the variable for other "double Touches" event
            expired = null
        } else {
            // if the second touch was expired, make it as it's the first
            expired = e.timeStamp + 400
        }
    }
}

let element = document.getElementById('btn')
element.addEventListener('touchstart', doubleTouch)
element.addEventListener('dblclick', doubleClick)

如果出现此错误:

  • 由于目标被视为被动,因此无法在被动事件侦听器内preventDefault。*

如果element =“document”或“document.body”,则event.preventDefault()不起作用
因此,解决方案是,你应该有一个完整的页面div容器:

let element = document.getElementById('container')
element.style.minWidth = '100vw'
element.style.minHeight = '100vh'
document.body.style.margin = '0px'
element.addEventListener('touchstart', elementTouch)
element.addEventListener('dblclick', doubleClick)
uujelgoq

uujelgoq6#

如果你需要简单的纯js,那么试试像gist这样的东西。

相关问题