移动Safari - 删除最后一次触摸时没有触发的“touchend”事件?

时间:2010-09-08 10:50:31

标签: javascript ipad cordova mobile-safari

我试图捕捉的“手势”只是当一个元素(其他或同一个)已经触摸它时的轻击。因此,触摸(1)按下按钮,同时触摸(2)轻触所选选项,触摸(1)释放按钮。

我遇到的问题是最后一点。当我释放最后一根手指时,“touchend”事件没有被解雇?所以我无法按下按钮?

..“touchend”事件总是有touches.length = 0?

这是一些代码,所以你可以看到我的意思。我想这可能是移动游猎中的一个错误?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <title>Multi-touch problem</title>
        <style>
            #touchpane{
                width:900px;
                height:500px;
                background-color:#333;
            }
        </style>
    </head>
    <body>
        <div id="touchpane" click="void();"></div>
        <script>
                var tp = document.getElementById("touchpane");
                tp.addEventListener('touchstart', function(e){
                    e.preventDefault();// to stop copy and paste
                    console.log("touchstart " + e.touches.length );
                }, false)
                tp.addEventListener('touchend', function(e){
                    console.log("touchend " + e.touches.length );
                                    // not called when last finger removed?
                }, false)
                tp.addEventListener('touchcancel', function(e){
                    console.log("touchcancel");
                }, false)
        </script>
    </body>
</html>

2 个答案:

答案 0 :(得分:3)

我可以帮助你解决一个问题,但我不知道为什么当两个手指离开屏幕时“touchend”没有触发,当我在上面运行你的代码时,当任一个手指离开时,“touchend”会触发屏幕(在iPhone 4上)

1)虽然iPhone的“touchend”javascript事件确实具有“触摸”属性,但当最后一根手指离开屏幕时它总是空的,因为iPhone的“触摸”代表当前触摸屏幕的手指,并且“touchend”仅在手指离开屏幕后触发。因此,在“touchend”中,当最后一根手指被抬起时,“e.touches.length”将始终为0。

2)您可以使用“changedTouches”属性访问“touchend”事件中已更改的触摸。这是有问题的,因为它的行为不是很一致。

如果用一根手指触摸屏幕,然后用另一根手指触摸屏幕,然后移开一根手指,可能会发生很多事情。

如果当你移开第二根手指时,第一根手指没有任何变化,“touchend”中的事件对象将有“touches.length = 1”(手指仍在屏幕上)和“changedTouches.length” = 1“(离开屏幕的手指)。

但是,如果你在移动第二根手指时移动第一根手指(甚至一点点),那么在“touchend”上你的事件对象将会有“touches.length = 1”(手指仍在屏幕上)并且“changedTouches.length = 2”(离开屏幕的手指+第一根手指的移动)。

我发现这篇文章非常有帮助:

http://m14i.wordpress.com/2009/10/25/javascript-touch-and-gesture-events-iphone-and-android/

答案 1 :(得分:0)

touchend类型的TouchEvent的e.touches.length总是为0

失踪的最后一次触球事件可能取决于接触的目标。如果两个手指同时抬起并且两个手指具有相同的目标,那么只有一个触发器会触发,但它将在e.changedTouches对象中同时触摸。如果目标不同,那么您将看到两个touchend事件,每个事件都在changedTouches对象中具有关联的触摸。

此外,最令人费解的是,当你抬起两根手指中的一条时,你会得到同样的行为,就好像你已经抬起两根手指一样。然后,当剩下的手指移动时,它将触发另一个触摸开始,触摸时手指的原始标识符。结果是,在触摸结束时没有办法告诉触摸已经结束直到任意时间量(当剩余手指移动时)。

要验证这一点,您需要记录每个事件中的touchList。 我找到的唯一解决方法是将缓存touchstart事件,setInterval缓存半秒,然后希望剩下的手指触发了我可以用来调和状态的触摸开始。好悲伤!