2010-09-08 8 views
6

El "gesto" que trato de capturar es un toque cuando, pero solo cuando un elemento (otro o igual) ya tiene un toque en él. Por lo tanto, toque (1) presiona el botón hacia abajo mientras toca (2) toca las opciones seleccionadas, toca (1) versiones y se presiona el botón.Mobile Safari: evento "touchend" que no se activa cuando se elimina el último toque?

El problema que estoy teniendo es el último. El evento "touchend" no se dispara cuando suelto el último dedo? Entonces, ¿no tengo forma de presionar el botón?

.. también el evento "touchend" siempre tiene touches.length = 0?

Aquí hay un código para que pueda ver lo que quiero decir. Creo que esto puede ser un error en el safari móvil?

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

Asegúrese de incluir su versión del sistema operativo. Esto funciona como esperaba en 3.1.3 (iPod touch de primera generación): "touchstart 1", "touchstart 2", "touchend 1", "touchend 0". –

+0

Por supuesto, lo siento. 3.2.1 en el iPad. Este y algunos otros parecen haber sido corregidos en 4.2 –

Respuesta

3

Te puedo ayudar con un problema, pero no sé por qué el "touchend" no está disparando cuando ambos dedos salen de la pantalla, cuando corro el código anterior, los fuegos "touchend" cuando cualquiera de los dos dedos sale de la pantalla (en un iPhone 4)

1) Mientras que el evento javascript "touchend" para iPhone tiene la propiedad "toques", siempre va a estar vacío cuando el último dedo sale de la pantalla, porque " toques "para el iPhone representa los dedos que actualmente tocan la pantalla, y" touchend "solo se dispara después de un dedo sale de la pantalla. Entonces en "touchend" "e.touches.length" siempre será 0 cuando se levanta el último dedo.

2) Puede acceder a los toques que han cambiado en el evento "touchend" utilizando la propiedad "changedTouches". Esto es problemático porque su comportamiento no es muy consistente.

Si tocas la pantalla con un dedo, luego con otro, y luego sacas un dedo, pueden suceder varias cosas.

Si al quitar el segundo dedo, nada ha cambiado con el primer dedo, su objeto de evento en "touchend" tendrá "touches.length = 1" (el dedo sigue en la pantalla) y "changedTouches. longitud = 1 "(el dedo que salió de la pantalla).

Sin embargo, si está moviendo el primer dedo (incluso un poco) cuando quita el segundo dedo, entonces en "touchend" su objeto de evento tendrá "touches.length = 1" (el dedo todavía está en la pantalla) y "changedTouches.length = 2" (el dedo que salió de la pantalla + el movimiento del primer dedo).

he encontrado este artículo muy útil:

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

+0

¡Buen enlace! En las pruebas con Android, descubrí que no había ningún objeto evento.touch como se mencionó, pero recomendaría admitir ambas matrices de toques en el código (event.touches y event.changedTouches) ya que ambos parecen confiables en Android e iOS. En mi caso (solo necesito xey de un dedo), probé la modificación de Touches y luego toqué para no ser indefinido y tener longitud === 1, en ese orden –

0

TouchEvent del touchend tipo siempre tienen e.touches.length de 0

El evento faltante última touchend podría depender de los objetivos de los toques. Si ambos dedos se levantan al mismo tiempo Y ambos tienen el mismo objetivo, solo se activará un touchend, pero tendrá ambos toques en el objeto e.changedTouch. Si los objetivos son diferentes, verá dos eventos touchend, cada uno con el toque asociado en el objeto Toques cambiados.

Además, y más desconcertante, es que cuando levanta uno de los dos dedos obtendrá el mismo comportamiento que si hubiera levantado ambos. Luego, cuando el dedo restante se mueva, disparará otro touchstart, con el identificador original de ese dedo en los toques. El resultado es que no hay forma de saber en el momento del touchend qué toque ha finalizado hasta después de una cantidad de tiempo arbitraria (cuando el dedo restante se mueve).

Para verificar esto, necesita documentar las listas táctiles en cada evento. La única solución alternativa que encontré es un cludge en el que guardo en caché los eventos de inicio táctil, establecí Intervalo por medio segundo, luego espero que el dedo restante haya disparado un inicio táctil que pueda usar para reconciliar el estado. Buena pena!

Cuestiones relacionadas