2011-08-25 7 views
44

Si cojo todos los eventos touchend desde dispositivos móviles con:propiedades de evento touchend

$(document.body).bind('touchend', function (e) { 
var touch = e.touches[0]; // doesnt work 
... 

que necesito para obtener el touch.screenX, touch.screenY, touch.clientX y touch.clientX del correo parametro. Todos los ejemplos que he visto sugieren que e.touches será una colección, y puedes obtener los detalles táctiles con e.touches[0]. En mis pruebas en un ipad, e.touches siempre está indefinido. No estoy usando ningún plugin jquery.

También intenté e.targetTouches, que tampoco está definido.

¿Alguien puede ayudar?

Respuesta

96

En realidad, dado a conocer detalles se pueden encontrar en la matriz changedTouches, es decir:

e.changedTouches[0].pageX // get the end x page coordinate for a released touch

creo que esto es un poco más fiable que ir a través de la propiedad originalEvent.

Puede leer más en changedTouches aquí: http://www.w3.org/TR/touch-events/#changedtouches-of-a-touchevent

+4

En caso de no ser esta la respuesta aceptada? ¡Vota! –

+0

Estoy de acuerdo, esta es la solución correcta. Yo mismo estoy usando esto porque tiene los datos correctos y por qué mezclar más API de las necesarias. –

+2

Este no es el caso con Android si está usando jQuery. $ ('# test'). on ('touchend', función (evt) {console.log (evt.changedTouches);}); está vacío, lo mismo si haces $ ('# test'). bind ('touchend' ... pero si reduces jquery de la ecuación y obtienes GetElementBy y addEventListener funciona ... – WORMSS

10

La propiedad toques es un objeto TouchList. Puede ver la referencia de clase TouchList here.

Si supervisa su propiedad length con este código de ejemplo en div #log:

$('#element').bind('touchstart', function(event) 
{ 
    $('#log').append(event.originalEvent.touches.length+'<br/>'); 
}); 

$('#element').bind('touchmove', function(event) 
{ 
    $('#log').append(event.originalEvent.touches.length+'<br/>'); 
}); 

$('#element').bind('touchend', function(event) 
{ 
    $('#log').append(event.originalEvent.touches.length+'<br/>'); 
}); 

obtendrá 1 durante la ejecución de touchstart y touchmove, un 0 al ejecutar touchend. Es por eso que obtiene indefinido de e.touches[0].

Cuestiones relacionadas