【问题标题】:touchstart event does not trigger on scrollable div if already scrolling (on iPhone)如果已经滚动(在 iPhone 上),touchstart 事件不会在可滚动的 div 上触发
【发布时间】:2018-09-03 05:41:54
【问题描述】:

我在 iPhone 6 设备上滚动时遇到了这个问题(在 Safari 和 Chrome 上测试):

给定一个可滚动的 div,如果我在 div 已经在惯性滚动运动时触摸它,滚动运动会按预期停止,但 touchstart 事件根本不会触发。

在小米 Android 设备上测试(在 Chrome 上测试)时,滚动停止并且触发touchstart 事件。

为什么touchstart 没有被触发?这是 iPhone 上的标准行为吗?

我已经设置了一个小提琴来测试这种行为:

https://fiddle.jshell.net/galoxia/L63wj9or/

只需在蓝色框上做出“激活”惯性滚动的手势,然后再次触摸即可停止。在 Android 上,您将在黄色框中看到 touchstart。在 iPhone 上你不会。

【问题讨论】:

    标签: web scroll mobile-safari touch-event touchstart


    【解决方案1】:

    我在尝试用 JavaScript 为触摸设备实现双击处理程序时遇到了同样的问题。如果在 iOS Safari 中发生动量滚动,则在初始 touchstart(启动滚动的 touchstart)之后的大约 500 毫秒内不会发送 touchstart 事件。

    如果您将preventDefault() 放入touchstart 处理程序中,则可以解决问题(但会禁用滚动)。根据您的用例,这可能是一个可接受的解决方案。在我看来,两种可能的选择是:

    1. 禁用“通过触摸进行本机滚动”并接收所有touchstart 事件(在touchstart 处理程序中使用preventDefault()
    2. 启用“通过触摸进行本机滚动”,但在滚动初始 touchstart 后大约 500 毫秒内未收到 touchstart 事件

    我很想被证明是错误的。如果有办法始终如一地获取touchstart 事件,而无需在touchstart 处理程序中调用preventDefault() 并且不会破坏本机滚动,请在此处发表评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多