首次加载页面时,Android Chrome上永远不会触发Touchstart事件

Yuj*_*uji 22 javascript android google-chrome

在Android Chrome上,当您创建新标签页并访问包含以下内容的页面时,您对#touch div的触摸从未触发过触摸开始事件.重新加载页面后,您可以触发事件.

为什么?我该如何避免这种情况?

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8" />
  <title>touch start on Android</title>
  <style type="text/css">
  #touch, #click {
    position: relative;
    left: 100px;
    top: 100px;
    width: 200px;
    height: 200px;
    border: solid 1px black;
  }
  </style>
</head>
<body>
  <div id="touch">Touch</div>
  <div id="click">Click</div>
  <script type="text/javascript">
  document.getElementById('touch').addEventListener('touchstart', function () { alert ('touch'); } , false);
  document.getElementById('click').addEventListener('click', function () { alert('click'); } , false);
  </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我的环境是,

  1. Nexus 7(2013)
  2. Android 4.30内部版本号JSS15Q
  3. Chrome 29.0.1547.72(WebKit版本537.36(@ 156722),JavaScript版本V8 3.19.18.21)

kre*_*sak -3

旧版 WebKit 中的触摸事件存在一些奇怪的错误。看看这个错误报告:5491、19827、4549、150779

诀窍是添加e.preventDefault()事件touchstart处理程序。这是必需的,因为浏览器处理本机滚动的方式。

android-swipe-shim项目提供了另一个解决方案和更多信息:

在某些 Android 设备上,当用户触摸屏幕时,会触发 touchstart 事件,Android 会将该事件传递给 WebView (javascript) 进行处理。如果 WebView 不阻止默认(200 毫秒内),Android 将恢复本机滚动并停止将触摸事件传递给 WebView。

解决这个问题的方法主要是防止 touchstart 上的默认行为并使用 javascript 手动滚动。

此行为已嵌入数​​百万 Android 设备中,无法从源头上纠正。

该填充程序通过覆盖可本机滚动的包含元素提供了一种解决方案,并根据其滚动偏移触发滑动事件,从而允许您的软件在启用本机滚动的情况下处理移动事件。