2010-09-08 149 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。好悲傷!

相關問題