我有一個AngularJS應用程序,它有箭頭鍵導航來切換視圖。如何爲移動設備實施輕掃手勢?
我想使用滑動觸摸設備來實現此導航。我試過jGestures庫,但是刷卡不好。 我被建議不要使用jquery mobile。
有沒有其他的方式來實現刷卡?編輯: 它不會檢測到滑動乾淨。我在包括iPad在內的多種設備上進行了測試,並且需要多次滑動才能執行操作(在我的情況下爲路由)。
我有一個AngularJS應用程序,它有箭頭鍵導航來切換視圖。如何爲移動設備實施輕掃手勢?
我想使用滑動觸摸設備來實現此導航。我試過jGestures庫,但是刷卡不好。 我被建議不要使用jquery mobile。
有沒有其他的方式來實現刷卡?編輯: 它不會檢測到滑動乾淨。我在包括iPad在內的多種設備上進行了測試,並且需要多次滑動才能執行操作(在我的情況下爲路由)。
無恥插頭我知道,但你可能要考慮一個jQuery插件,我寫道:
https://github.com/benmajor/jQuery-Mobile-Events
它不需要jQuery Mobile的,只有jQuery的。
您是否嘗試過Hammerjs?它通過使用觸摸的速度來支持滑動手勢。 http://eightmedia.github.com/hammer.js/
我用http://quojs.tapquo.com/。它運作良好。聽說有關HammerJS的許多肯定,會在其他一些項目中嘗試。感謝您的答覆。 – fotuzlab 2013-03-07 10:42:24
我寫了一個簡單的服務包裝Hammerjs。與Angular非常相稱。 – 2015-08-24 07:38:12
感謝您的推薦! hammerjs與當前版本的JQuery一起工作,無需遷移jquery.mobile。沒有警告,沒有錯誤。 NICE! – 2017-09-28 18:48:38
還有一個名爲角手勢的AngularJS模塊是基於hammer.js: https://github.com/wzr1337/angular-gestures
我爲我的需求使這個功能。
隨意使用它。在移動設備上非常出色。
function detectswipe(el,func) {
swipe_det = new Object();
swipe_det.sX = 0; swipe_det.sY = 0; swipe_det.eX = 0; swipe_det.eY = 0;
var min_x = 30; //min x swipe for horizontal swipe
var max_x = 30; //max x difference for vertical swipe
var min_y = 50; //min y swipe for vertical swipe
var max_y = 60; //max y difference for horizontal swipe
var direc = "";
ele = document.getElementById(el);
ele.addEventListener('touchstart',function(e){
var t = e.touches[0];
swipe_det.sX = t.screenX;
swipe_det.sY = t.screenY;
},false);
ele.addEventListener('touchmove',function(e){
e.preventDefault();
var t = e.touches[0];
swipe_det.eX = t.screenX;
swipe_det.eY = t.screenY;
},false);
ele.addEventListener('touchend',function(e){
//horizontal detection
if ((((swipe_det.eX - min_x > swipe_det.sX) || (swipe_det.eX + min_x < swipe_det.sX)) && ((swipe_det.eY < swipe_det.sY + max_y) && (swipe_det.sY > swipe_det.eY - max_y) && (swipe_det.eX > 0)))) {
if(swipe_det.eX > swipe_det.sX) direc = "r";
else direc = "l";
}
//vertical detection
else if ((((swipe_det.eY - min_y > swipe_det.sY) || (swipe_det.eY + min_y < swipe_det.sY)) && ((swipe_det.eX < swipe_det.sX + max_x) && (swipe_det.sX > swipe_det.eX - max_x) && (swipe_det.eY > 0)))) {
if(swipe_det.eY > swipe_det.sY) direc = "d";
else direc = "u";
}
if (direc != "") {
if(typeof func == 'function') func(el,direc);
}
direc = "";
swipe_det.sX = 0; swipe_det.sY = 0; swipe_det.eX = 0; swipe_det.eY = 0;
},false);
}
function myfunction(el,d) {
alert("you swiped on element with id '"+el+"' to "+d+" direction");
}
要使用如果滑動檢測函數 「myfunction的」 被調用參數元素-id和 「L,R,U,d」(功能只是用它像
detectswipe('an_element_id',myfunction);
detectswipe('an_other_element_id',my_other_function);
左,右,上,下)。
謝謝。我建議動態設置'min_x':'min_x = Math.abs(swipe_det.eY - swipe_det.sY)'。模擬其他方向。因爲當你向上滑動400px並且只有40px正確時,你可能打算向上滑動。但是,您的代碼會識別右側滑動。 – Sadik 2017-02-03 14:07:45
@EscapeNetscape我喜歡你的解決方案刷卡檢測。但它錯誤地將單擊和雙擊標識爲滑動。我將如何去解決這個問題? – theJollySin 2017-04-13 15:42:36
,不需要插件,我發現最簡單的辦法是givanse's answer一個類似的問題:
document.addEventListener('touchstart', handleTouchStart, false);
document.addEventListener('touchmove', handleTouchMove, false);
var xDown = null;
var yDown = null;
function handleTouchStart(evt) {
xDown = evt.touches[0].clientX;
yDown = evt.touches[0].clientY;
};
function handleTouchMove(evt) {
if (! xDown || ! yDown) {
return;
}
var xUp = evt.touches[0].clientX;
var yUp = evt.touches[0].clientY;
var xDiff = xDown - xUp;
var yDiff = yDown - yUp;
if (Math.abs(xDiff) > Math.abs(yDiff)) {/*most significant*/
if (xDiff > 0) {
/* left swipe */
} else {
/* right swipe */
}
} else {
if (yDiff > 0) {
/* up swipe */
} else {
/* down swipe */
}
}
/* reset values */
xDown = null;
yDown = null;
};
哈默時刻!
我已經使用了Hammer JS,它與手勢一起工作。從這裏閱讀詳細信息:https://hammerjs.github.io/
好的事情,它是更輕量和快速,然後jQuery手機。你也可以在他們的網站上測試它。
我喜歡你的解決方案,並在我的網站上實現它 - 但是,有一些小的改進。只是想分享我的代碼:
function detectSwipe(id, f) {
var detect = {
startX: 0,
startY: 0,
endX: 0,
endY: 0,
minX: 30, // min X swipe for horizontal swipe
maxX: 30, // max X difference for vertical swipe
minY: 50, // min Y swipe for vertial swipe
maxY: 60 // max Y difference for horizontal swipe
},
direction = null,
element = document.getElementById(id);
element.addEventListener('touchstart', function (event) {
var touch = event.touches[0];
detect.startX = touch.screenX;
detect.startY = touch.screenY;
});
element.addEventListener('touchmove', function (event) {
event.preventDefault();
var touch = event.touches[0];
detect.endX = touch.screenX;
detect.endY = touch.screenY;
});
element.addEventListener('touchend', function (event) {
if (
// Horizontal move.
(Math.abs(detect.endX - detect.startX) > detect.minX)
&& (Math.abs(detect.endY - detect.startY) < detect.maxY)
) {
direction = (detect.endX > detect.startX) ? 'right' : 'left';
} else if (
// Vertical move.
(Math.abs(detect.endY - detect.startY) > detect.minY)
&& (Math.abs(detect.endX - detect.startX) < detect.maxX)
) {
direction = (detect.endY > detect.startY) ? 'down' : 'up';
}
if ((direction !== '') && (typeof f === 'function')) {
f(element, direction);
}
});
}
這樣使用它:
detectSwipe('an_element_id', myfunction);
或者
detectSwipe('another_element_id', my_other_function);
如果刷卡檢測功能myfunction
被調用參數元素-id和'left'
,'right'
,'up'
或'down'
。
您可能想詳細說明您使用jGestures時遇到的問題。我自己並沒有使用它,但它看起來像我爲簡單的手勢支持(並在其他地方看到)編寫的自定義代碼的強大版本。 – 2013-02-26 08:44:49
在編輯中添加了它們。 – fotuzlab 2013-03-07 10:41:29
「我被建議不要使用jQuery手機。」爲什麼? – givanse 2014-04-19 17:16:39