Touch Event Not Returning Touch Data
Asked Answered
F

3

12

Edit: "This can't be done in Angular UI Modals" is a valid answer, if that's actually the case.

This is the return data I get from a touch event. Conspicuously missing are any useful touch X/Y coords (https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/changedTouches). This is a hopelessly generic question, but nonetheless, any ideas? The "event" object passed to the function executed on touch:

{
      "originalEvent": {
        "isTrusted": true
      },
      "type": "touchstart",
      "timeStamp": 1450388006795,
      "jQuery203026962137850932777": true,
      "which": 0,
      "view": "$WINDOW",
      "target": {},
      "shiftKey": false,
      "metaKey": false,
      "eventPhase": 3,
      "currentTarget": {},
      "ctrlKey": false,
      "cancelable": true,
      "bubbles": true,
      "altKey": false,
      "delegateTarget": {},
      "handleObj": {
        "type": "touchstart",
        "origType": "touchstart",
        "data": null,
        "guid": 2026,
        "namespace": ""
      },
      "data": null
    }

Now, this IS in an angular UI modal in canvas, but mouse events work fine. Here is my element btw:

link: function(scope, element, attrs, model){
                //scope.canvasElem = element[0].children[0].children[0];
                scope.canvasElem = angular.element($('.touchScreen'))[0];
                scope.ctx = scope.canvasElem.getContext('2d');

Here is an example of how I bind:

element.bind('touchstart', scope.touchStart);

Edit, and here is a mousedown event object for comparison:

{
  "originalEvent": {
    "isTrusted": true
  },
  "type": "mousedown",
  "timeStamp": 1450389131400,
  "jQuery20309114612976554781": true,
  "toElement": {},
  "screenY": 436,
  "screenX": 726,
  "pageY": 375,
  "pageX": 726,
  "offsetY": 81,
  "offsetX": 41,
  "clientY": 375,
  "clientX": 726,
  "buttons": 1,
  "button": 0,
  "which": 1,
  "view": "$WINDOW",
  "target": {},
  "shiftKey": false,
  "relatedTarget": null,
  "metaKey": false,
  "eventPhase": 3,
  "currentTarget": {},
  "ctrlKey": false,
  "cancelable": true,
  "bubbles": true,
  "altKey": false,
  "delegateTarget": {},
  "handleObj": {
    "type": "mousedown",
    "origType": "mousedown",
    "data": null,
    "guid": 2025,
    "namespace": ""
  },
  "data": null
}
Flageolet answered 29/11, 2015 at 0:42 Comment(0)
G
2

For example you can bind the touch events using directives, inside the directive could have a code like this,

element.on('touchstart', function (event) {
     event = event.originalEvent || event;
     //actions
     event.stopPropagation();   //if you need stop the propagation of the event
});

also need to have careful about the behavior of the 4 types of touch events (touchstart, touchend, touchmove, touchcancel) depending on your goals. For capture the position of the cursor use,

element.on('touchmove', function (event) {
    event.preventDefault();
    if (event.targetTouches.length == 1) {  //when only has one target in touch
         var touch = event.targetTouches[0];
        // Place element where the finger is
        var x = touch.pageX + 'px';
        var y = touch.pageY + 'px';
    }
    event.stopPropagation();
});
Gangland answered 24/12, 2015 at 1:42 Comment(0)
F
1
var touchRelativeToViewWindow = {
    x: event.originalEvent.touches[0].pageX,
    y: event.originalEvent.touches[0].pageY
};

Better late than never (note, this is for touchmove):

When going through AngularJs/jQuery, we need to look in the originalEvent for all the details. Note that the [0]part could indicate multiple simultaneous touches. I don't know how they are ordered, but touches[0] could be first finger and touches[1] could be second finger. The solution above worked for me because I only expect the user to use a stylus.

Flageolet answered 13/5, 2016 at 15:13 Comment(1)
This is the correct answer. There are two issues at play here: 1) When using jQuery, you have to use originalEvent (as VSO notes here) 2) When inspecting an event object, you can't readily dump it to JSON to see everything - event objects include DOM object references which are circular. So, despite it not showing up in the JSON dump, there is an event.originalEvent.touches[] array. See here for discussion: #11548172Organogenesis
D
0

To get x and y co-ordinates try using below code

x1 = event.touches[0].pageX;
y1 = event.touches[0].pageY;
Deannadeanne answered 21/12, 2015 at 12:39 Comment(1)
The events are posted. they don't have a touches property.Flageolet

© 2022 - 2024 — McMap. All rights reserved.