【问题标题】:Number of touchmove events severely reduced on Android 2.3.3Android 2.3.3 上的 touchmove 事件数量严重减少
【发布时间】:2012-04-11 10:29:10
【问题描述】:

我目前正在按照响应式设计 + 移动优先的方法重新设计网站。

我正在尝试在支持触摸的设备上使用 JS 检测滑动事件。为此,我使用以下代码:

document.addEventListener ('touchstart', function(event) {
    //Get initial finger coords
}, false);

document.addEventListener ('touchmove', function(event) {
    //Update final finger coords
}, false);

document.addEventListener ('touchend', function(event) {
    //Compare initial and final coords, trigger swipe events if necessary
}, false);

我已经在 iPad 1、iPhone 4 和几台运行 Android 2.2.1 的设备上测试了这段代码,当我在屏幕上拖动手指时的结果是我所期待的:touchmove 事件触发了几次(做一个长手势时,它很容易上升到一百个)。

当我在 Android 2.3.3 设备(我使用的是三星 Galaxy S2)上测试它时,问题就出现了。使用其原生浏览器,touchmove 事件的数量减少到只有 1 个(或很少有 2 个)。

我做错了什么还是应该表现得像那样?有没有人发现同样的问题?在此版本的 Andriod 中,我无法找到有关 touchmove 事件行为的文档。

您可以在这里进行测试(使用支持触控的设备):http://jsfiddle.net/xs5BG/embedded/result/

【问题讨论】:

    标签: javascript android events mobile swipe


    【解决方案1】:

    在滚动开始工作后,galaxy S2 似乎没有触发 touchmove。如果您执行 preventDefault,它会按预期触发事件。

    【讨论】:

      【解决方案2】:

      使用我的 HTC Desire Z(运行 2.3.3)测试您的 jsFiddle 示例,我得到的不仅仅是一个 touchmove 事件 - 根据需要。所以我无法重现您使用此设备的实际问题,尽管在相同的 API 级别:( 有趣的是,您的代码还显示了我在当前项目中遇到的问题:第一个 touchmove 事件似乎有某种阈值:

      将手指放下并仅移动一点点将产生 0 个 touchmove 事件...一旦超过阈值,它将以毫秒为间隔触发 touchmove 事件,因为它会识别移动的每个像素距离(就像它应该做)。也许这可能与您的现象有关,您是否在 2.3.3 设备上也看到了这一点?

      【讨论】:

        【解决方案3】:

        在许多 Android 版本上,如果您不阻止在 touchstart 上的默认设置,Android 设备将进入默认滚动模式并停止向 webview 发送触摸事件。所以你需要

        document.addEventListener ('touchstart', function(event) {
            event.preventDefault();
        }, false); 
        

        现在所有的触摸事件都会触发,但默认滚动将被禁用。

        有一个 shim 可以模拟滑动手势 https://github.com/TNT-RoX/android-swipe-shim

        来解决这个问题

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-03
          相关资源
          最近更新 更多