iOS Safari 触摸事件在 17.4.1 中停止触发

问题描述 投票:0回答:1

我们在长期存在的与 iOS Safari 触摸事件相关的代码库中遇到了一个新问题。我们的教育游戏具有拖放式功能(拖动卡片或拼图)。这个问题刚刚在 17.4.1 中开始出现在不同代的几款 iPad 上,我们通过测试确认这不是 17.3.1 或任何之前版本的问题。升级到 17.4.1 后问题立即出现。它也体现在 17.5 beta 中。

我们在几次用户交互中收到

touchstart
touchmove
touchend
事件,然后在
touchend
之后,我们在几秒钟内不再收到任何
touchstart
事件。直接与 Safari 交互(例如滚动选项卡等)通常会导致下次触摸页面时再次工作。这是一个非常低级的问题,浏览器根本不会触发处理程序函数。它发生在一些随机数量的触摸交互之后 - 有时只需要一两次,其他时候可能需要数十次才能触发。

有趣的是,当触摸事件发生在画布上我们不关心的区域时,因此我们不做任何绘图作为响应,问题不会显现出来,并且它们总是会触发。如果我们绘制响应(间接 - 见下文),那么在一些随机数量的

touchstart
touchend
交互之后,它就会停止。

我们可以渲染 WebGL 或直接渲染到画布,无论我们使用哪种方法都会出现问题。

所有渲染都与实际触摸事件分离 - 我们通过

requestAnimFrame
进行所有绘制,并且仅绘制画布的“脏”或已更改区域。

是否有其他人遇到类似的问题,即与 17.4.1 进行几次交互后触摸事件停止工作?

到目前为止,这已体现在:

  • iPad 第 6 代
  • iPad 第 9 代
  • iPad Pro 第四代(M2)
  • iPhone 13 Pro
javascript ios safari
1个回答
0
投票

我们已经找到了解决此问题的方法。我们的事件处理程序附加到画布(或实验性地覆盖整个页面的 div),这将表明我们停止接收触摸事件的问题。

将事件直接附加到

document.body
会导致事件不间断。我怀疑这个错误的部分原因在于我们有多层画布相互叠加,并且由于某种原因某些东西正在获取在特定情况下不应该获取的输入。

© www.soinside.com 2019 - 2024. All rights reserved.