2010-09-08 109 views
6

我试图捕捉的“手势”是一个点击,但只有当一个元素(其他或相同)已经触摸它时才会点击。因此,触摸(1)按下按钮,同时触摸(2)轻触所选选项,触摸(1)释放并按下按钮。移动Safari - “touchend”事件在最后一次触摸移除时不会触发?

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

..此外,“touchend”事件总是touches.length = 0?

这里有一些代码,所以你可以看到我的意思。我认为这可能是移动Safari中的一个错误?

<!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> 
+0

一定要包含您的操作系统版本。这在3.1.3(第一代iPod touch)中的预期效果:“touchstart 1”,“touchstart 2”,“touchend 1”,“touchend 0”。 – 2010-12-10 21:59:57

+0

当然对不起。 3.2.1在iPad上。这和其他一些似乎已经修复在4.2 – 2011-01-01 19:23:47

回答

3

我可以帮你一个问题,但我不知道为什么“touchend”当两个手指离开屏幕,当我运行上面的代码不点火,将“touchend”火灾时, 1)虽然iPhone的“touchend”javascript事件确实有“touches”属性,但最后一个手指离开屏幕时它总是空的,因为“手指离开屏幕(在iPhone 4上)触摸“代表手指当前正在触摸屏幕,而”touchend“仅在之后触发手指离开屏幕。所以在“touchend”中,“e.touches.length”在最后一根手指被抬起时总是为0。

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

如果您用一个手指触摸屏幕,然后另一个手指,然后您删除一个手指,可能会发生一些事情。

如果您在删除第二根手指后,第一根手指没有任何变化,则“touchend”中的事件对象将具有“touches.length = 1”(手指仍在屏幕上)和“changedTouches”。长度= 1“(离开屏幕的手指)。但是,如果您在移除第二根手指时移动第一根手指(即使是一点),则在“touchend”上,您的事件对象将具有“touches.length = 1”(手指仍在屏幕上)和“changedTouches.length = 2”(离开屏幕的手指+第一手指的移动)。

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

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

+0

伟大的链接!在Android上进行测试时,我发现上面没有event.touch对象,但我建议在代码(event.touches和event.changedTouches)中支持这两个触摸数组,因为它们在Android和iOS中都看起来很可靠。在我的情况下(只需要从一个手指x和y)我测试changedTouches然后触摸未定义和长度=== 1,按顺序 – 2011-09-16 17:48:34

0

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

缺少最后touchend事件可能是依赖于目标触动。如果两个手指同时抬起并且两个手指都具有相同的目标,则只有一个触控笔会触发,但它们都会触及e.changedTouches对象。如果目标不同,则会看到两个touchend事件,每个touchend事件都在changedTouches对象中具有关联的触摸。

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

要验证这一点,您需要在每个事件中记录touchLists。 我发现的唯一解决方法是缓存touchstart事件,setInterval半秒钟,然后希望剩下的手指已经触发了我可以用来协调状态的touchstart。好悲伤!

相关问题