在 Android 2.3.3 上,触摸移动事件的数量大幅减少

Number of touchmove events severely reduced on Android 2.3.3

本文关键字:移动 Android 触摸 事件      更新时间:2023-09-26

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

我正在尝试在支持触摸的设备上使用 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/

似乎Galaxy S2在滚动开始工作后不会触发触摸移动。如果执行 preventDefault,它将按预期触发事件。

使用我的HTC Desire Z(运行2.3.3)测试您的jsFiddle示例,我得到的不仅仅是一个触摸移动事件 - 正如所期望的那样。因此,尽管在同一API级别:(,但我无法重现此设备的实际问题有趣的是,您的代码还显示了我在当前项目中遇到的问题:第一个触摸移动事件似乎具有某种阈值:

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

在许多安卓

版本上,如果你不阻止默认的触摸启动,安卓设备将进入默认滚动模式,并停止向网络视图发送触摸事件。所以你需要

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

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

有一个填充程序可以解决此问题,它模拟滑动手势 https://github.com/TNT-RoX/android-swipe-shim