2012-11-07 24 views
18

我試圖實現平板電腦的觸摸監聽器來觸發某些操作,具體取決於它是否向上或向下移動。確定touchmove的垂直方向

我試圖本地聽衆:

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

但我不知道如何確定的方向。

這可能嗎?

或者我需要使用touchstart/touchend,如果我需要這個,我可以在觸摸移動停止之前確定方向嗎?

如果我只能用外部庫來做這件事,最好的是什麼?

謝謝。

+2

這與Android有什麼關係? –

回答

30

您需要保存觸摸的最後位置,然後將其與當前位置進行比較。
粗糙例如:

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

這對我不起作用,一次又一次地告訴我。經過iPhone 6測試。 – TK123

38

我遇到了一些問題,在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(); 
    } 
}); 
+1

令人驚歎!我嘗試了很多方法,嘗試了Hammer.js,並嘗試了上面的Andy解決方案。但他們都沒有工作。但是@Aureliano使它能夠以準確的幻燈片工作,而無需添加去抖動! –

+0

謝謝!這比touchmove好多了!所以該死的準確:D – ueberkim

+0

你能告訴我ipad的問題是什麼? ipad safari touchmove支持嗎? –

10

奧雷利亞諾的答案似乎是真正準確的,但不知何故,它並沒有爲我工作,所以給他我決定改善他與下列答案學分:

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'

+2

這應該已經作爲評論[這裏](http://stackoverflow.com/a/22257774/155640)而不是一個單獨的答案。 –

+1

很好的答案。 dd – Martian2049

2

該解決方案考慮到當前答案沒有的方向變化。下面的解決方案還考慮了觸摸靈敏度;當用戶在一個方向上移動但觸摸結束時,用戶的手指在不同的方向上移動,從而搞亂了實際的方向。

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

我創建了一個腳本,將確保元素中的文件將不滾動其他任何東西,包括身體滾動。這適用於瀏覽器以及移動設備/平板電腦。

// 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

您可以使用slide_top和slide_bottom檢測修改您的解決方案嗎? – Stefan