2012-11-07 15 views
18

Sto provando a implementare un ascoltatore tattile per i tablet per attivare alcune azioni a seconda che venga toccato verso l'alto o verso il basso.Determinazione della direzione verticale di un touchmode

ho provato l'ascoltatore nativo:

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

Ma io non so come determinare la direzione.

È possibile?

Oppure ho bisogno di usare touchstart/touchend, se ho bisogno di questo posso determinare la direzione prima che il movimento touch si arresti?

Se posso farlo solo con una libreria esterna, qual è la migliore?

grazie.

+2

Che cosa ha a che fare questo con Android? –

risposta

30

È necessario salvare l'ultima posizione del tocco, quindi confrontarla con quella corrente.
esempio ruvida:

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; 
}); 
+1

Questo non funziona per me, mi dice una volta e un altro. Testato su iphone 6. – TK123

38

Ho avuto alcuni problemi nel Ipad e risolto con due eventi

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(); 
    } 
}); 
+1

INCREDIBILE! Ho provato molti modi, ho provato Hammer.js e ho provato anche la soluzione di Andy. ma tutti loro non hanno funzionato. Ma @Aureliano lo fa funzionare con la diapositiva di precisione senza dover aggiungere il debounced su di esso! –

+0

Grazie! Questo è molto meglio del touchmove! Così dannatamente preciso: D – ueberkim

+0

Puoi dirmi qual è stato il problema in ipad? Supporto per touchmove in ipad safari? –

10

risposta di Aureliano sembra essere davvero precisi, ma in qualche modo non ha funzionato per me così, dandogli i crediti che ho deciso di migliorare la sua risposta con il seguente:

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

ho semplicemente cambiato l'evento 'touchend' per 'touchmove'

+2

Questo dovrebbe essere stato messo come commento [qui] (http://stackoverflow.com/a/22257774/155640) invece di una risposta separata. –

+1

buona risposta. dd – Martian2049

2

Questa soluzione prende in considerazione il cambio di direzioni che le risposte correnti non hanno. La soluzione qui sotto si occupa anche della sensibilità al tocco; questo quando l'utente si sta muovendo in una direzione, ma al tocco, il dito dell'utente si sposta in una direzione diversa che incasina la direzione effettiva.

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

Ho creato uno script che garantirà che un elemento all'interno del documento scorrerà senza scorrere nient'altro, incluso il corpo. Funziona su un browser e su un dispositivo mobile/tablet.

// 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(); 
}); 
+0

Puoi modificare la tua soluzione con slide_top e slide_bottom detection? – Stefan

Problemi correlati