【发布时间】:2020-05-16 12:37:46
【问题描述】:
我正在尝试做类似于embedded Google maps 所做的事情。我的组件应该忽略单点触摸(允许用户滚动页面)并在其外部捏合(允许用户缩放页面),但应该对双点触摸做出反应(允许用户在组件内部导航)并在这种情况下禁止任何默认操作。
如何防止默认处理触摸事件,但仅限于用户用两根手指与我的组件交互的情况?
我尝试过的:
我尝试捕获
onTouchStart、onTouchMove和onTouchEnd。事实证明,在 FF Android 上,当在组件上进行捏合时触发的第一个事件是onTouchStart一次触摸,然后是onTouchStart两次触摸,然后是onTouchMove。但是在onTouchMove处理程序中调用event.preventDefault()或event.stopPropagation()不会(总是)停止页面缩放/滚动。在第一次调用onTouchStart时防止事件升级确实有帮助 - 不幸的是,当时我还不知道它是否会是多点触控,所以我不能使用它。 p>第二种方法是在
document.body上设置touch-action: none。这适用于 Chrome Android,但如果我在所有元素(除了我的组件)上设置它,我只能使其适用于 Firefox Android。因此,虽然这是可行的,但似乎它可能会产生不必要的副作用和性能问题。 编辑: 进一步的测试表明,只有在触摸开始之前设置了 CSS 时,这才适用于 Chrome。换句话说,如果我在检测到 2 个手指时注入 CSS 样式,那么touch-action将被忽略。所以这在 Chrome 上没有用。-
我也尝试在组件挂载上添加一个新的事件监听器:
document.body.addEventListener("touchmove", ev => { ev.preventDefault(); ev.stopImmediatePropagation(); }, true);(
touchstart也是如此)。这样做在 Firefox Android 中有效,但在 Chrome Android 上无效。
我的想法不多了。是否有一种可靠的跨浏览器方式来实现谷歌显然所做的事情,或者他们是否在每个浏览器上使用了多种黑客技术和大量测试来使其正常工作?如果有人指出我的方法中的错误或提出新方法,我将不胜感激。
【问题讨论】:
标签: javascript reactjs cross-browser