Existe-t-il une position équivalente à la position e.PageX pour l'événement 'touchstart' comme il y en a pour l'événement click?


104

J'essaie d'obtenir la position X avec jQuery d'un événement touchstart, utilisé avec la fonction live?

C'est à dire

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

Maintenant, cela fonctionne avec «clic» comme événement. Comment diable (sans utiliser l' alpha jQuery Mobile) puis-je l'obtenir avec un événement tactile?

Des idées?

Merci pour toute aide.


J'ai trouvé ceci pour ceux qui ont besoin d'aide sur ceci: - stackoverflow.com/questions/3183872/... Cela fonctionne également sur touchstart.
waxical le

Réponses:


180

Un peu tard, mais vous devez accéder à l'événement d'origine, pas à celui massé jQuery. De plus, comme il s'agit d'événements multi-touch, d'autres modifications doivent être apportées:

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

Si vous voulez d'autres doigts, vous pouvez les trouver dans d'autres index de la liste des touches.

MISE À JOUR POUR LES NOUVEAUX JQUERY:

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

Vous avez une parenthèse de fin manquante à la fin, elle devrait être:})
SteveLacy

Tu as raison. Surpris que personne ne l'ait remarqué depuis 2 ans! =) Merci!
mkoistinen le

Malheureusement, cela n'a pas fonctionné pour moi, j'ai fini par avoir à obtenir le x et le y sur le premier touchmove.
andrewb

@andrewb, ajouter e.preventDefault()au touchstartgestionnaire d'événements.
matewka le

Merci mon pote. Bien e.touches[0].pageX;travaillé pour moi
Jayant Varshney

43

J'utilise cette fonction simple pour un projet basé sur 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;
    };

exemple:

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

j'espère que cela vous sera utile;)


13
Il n'est pas nécessaire de vérifier le type d'événement car e.pageX ne sera pas défini pour les événements tactiles. Just doout.x = e.pageX || e.originalEvent.touches[0].pageX;
Griffin

1
Avant de revenir, j'ajoute cette partie pour obtenir l'emplacement du pourcentage basé sur l'élément parent au cas où cela aiderait quelqu'un ... 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; revenir;
sradforth

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

@Griffin - Je pense que le problème avec votre suggestion est que sur le bureau, lorsque la souris est sur le bord gauche du document, la première branche de votre déclaration donnera 0, ce qui est interprété comme faux, puis les erreurs du navigateur car elles touchent n'est pas défini sur la deuxième branche. Se mettre d'accord?
MSC

13

J'ai essayé quelques-unes des autres réponses ici, mais originalEvent était également indéfini. Lors de l'inspection, j'ai trouvé une propriété classée TouchList (comme suggéré par une autre affiche) et j'ai réussi à accéder à pageX / Y de cette façon:

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

4
cela fonctionne bien pour tous les codes basés sur javascript. vis jquery
Martian2049

2
Mon Sauveur! Fonctionne parfaitement même pour touchmove ().
Tibix


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.