我正在尝试让我的一些库适用于触摸设备,但是我很难弄清它们的支持方式和工作原理。
基本上,有5个触摸事件,但似乎移动浏览器只在touchstart
事件上达成了共识(当然)。我创建了一个代码片段作为测试案例。
我已经在我的带有Android 4的Galaxy Note上测试过了,但你也可以在桌面浏览器中查看该链接。
目标是尝试找出如何处理轻敲、双击和长按。没有什么花哨的东西。
基本上,这就是发生的事情:
Android原生浏览器不会触发触摸事件,它只会尝试通过轻敲来模拟鼠标点击,连续触发mousedown
、mouseup
和click
事件,但双击只会放大和缩小页面。
Chrome for Android在手指接触屏幕时触发touchstart
事件。如果它很快被释放,则触发mousedown
、mouseup
、touchend
和最后是click
事件。
在长按的情况下,大约半秒后触发mousedown
和mouseup
,并在抬起手指时触发touchend
,没有最后的click
事件。
如果你移动手指,它会触发一次或两次touchmove
事件,然后触发一个touchcancel
事件,之后什么都不会发生,甚至当你抬起手指时也不会触发touchend
事件。
touchstart
和touchevent
组合两次,没有鼠标事件被触发。对于Android版的Firefox,它会正确地触发
touchstart
事件,并且在短时间内触发mousedown
、mouseup
、touchend
和click
事件。对于长按的情况,它会触发
mousedown
、mouseup
和最后的touchend
事件。对于这些内容,Chrome的表现也是一样的。但如果您移动手指,它会持续触发
touchmove
(如您所预期),但当手指离开带有事件侦听器的元素时,它不会触发touchleave
事件,并且当手指离开浏览器视口时不会触发touchcancel
事件。对于双击,它的行为就像Chrome一样。 Opera Mobile在短时间内做了和Chrome和Firefox一样的事情,但是在长按的情况下会激活某种共享功能,我真的想要禁用它。如果您移动手指或双击,它的行为就像Firefox一样。 Chrome beta对于短时间内的点击做了通常的操作,但是在长时间接触的情况下,它不再触发
mouseup
事件,只有在半秒钟后才会触发touchstart
,然后是mousedown
,最后是当手指抬起时的touchend
。当手指移动时,它的行为现在就像Firefox和Opera Mobile一样。在双击的情况下,它不会在缩小时触发触摸事件,只会在放大时触发。
Chrome beta的行为最奇怪,但我不能抱怨,因为它是一个beta版。
问题是: 是否有一种简单的方法可以在大多数触摸设备最常用的浏览器中尝试检测短按、长按和双击?
很遗憾,我无法在使用Safari的iOS设备或Windows Phone 7/Phone 8/RT上测试它,但如果你们中的一些人可以,你们的反馈将非常感谢。