安卓移动端滑动不支持touchend事件 bug
Aug 15, 2018
问题背景
使用touchstart
和touchend
实现类似css active
按下效果时发现部分安卓手机按下后就一直保持按下状态。
问题原因
在安卓上,滑动手机屏幕的触发事件过程是这样的(无
touchend
):
touchstart
-> touchmove
在iphone上,滑动手机屏幕的触发事件过程是这样的:
touchstart
->touchmove
-> touchend
所以,在安卓上,滑动不能用 touchend
事件了(这里并不是说本身不能用touchend
事件,只是滑动时无这个事件而已),经过查资料,发现之前很多人说 zepto 中的 touch.js 在微信以及安卓上用 swipe 的时候失效,其实就是因为用了这个touchend
事件,故没有效果。
解决办法
解决办法也不是没有的,先说明一下在移动端的事件:
touchstart
: 手指触摸手机屏幕的触发,即使已经有一个手指放在屏幕上也会触发。touchmove
: 手指在手机屏幕时滑动时连续触发,发生期间,调用event.preventDefault()
可以阻止滚动touchend
: 手机触摸屏幕离开后触发touchcancel
: 当系统停止跟踪触摸的时候触发
如果屏幕不考虑滚动的话,可以在
touchstart
中添加event.preventDefault()
,意思是取消了touchstart
的默认事件,但是这样做就没有了滚动手机屏幕这个效果,这个适用于局部使用。使用
touchcancel
事件,在js中同时绑定touchend
和touchcancel
事件。