2010-09-08 17 views
6

Il "gesto" che sto cercando di catturare è un tap quando, ma solo quando un elemento (altro o uguale) ha già un tocco su di esso. Quindi, tocca (1) preme il pulsante mentre tocca (2) tocca le opzioni selezionate, tocca (1) rilasci e il pulsante è premuto.Safari mobile - evento "touchend" che non si attiva quando viene rimosso l'ultimo tocco?

Il problema che sto avendo è con l'ultimo bit. L'evento "touchend" non viene sparato quando rilascio l'ultimo dito? Quindi non ho modo di premere il pulsante?

..anche l'evento "touchend" ha sempre touch.lunghezza = 0?

Ecco un codice in modo da poter vedere cosa intendo. Penso che questo possa essere un bug nel safari mobile?

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

Assicurarsi di includere la versione del sistema operativo. Funziona come previsto per me in 3.1.3 (first-gen iPod touch): "touchstart 1", "touchstart 2", "touchend 1", "touchend 0". –

+0

Naturalmente mi dispiace. 3.2.1 sull'iPad. Questo e alcuni altri sembrano essere stati risolti in 4.2 –

risposta

3

ti posso aiutare con un problema, ma io non so perché il "touchend" non è sparare, quando entrambe le dita di lasciare lo schermo, quando si esegue il codice sopra, i fuochi "touchend" quando o un dito lascia lo schermo (su un iPhone 4)

1) Mentre l'evento javascript "touchend" per iPhone ha la proprietà "tocca", sarà sempre vuoto quando l'ultimo dito lascia lo schermo, perché " tocca "per l'iPhone rappresenta le dita che attualmente toccano lo schermo, e" touchend "spara solo dopo un dito lascia lo schermo. Quindi su "touchend" "e.touches.length" sarà sempre 0 quando l'ultimo dito viene sollevato.

2) È possibile accedere a quali tocchi sono cambiati nell'evento "touchend" utilizzando la proprietà "changedTouches". Questo è problematico perché il suo comportamento non è molto coerente.

Se si tocca lo schermo con un dito, poi un altro, e quindi si rimuove un dito, potrebbero verificarsi alcune cose.

Se hai rimosso il secondo dito, non è cambiato nulla sul primo dito, l'oggetto evento in "touchend" avrà "touches.length = 1" (il dito sullo schermo ancora) e "changedTouches". length = 1 "(il dito che ha lasciato lo schermo).

Tuttavia, se si sposta il primo dito (anche un po ') quando si rimuove il secondo dito, quindi su "touchend" l'oggetto evento avrà "touches.length = 1" (il dito sullo schermo) e "changedTouches.length = 2" (il dito che ha lasciato lo schermo + il movimento del primo dito).

Ho trovato questo articolo molto utile:

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

+0

Ottimo link! Nei test su Android ho trovato che non ci sono oggetti event.touch come accennato, ma consiglierei di supportare entrambi gli array di tocchi nel codice (event.touches ed event.changedTouches) poiché entrambi sembrano affidabili in Android e iOS. Nel mio caso (ho solo bisogno di xey da un dito), ho eseguito il test modificatoTouches, quindi tocchi per non essere indefinito e con lunghezza === 1, in questo ordine –

0

TouchEvent del tipo touchend hanno sempre e.touches.length di 0

L'ultimo evento touchend mancante potrebbe essere dipendente gli obiettivi di i tocchi. Se entrambe le dita si sollevano contemporaneamente E hanno entrambi lo stesso bersaglio, solo un touchend scatterà, ma avrà entrambi i tocchi nell'oggetto e.changedTouches. Se i bersagli sono diversi, vedrai due eventi touchend, ciascuno con il tocco associato nell'oggetto changedTouches.

Inoltre, e per lo più sconcertante, è che quando si alza una delle due dita si ottiene lo stesso comportamento come se si fosse sollevato entrambi. Quindi, quando il dito rimanente si muove, scatterà un altro tocco, con l'identificatore originale di quel dito nei tocchi. Il risultato è che non c'è modo di dire al momento del tocco in cui il tocco è finito fino a dopo una quantità arbitraria di tempo (quando il dito rimanente si muove).

Per verificare questo è necessario documentare gli elenchi di tocco in ciascun evento. L'unica soluzione che ho trovato è un rancore in cui memorizzo nella cache gli eventi touchstart, setInterval per mezzo secondo, quindi spero che il dito rimanente abbia attivato un touchstart che posso usare per riconciliare lo stato. Buon dolore!

Problemi correlati