Android 4.0.x 浏览器不触发 ontouchend 事件的bug

问题是这样的,使用 touch* 事件时,在 Android 4.0 上面的浏览器手指在 a 元素(或者其他任何元素)上做滑动操作,然后手指离开,结果不会触发 touchend 事件。同样的操作在 Android 2.x / ios 却会会正常触发 touchend 事件。到 touchmove 事件之后就终止掉,简单说,就是 touchend 事件丢失。天呐~无疑这是一个非常严重的bug——因为这是一个极其基础的事件,不可或缺!~My God~

已经有许多人把该问题 report 了,详见:

  • WebView touchevents are not fired propperly if e.preventDefault() is not used on touchstart and touchmove
  • In webkit/webview touchmove/touchstart/touchend events get queued and don't fire until touch ends

怎么破?在 touchmove 事件中 e.preventDetault() 居然就可以。

但是简单调用 e.preventDetault() 会导致另外一个问题,就是阻止了屏幕上下滚动的 scorll 事件。




原文链接



监听一个 DOM 元素的 touchstart, touchmove, touchend 事件.
如果只是 touch 一下这个 DOM 元素, 会触发 touchstart, touchend, 很正常.
如果按住这个 DOM 元素, 滑动一下后放手, 发现只会触发 touchstart, touchmove, 而且 touchmove 没有触发多次.
因此这个bug的触发点就是:
如果触发了 touchmove, touchend 就不会被触发了, 而且 touchmove 没有持续触发.
在网上收集了一些资料后发现此乃移动浏览器上的bug.
> On Android ICS if no preventDefault is called on touchstart or the firsttouchmove,
> further touchmove events and the touchend will not be fired.

如何修复这个bug
----------------
很简单, 只要在 touchstart 的时候调用下 event.preventDefault(), 即可让其他事件都正常被触发了!


原文链接


你可能感兴趣的:(JS,&,jquery,javascript,jquery,div+css)