我们正在尝试在 iOS web 应用程序中滚动一个元素,同时防止窗口本身滚动。我们捕获窗口上的 touchmove
事件,通过编程方式滚动元素并(尝试)通过在事件上调用 preventDefault
阻止窗口本身滚动。
不幸的是,在 Mobile Safari 中,这种方法不起作用。窗口在我们的元素下面继续滚动。这个问题听起来与 Webkit bug 描述的一样,链接为:https://bugs.webkit.org/show_bug.cgi?id=163207,但是这个问题据说在 iOS 10.3 中已经修复了,而我运行的是 11.3 版本。
捕获 touchforcestart
并调用 preventDefault
确实似乎可以防止窗口滚动,但我们在 touchstart
中调用它似乎“太晚了”,因为窗口仍然滚动。滚动只有在下次调用 touchstart
时才会被阻止。
对于发生了什么事情,有什么想法吗?我们感到困惑,因为显然这是一个 bug,但似乎已经在一段时间前修复了。
touchstart
处理程序中添加了我们的touchmove
侦听器,但由于某种原因,似乎我还需要使用preventDefault
取消它,即使关闭被动也是如此。当我们处理它们后,使用{ passive: false }
以及取消touchstart
和touchmove
事件后,它似乎工作得非常好。 - Matthew Gertner