IOS HTML 禁用双击缩放

IOS HTML disable double tap to zoom

我正在设计一个主要关注数据输入的网站。在我的一个表单中,我有一些按钮可以快速增加和减少表单字段中的数字值。我正在使用

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

禁用 IOS 的 Firefox 应用似乎有效的缩放功能。然而,当另一位用户使用 Safari 对其进行测试时,点击按钮的速度过快导致页面放大,分散了用户的注意力,无法快速增加数值。似乎从 IOS 10 开始,苹果出于可访问性原因删除了 user-scalable=no,这就是为什么它只适用于 Firefox 等第三方浏览器的原因。我发现最接近禁用双击缩放的是这个

var lastTouchEnd = 0;
document.addEventListener('touchend', function (event) {
    var now = (new Date()).getTime();
    if (now - lastTouchEnd <= 300) {
        event.preventDefault();
    }
    lastTouchEnd = now;
}, false);

来自 但是,这会完全禁用快速点击,虽然会阻止双击缩放,但也会阻止用户快速输入值。有什么方法可以让快速按下按钮,同时禁用双击缩放吗?

将此添加到您的 header。这对我有用。

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

我最终使用以下代码解决了这个问题:参见 Greg 的回答

$(document).click(function(event) {
    element = document.elementFromPoint(event.clientX, event.clientY);
    if(document.getElementById("div_excluded_from_doubletap").contains(element)) {
        event.preventDefault();
        clickFunction(element);
    }
});

CSS 属性 touch-action 适合我。在 iOS 11.1.

上测试
button {
    touch-action: manipulation;
}

有关详细信息,请参阅 MDN:https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action

我的回答有点复杂,但它在停止双击和双指缩放方面运行良好且可靠,并且允许几乎所有其他类型的交互

let drags = new Set() //set of all active drags
document.addEventListener("touchmove", function(event){
  if(!event.isTrusted)return //don't react to fake touches
  Array.from(event.changedTouches).forEach(function(touch){
    drags.add(touch.identifier) //mark this touch as a drag
  })
})
document.addEventListener("touchend", function(event){
  if(!event.isTrusted)return
  let isDrag = false
  Array.from(event.changedTouches).forEach(function(touch){
    if(drags.has(touch.identifier)){
      isDrag = true
    }
    drags.delete(touch.identifier) //touch ended, so delete it
  })
  if(!isDrag && document.activeElement == document.body){
    //note that double-tap only happens when the body is active
    event.preventDefault() //don't zoom
    event.stopPropagation() //don't relay event
    event.target.focus() //in case it's an input element
    event.target.click() //in case it has a click handler
    event.target.dispatchEvent(new TouchEvent("touchend",event))
    //dispatch a copy of this event (for other touch handlers)
  }
})

注意:greg 的回答并不一致(双击某些元素仍会缩放)

如果你想防止双指缩放,你需要一些 JS CSS(不要问我为什么):

document.addEventListener('touchmove', function(event){
  if (event.scale !== 1) event.preventDefault(); //if a scale gesture, don't
})

*{touch-action: pan-x pan-y} /*only allow scroll gestures*/