Определить вертикальное направление касания
Я пытаюсь реализовать сенсорный приемник для таблеток, чтобы вызвать некоторые действия в зависимости от того, касаются ли они вверх или вниз.
Я попробовал собственный слушатель:
($document).bind('touchmove', function (e)
{
alert("it worked but i don't know the direction");
});
Но я не знаю, как определить направление.
Возможно ли это?
Или мне нужно использовать touchstart/touchhend, если мне это нужно, я могу определить направление до остановки касания?
Если я могу сделать это только с помощью внешней библиотеки, какой лучший?
спасибо.
Ответы
Ответ 1
Вам нужно сохранить последнюю позицию касания, а затем сравнить ее с текущей.
Пример:
var lastY;
$(document).bind('touchmove', function (e){
var currentY = e.originalEvent.touches[0].clientY;
if(currentY > lastY){
// moved down
}else if(currentY < lastY){
// moved up
}
lastY = currentY;
});
Ответ 2
У меня были некоторые проблемы в Ipad и решили его с двумя событиями
var ts;
$(document).bind('touchstart', function (e){
ts = e.originalEvent.touches[0].clientY;
});
$(document).bind('touchend', function (e){
var te = e.originalEvent.changedTouches[0].clientY;
if(ts > te+5){
slide_down();
}else if(ts < te-5){
slide_up();
}
});
Ответ 3
Ответ Aureliano кажется действительно точным, но почему-то это не сработало для меня, поэтому, давая ему кредиты, я решил улучшить его ответ со следующим:
var ts;
$(document).bind('touchstart', function(e) {
ts = e.originalEvent.touches[0].clientY;
});
$(document).bind('touchmove', function(e) {
var te = e.originalEvent.changedTouches[0].clientY;
if (ts > te) {
console.log('down');
} else {
console.log('up');
}
});
Я просто изменил событие 'touchend'
на 'touchmove'
Ответ 4
Я создал script, который обеспечит прокрутку элемента внутри вашего документа без прокрутки всего остального, включая тело. Это работает как в браузере, так и в мобильном устройстве/планшете.
// desktop scroll
$( '.scrollable' ).bind( 'mousewheel DOMMouseScroll', function ( e ) {
var e0 = e.originalEvent,
delta = e0.wheelDelta || -e0.detail;
this.scrollTop += delta * -1;
e.preventDefault();
});
var lastY;
var currentY;
// reset touch position on touchstart
$('.scrollable').bind('touchstart', function (e){
var currentY = e.originalEvent.touches[0].clientY;
lastY = currentY;
e.preventDefault();
});
// get movement and scroll the same way
$('.scrollable').bind('touchmove', function (e){
var currentY = e.originalEvent.touches[0].clientY;
delta = currentY - lastY;
this.scrollTop += delta * -1;
lastY = currentY;
e.preventDefault();
});
Ответ 5
Это решение учитывает изменения в направлениях, которые не соответствуют текущим ответам. Решение ниже также заботится о сенсорной чувствительности; это когда пользователь движется в одном направлении, но на сенсорном конце пальцы пользователя в другом направлении испортили фактическое направление.
var y = 0; //current y pos
var sy = y; //previous y pos
var error = 5; //touch sensitivity, I found between 4 and 7 to be good values.
function move(e) {
//get current y pos
y = e.pageY;
//ingnore user jitter
if (Math.abs(y - sy) > error) {
//find direction of y
if (y > sy) {
//move down
} else {
//move up
}
//store current y pos
sy = y;
}
}