我有一些子div在一个可滚动的区域内,就像这样:
<div style='overflow: scroll;'>
<div id='a' />
<div id='b' />
<div id='c' />
...
</div>
我在每个子元素上监听pointerdown事件,当其中一个触发时,我会在文档上设置pointermove处理程序。例如:
const pointerdownHandle = e => {
e.target.releasePointerCapture(e.pointerId)
document.addEventListener('pointermove', pointermoveHandle)
document.addEventListener('pointerup', pointerupHandle)
}
const pointermoveHandle = e => { ... }
const pointerupHandle = {
document.removeEventListener('pointermove', pointermoveHandle)
document.removeEventListener('pointerup', pointerupHandle)
}
document.getElementById('a').addEventListener('pointerdown', pointerdownHandle)
这在桌面端和iOS Safari上运行得很好。 但是在Android Chrome上,pointercancel事件几乎立即触发,导致出现问题。
这似乎是预期的行为:“当浏览器确定不太可能有更多指针事件时,或者在触发pointerdown事件后,指针被用于通过平移,缩放或滚动来操作视口时,会触发pointercancel事件。”
推荐的解决方案是将css属性“touch-action:none”应用于父元素。 这样做是有效的。 但是不幸的是,这也会破坏滚动,因为现在触摸操作被忽略了。
我尝试在pointerdown事件触发后以编程方式应用css属性,但这没有起作用。 将preventDefault / stopPropagation添加到pointermoveHandle也不起作用。
有人解决了这个问题吗? 如何停止触发pointercancel事件而不禁用父元素上的滚动?
(我意识到可以退回到触摸事件,但支持pointerenter和pointerleave的指针事件更简单、更易清理。)
touch-action: pan-y
吗? - Andre Nuechter