我正在尝试做一些类似于嵌入式谷歌地图所做的事情。我的组件应该忽略单点触摸(允许用户滚动页面)并在其外部捏合(允许用户缩放页面),但应该对双触摸做出react(允许用户在组件内部导航)并在这种情况下禁止任何默认操作。
如何防止触摸事件的默认处理,但仅在用户用两根手指与我的组件交互的情况下?
我尝试过的:
我尝试捕获
onTouchStart
,onTouchMove
和onTouchEnd
. 事实证明,在 FF Android 上,在组件上捏合时触发的第一个事件是onTouchStart
单次触摸,然后onTouchStart
是两次触摸,然后是onTouchMove
. 但是调用event.preventDefault()
或event.stopPropagation()
inonTouchMove
处理程序不会(总是)停止页面缩放/滚动。在第一次调用中防止事件升级onTouchStart
确实有帮助- 不幸的是,当时我还不知道它是否会是多点触控,所以我不能使用它。第二条本办法中设置
touch-action: none
的document.body
。这适用于 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 上不起作用。
我的想法不多了。是否有一种可靠的跨浏览器方式来实现谷歌显然所做的事情,或者他们是否在每个浏览器上使用了多次黑客和大量测试来使其工作?如果有人指出我的方法中的错误或提出新方法,我将不胜感激。