Android浏览器未正确处理touchmove事件



当我尝试在这个jsbin演示中检查touchmove事件时,它只在Chrome和Opera for Android中触发一次,然后立即触发touchcancel事件,而不是继续触发touchmove事件?

基于W3C规范,以及Android版Firefox和Android默认浏览器中touchmove事件的行为,在我看来,触摸事件的工作方式是touchmove事件在触摸仍在页面上时不断触发。不过,在尝试在这个jsbin中进行测试后,我得到了以下日志消息:

touchstart event; starting on (140,197) on the screen, or (381,536) on the page.
touchend event; starting on (undefined,undefined) on the screen, or (undefined,undefined) on the page.
touchstart event; starting on (181,137) on the screen, or (492,372) on the page.
touchmove event; starting on (182,153) on the screen, or (495,416) on the page.
touchcancel event; starting on (undefined,undefined) on the screen, or (undefined,undefined) on the page.

这就是我第一次点击屏幕(通过touchstarttouchend显示),然后拖动屏幕(touchstarttouchmovetouchcancel)时发生的情况。根据上面提到的相同规范,touchcancel事件应该只在出现干扰时运行,例如浏览器界面(如果我理解正确的话)。

由于我只是用手指在身体上滑动,根本没有离开窗户,我真的对此感到困惑,所以有人知道为什么会发生这种情况吗?

我在适用于Android的Chrome 32Opera 19中得到了这个意外的结果。

原来这里的问题只是事件处理程序中没有event.preventDefault(),所以原始操作仍然执行,这显然中断了触摸事件。要解决此问题,只需在当前事件处理程序函数中添加e.preventDefault()即可取消当前事件,并使其在Chrome和Opera中也能正常工作。

工作演示

最新更新