如果已经滚动(在iPhone上),则touchstart事件不会在可滚动div上触发

时间:2018-03-24 18:35:27

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

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

您找到解决方案了吗?

在发生弹性滚动时,点击touchstart事件也不会触发。既没有touchmove也没有touchend,整个触摸都不会引起Javascript的注意,但是会发生滚动。您得到的只是一个scroll和一个偶然的resize

这可能需要有关WebKit错误跟踪器的报告。

答案 1 :(得分:0)

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

如果将preventDefault()放在touchstart处理程序中,则可以解决此问题(但不能滚动)。根据您的用例,这可能是可接受的解决方案。如我所见,两个可能的选项是:

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

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