应该调用哪个触摸事件 e.preventDefault() 来取消触摸设备上的“单击”

Which touch event should e.preventDefault() be called in to cancel a "click" on a touch device?

本文关键字:触摸 取消 单击 调用 事件 preventDefault      更新时间:2023-09-26

若要防止触发单击,可以在click事件处理程序中调用e.preventDefault()。这使您可以将事件绑定到mousedown,查看是否发生了诸如鼠标移动一定距离之类的事情,如果是,请在释放鼠标按钮时阻止单击。

但是,具有e.preventDefault()的单击处理程序似乎不会阻止某些触摸设备上的单击。(我正在iPad mini上测试)。我还尝试在touchend处理程序中调用e.preventDefault(),这似乎什么也没做。

touchstart中调用e.preventDefault()会阻止页面滚动,并且也毫无用处,因为现在判断是否应该取消点击还为时过早。只有touchmove才能决定是否需要取消。

问题是,当用户拖动一个也是链接的可拖动元素时,它需要取消fingerup上链接的"单击"。通过取消点击事件,这在桌面上工作得很好。

是否有我可以取消的等效事件,一旦用户抬起手指,就可以阻止"武装点击"关闭?

已知

iOS 不会注册 click 事件属性。这可能是因为 iOS 需要等待更长的时间来确定点击应如何解释为:

  • 捏合/缩放手势的开始
  • 双指或多指平移
  • 滚动的开始
  • 双击的开始
  • 一个简单的点击事件(我们试图捕获)
  • 触摸并按住的开始

因此,您可以改为收听包含在 jQuery Mobile 中的 tap 事件。

jQuery 移动点击事件在快速、完整的触摸后触发 在单个目标对象上发生的事件。是姿态 等效于在发布时触发的标准点击事件 触摸手势的状态。

tap事件不是本机事件,因为它依赖于有条件地侦听touchstart来确定开始和停止目标是否相同:如果是,jQuery Mobiel 确定它确实是真正的tap事件,并触发自定义的非本机事件tap。此逻辑可以在原始源文件中看到,在第 ./js/events/touch.js 行的第 75 行以后。

用法示例如下:

$(selector).on('tap', function(e){
    e.preventDefault();
});