无法阻止iOS上滚动窗口的“touchmove”

时间:2018-03-26 20:46:50

标签: ios scroll mobile-safari preventdefault touchmove

我们正在尝试在我们的iOS网络应用上滚动元素,同时防止窗口本身滚动。我们正在窗口上捕获touchmove事件,以编程方式滚动元素并(尝试)通过在事件上调用preventDefault来阻止窗口本身滚动。

不幸的是,这在Mobile Safari中不起作用。窗口继续在我们的元素下滚动。问题听起来与https://bugs.webkit.org/show_bug.cgi?id=163207中描述的Webkit错误完全相同,但该问题在iOS 10.3中已得到修复,而我运行的是11.3。

抓住touchforcestart并呼叫preventDefault似乎阻止了滚动窗口,但我们在touchstart中调用它,这似乎太晚了#34;因为窗口仍然滚动。只有在下次调用touchstart时才会阻止滚动。

有关正在发生的事情的任何想法?我们感到困惑,因为这显然是一个错误,但它似乎已经修复了一段时间。

2 个答案:

答案 0 :(得分:54)

我最近遇到了同样的问题。注册using gl_ivec3 = glm::tvec<GLint, 3>; ... glm::gl_ivec3 iv = bv; glUniform3iv(some_uniform_id, 1, glm::value_ptr(iv)); 事件监听器时,您需要传递{ passive: false }。 e.g。

touchmove

这是因为默认情况下,文档触摸事件侦听器在Safari 11.1中是被动的,它与iOS 11.3捆绑在一起。 Safari 11.1 release notes中记录了此更改:

  

Web API

     
      
  • [...]
  •   
  • 更新了根文档触摸事件侦听器,以使用被动模式提高滚动性能并减少崩溃。
  •   

答案 1 :(得分:3)

您需要将preventDefault绑定到两个事件:touchmovetouchforcechange才能使其在ios 11中运行,例如

document.addEventListener('touchmove', this.preventDefault, {passive: false});
document.addEventListener('touchforcechange', this.preventDefault, {passive: false});

您应该在触摸开始之前将其绑定

如果将它们绑定在touchstartdragStart处理程序中,则它们只能阻止在下一次拖动中滚动。