¿Existe una posición equivalente a e.PageX para el evento 'touchstart' como para el evento de clic?


104

Estoy tratando de obtener la posición X con jQuery de un evento touchstart, usado con la función en vivo.

Es decir

$('#box').live('touchstart', function(e) { var xPos = e.PageX; } );

Ahora, esto funciona con 'clic' como evento. ¿Cómo diablos (sin usar el alpha jQuery Mobile) lo obtengo con un evento táctil?

¿Algunas ideas?

Gracias por cualquier ayuda.


Encontré esto para aquellos que necesitan ayuda con esto: - stackoverflow.com/questions/3183872/… También funciona en touchstart.
encerado

Respuestas:


180

Un poco tarde, pero necesitas acceder al evento original, no al jQuery masajeado. Además, dado que se trata de eventos multitáctiles, es necesario realizar otros cambios:

$('#box').live('touchstart', function(e) {
  var xPos = e.originalEvent.touches[0].pageX;
});

Si desea otros dedos, puede encontrarlos en otros índices de la lista de toques.

ACTUALIZACIÓN PARA JQUERY MÁS RECIENTE:

$(document).on('touchstart', '#box', function(e) {
  var xPos = e.originalEvent.touches[0].pageX;
});

Tiene un paréntesis final que falta al final, debería ser:})
SteveLacy

Estás en lo correcto. ¡Sorprendido que nadie se ha dado cuenta durante 2 años! =) ¡Gracias!
mkoistinen

Desafortunadamente no funcionó para mí, terminé teniendo que obtener la xey en la primera touchmove.
Andrewb

@andrewb, añadir e.preventDefault()en el touchstartcontrolador de eventos.
matewka

Gracias amigo. Bien e.touches[0].pageX;funcionó para mí
Jayant Varshney

43

Utilizo esta función simple para un proyecto basado en JQuery

    var pointerEventToXY = function(e){
      var out = {x:0, y:0};
      if(e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel'){
        var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
        out.x = touch.pageX;
        out.y = touch.pageY;
      } else if (e.type == 'mousedown' || e.type == 'mouseup' || e.type == 'mousemove' || e.type == 'mouseover'|| e.type=='mouseout' || e.type=='mouseenter' || e.type=='mouseleave') {
        out.x = e.pageX;
        out.y = e.pageY;
      }
      return out;
    };

ejemplo:

$('a').on('mousedown touchstart', function(e){
  console.log(pointerEventToXY(e)); // will return obj ..kind of {x:20,y:40}
})

espero que esto te sea útil;)


13
No es necesario verificar el tipo de evento porque e.pageX no estará definido para eventos táctiles. Solo hazloout.x = e.pageX || e.originalEvent.touches[0].pageX;
Griffin

1
Antes de regresar, agrego esta parte para obtener la ubicación porcentual basada en el elemento principal en caso de que ayude a alguien ... var offsetParent = e.target.offsetParent; var parentLeft = e.target.offsetParent.offsetLeft; out.percentX = (out.x - offsetParent.offsetLeft) / offsetParent.offsetWidth; out.percentY = (out.y - offsetParent.offsetTop) / offsetParent.offsetHeight; volver
sradforth

if(e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel'){-> if (e.type.startsWith("touch"))?
gil9red

@Griffin: creo que el problema con su sugerencia es que en el escritorio, cuando el mouse está en el borde izquierdo del documento, la primera rama de su declaración arrojará 0, que se interpreta como falso, y luego los errores del navegador porque tocan no está definido en la segunda rama. ¿De acuerdo?
MSC

13

Probé algunas de las otras respuestas aquí, pero originalEvent también estaba indefinido. Tras la inspección, encontré una propiedad clasificada TouchList (como lo sugirió otro cartel) y logré llegar a pageX / Y de esta manera:

var x = e.changedTouches[0].pageX;

4
esto funciona bien para todos los códigos basados ​​en javascript. tornillo jquery
Martian2049

2
¡Mi Salvador! Funciona perfectamente incluso para touchmove ().
Tibix


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.