Javascript 在桌面和移动设备上响应touchstart和mousedown,无需嗅探
所以,我有个问题。我想回应用户按下鼠标按钮(在桌面上)或触摸div(在移动设备上)。我正在尝试与长青浏览器兼容。这就是我迄今为止所尝试的:Javascript 在桌面和移动设备上响应touchstart和mousedown,无需嗅探,javascript,dom,mobile,touch,touch-event,Javascript,Dom,Mobile,Touch,Touch Event,所以,我有个问题。我想回应用户按下鼠标按钮(在桌面上)或触摸div(在移动设备上)。我正在尝试与长青浏览器兼容。这就是我迄今为止所尝试的: 仅收听mouseDown事件。这在桌面上有效,但在移动设备上不起作用,如果用户正在拖动。我希望在用户触摸屏幕时立即调用处理程序,无论他们是否在过程中移动手指 仅收听touchStart事件。这适用于移动和桌面,但Edge和Safari桌面除外,它们不支持触摸事件 听这两个,然后preventDefault。这会导致Chrome mobile上的双重处理程序
- 仅收听
事件。这在桌面上有效,但在移动设备上不起作用,如果用户正在拖动。我希望在用户触摸屏幕时立即调用处理程序,无论他们是否在过程中移动手指mouseDown
- 仅收听
事件。这适用于移动和桌面,但Edge和Safari桌面除外,它们不支持触摸事件touchStart
- 听这两个,然后
。这会导致Chrome mobile上的双重处理程序调用。触摸事件似乎是被动的,允许在移动Chrome上不间断地滚动,因此preventDefault
对它们没有影响。我得到的是一条警告消息,上面说,preventDefualt
在控制台中,“[interference]无法在被动事件侦听器中防止默认值,因为目标被视为被动。请参阅https://www.chromestatus.com/features/5093566007214080“
被忽略,我的事件被调用两次preventDefault
function handler(e) {
console.log('handler called')
e.preventDefault()
}
export default function MyElement() {
return (
<div
onMouseDown={handler}
onTouchStart={handler}
>
Hello
</div>
)
}
函数处理程序(e){
log('handler called')
e、 预防默认值()
}
导出默认函数MyElement(){
返回(
你好
)
}
结果是。一种解决方法是在首次接收到touchStart
时设置一个标志
touchHandler = () => {
this.useTouch = true
this.realHandler()
}
mouseHandler = () => {
if (this.useTouch) return
this.realHandler()
}
需要注意的是,如果拖动,第一个touchStart
可能会丢失
非常令人失望。结果是。一种解决方法是在首次接收到touchStart
时设置一个标志
touchHandler = () => {
this.useTouch = true
this.realHandler()
}
mouseHandler = () => {
if (this.useTouch) return
this.realHandler()
}
需要注意的是,如果拖动,第一个touchStart
可能会丢失
相当令人失望