Android 2.3.3上的touchmove事件数量严重减少

时间:2012-04-11 10:29:11

标签: javascript android events mobile swipe

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

我正在尝试在启用触摸的设备上使用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)。使用其原生broswer,touchmove事件的数量减少到只有1(或很少2)。

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

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

3 个答案:

答案 0 :(得分:2)

似乎在滚动开始工作后,星系S2不会触发touchmove。如果你执行了preventDefault,它会按预期触发事件。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

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

的问题