Событие касания не возвращает данные касания
Изменить: "Это не может быть сделано в Angular UI Modals" является правильным ответом, если это действительно так.
Это возвращаемые данные, которые я получаю от сенсорного события. Очевидно, отсутствуют какие-либо полезные сенсорные координаты X/Y ( https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/changedTouches). Это безнадежно общий вопрос, но, тем не менее, есть идеи? Объект "событие" передается функции, выполняемой при прикосновении:
{
"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
}
Теперь это IS в угловом модальном интерфейсе на холсте, но события мыши работают нормально. Вот мой элемент между прочим:
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');
Вот пример того, как я связываю:
element.bind('touchstart', scope.touchStart);
Отредактируйте, и вот объект события mousedown для сравнения:
{
"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
}
3 ответа
Например, вы можете связать события касания, используя директивы, внутри директивы может быть такой код,
element.on('touchstart', function (event) {
event = event.originalEvent || event;
//actions
event.stopPropagation(); //if you need stop the propagation of the event
});
Также нужно внимательно следить за поведением 4-х типов сенсорных событий (touchstart, touchend, touchmove, touchcancel) в зависимости от ваших целей. Для захвата положения курсора используйте,
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();
});
var touchRelativeToViewWindow = {
x: event.originalEvent.touches[0].pageX,
y: event.originalEvent.touches[0].pageY
};
Лучше поздно, чем никогда (обратите внимание, это для touchmove
):
Проходя через AngularJs/jQuery, нам нужно посмотреть в originalEvent
для всех деталей. Обратите внимание, что [0]
часть может указывать на несколько одновременных касаний. Я не знаю, как они заказаны, но touches[0]
может быть первым пальцем и touches[1]
может быть второй палец. Решение выше работает для меня, потому что я ожидаю, что пользователь будет использовать только стилус.
Чтобы получить координаты x и y, попробуйте использовать следующий код
x1 = event.touches[0].pageX;
y1 = event.touches[0].pageY;