我们正在尝试在我们的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
时才会阻止滚动。
有关正在发生的事情的任何想法?我们感到困惑,因为这显然是一个错误,但它似乎已经修复了一段时间。
答案 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
绑定到两个事件:touchmove
和touchforcechange
才能使其在ios 11中运行,例如
document.addEventListener('touchmove', this.preventDefault, {passive: false});
document.addEventListener('touchforcechange', this.preventDefault, {passive: false});
您应该在触摸开始之前将其绑定
如果将它们绑定在touchstart
或dragStart
处理程序中,则它们只能阻止在下一次拖动中滚动。