115

I'm trying to get the X position with jQuery of a touchstart event, used with the live function?

I.e.

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

Now, this does work with 'click' as the event. How on earth (without using the alpha jQuery Mobile) do I get it with a touch event?

Any ideas?

Thanks for any help.

waxical
  • 3,826
  • 8
  • 45
  • 69
  • 1
    I found this for those who are needing help on this:- http://stackoverflow.com/questions/3183872/does-jquery-preserve-touch-events-properties It also works on touchstart. – waxical Jan 24 '11 at 10:42

5 Answers5

191

Kinda late, but you need to access the original event, not the jQuery massaged one. Also, since these are multi-touch events, other changes need to be made:

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

If you want other fingers, you can find them in other indices of the touches list.

UPDATE FOR NEWER JQUERY:

$(document).on('touchstart', '#box', function(e) {
  var xPos = e.originalEvent.touches[0].pageX;
});
mkoistinen
  • 7,724
  • 3
  • 41
  • 56
48

I use this simple function for JQuery based project

    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;
    };

example:

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

hope this will be usefull for you ;)

Nedudi
  • 5,639
  • 2
  • 42
  • 37
  • 15
    There's no need to check the event type because e.pageX will be undefined for touch events. Just do `out.x = e.pageX || e.originalEvent.touches[0].pageX;` – Griffin Apr 30 '14 at 17:33
  • 1
    Before returning out I add this part to get the percentage location based on the parent element in case it helps anyone... 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; return out; – sradforth Apr 24 '15 at 20:45
  • `if(e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel'){` -> `if (e.type.startsWith("touch"))` ? – gil9red Jun 29 '18 at 08:52
  • @Griffin - I think the problem with your suggestion is that on desktop, when the mouse is on the left edge of the document, the first branch of your statement will yield 0, which is interpreted as false, and then the browser errors because touches is undefined on the second branch. Agree? – MSC Feb 20 '19 at 07:07
20

I tried some of the other answers here, but originalEvent was also undefined. Upon inspection, found a TouchList classed property (as suggested by another poster) and managed to get to pageX/Y this way:

var x = e.changedTouches[0].pageX;
matt.chatterley
  • 344
  • 2
  • 7
9

If you're not using jQuery... you need to access one of the event's TouchLists to get a Touch object which has pageX/Y clientX/Y etc.

Here are links to the relevant docs:

I'm using e.targetTouches[0].pageX in my case.

Scott Jungwirth
  • 6,105
  • 3
  • 38
  • 35
0

Check Safari developer reference on Touch class.

According to this, pageX/Y should be available - maybe you should check spelling? make sure it's pageX and not PageX

Tom Tu
  • 9,573
  • 35
  • 37