Подтвердить что ты не робот

Определить вертикальное направление касания

Я пытаюсь реализовать сенсорный приемник для таблеток, чтобы вызвать некоторые действия в зависимости от того, касаются ли они вверх или вниз.

Я попробовал собственный слушатель:

($document).bind('touchmove', function (e)
{
    alert("it worked but i don't know the direction");
});

Но я не знаю, как определить направление.

Возможно ли это?

Или мне нужно использовать touchstart/touchhend, если мне это нужно, я могу определить направление до остановки касания?

Если я могу сделать это только с помощью внешней библиотеки, какой лучший?

спасибо.

4b9b3361

Ответ 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;
    }
}