html 5移動端のクリックイベントtouch
43904 ワード
TOUCHイベント
TOUCHスライド方向判断
方法1:
touchstartイベントが開始されると、現在の指の横座標startXと縦座標startYが取得されます.touchmoveイベントがトリガーされると、このとき指の横座標moveEndXと縦座標moveEndYが取得される.最後に、この2回取得した座標差値により、携帯電話の画面上の指のスライド方向を判断する.
考え方:
touchmoveの最後の座標からtouchstartの開始座標を減算し、Xの結果が正数であれば指が左から右に引かれていることを示します.Xの結果が負数であれば、指が右から左に動いていることを示します.Yの結果が正数であれば、指が上から下に動いていることを示します.Yの結果が負数であれば、指が下から上へと動いていることを示します.
しかし、実際の操作では、指の上下スライドが直上直下になるのは難しく、少し斜めであれば、少し斜めであれば、X軸の判断で先に引き継がれ、私たちの実際の操作意欲とは乖離している.この場合、特殊な判断テクニックを追加し、コードを以下のように修正する必要があります(作業中は以下のコードでいいです):
方法2スライドスクリーンイベントHTML 5のtouchstartスライド開始イベントとtouchmoveスライド終了イベントを使用します. 方向の判断:起点で平面座標系を作り、終点と線を結んで直線を作り、直線とx正半軸で角度を計算する.45度角を方向として線を分割し、例えば、スライド角度が45度以上135度未満であれば、その方向が上向きであると判断する.図に示すように: はMathを用いる.atan 2は、始点と終点が形成する直線角度を計算する.
注意:標準座標系はスクリーン座標系とは異なり、スクリーン座標系では上半軸が負の値であり、変換を実現するには、Y座標の起点と終点を置き換えるだけでよい.
touch , :touchstart、touchmove、touchend 。 , 。
touchstart: DOM 。
touchmove: DOM 。
touchend: DOM 。
:
touches: 。
targetTouches: DOM 。
changedTouches: 。
Touch
, , , : 。
TouchList {0: Touch, length: 1}
length:1
0:Touch
clientX:65 //
clientY:18 //
force:1 //
identifier:0 // (ID)
pageX:65 //
pageY:18 //
radiusX:11.5 //
radiusY:11.5 //
rotationAngle:0 //
screenX:560 //
screenY:175 //
target:div#touchLog
__proto__:Touch
__proto__:TouchList
TouchList 。 (touchstart、touchmove、touchend) , 。 Touch ,Touch , 。
radiusX,radiusY,rotationAngle , , , 。 TouchList length , 1 , ( :touchstart ), , , Touch 。 , TouchList Touch , 0 。TouchList target , , 。
, :
mozilla
1.Touch.identifier: Touch 。 ( ) , 。 , 。
2.Touch.screenX: X 。 。
3.Touch.screenY: Y 。 。
4.Touch.clientX: (visual viewport) X 。 。 。
5.Touch.clientY: (visual viewport) Y 。 。 。
6.Touch.pageX: HTML X 。 , 。 。
7.Touch.pageY: HTML Y 。 , 。 。
8.Touch.radiusX: (X ) 。 screenX 。 。
9.Touch.radiusY: (Y ) 。 screenY 。 。
10.Touch.rotationAngle: : radiusX radiusY , , 。 。
11.Touch.force: , 0.0( ) 1.0( ) 。 。
12.Touch.target: ( touchstart ), HTML 。 , , 。 , , , window document 。 , , , , 。 。
TOUCHスライド方向判断
方法1:
touchstartイベントが開始されると、現在の指の横座標startXと縦座標startYが取得されます.touchmoveイベントがトリガーされると、このとき指の横座標moveEndXと縦座標moveEndYが取得される.最後に、この2回取得した座標差値により、携帯電話の画面上の指のスライド方向を判断する.
考え方:
touchmoveの最後の座標からtouchstartの開始座標を減算し、Xの結果が正数であれば指が左から右に引かれていることを示します.Xの結果が負数であれば、指が右から左に動いていることを示します.Yの結果が正数であれば、指が上から下に動いていることを示します.Yの結果が負数であれば、指が下から上へと動いていることを示します.
// js addeventListener
var mybody = document.getElementsByTagName('body')[0];
//
var startX, startY, moveEndX, moveEndY, X, Y;
mybody.addEventListener('touchstart', function(e) {
e.preventDefault();
startX = e.touches[0].pageX;
startY = e.touches[0].pageY;
});
mybody.addEventListener('touchmove', function(e) {
e.preventDefault();
moveEndX = e.changedTouches[0].pageX;
moveEndY = e.changedTouches[0].pageY;
X = moveEndX - startX;
Y = moveEndY - startY;
if ( X > 0 ) {alert(‘ ’);}
else if ( X < 0 ) {alert(‘ ’);}
else if ( Y > 0) {alert(‘ ’);}
else if ( Y < 0 ) { alert(‘ ’);}
else{alert(‘ ’); }
});
// jquery $.on('touchstart')
var startX, startY, moveEndX, moveEndY, X, Y;
$('body').on('touchstart', function(e) {
e.preventDefault();
startX = e.originalEvent.touches[0].pageX; // jquery , originalEvent
startY = e.touches[0].pageY;
});
$('body').on('touchmove', function(e) {
e.preventDefault();
moveEndX = e.originalEvent.touches[0].pageX;
moveEndY = e.originalEvent.touches[0].pageY;
X = moveEndX - startX;
Y = moveEndY - startY;
if ( X > 0 ) {alert(‘ ’);}
else if ( X < 0 ) {alert(‘ ’);}
else if ( Y > 0) {alert(‘ ’);}
else if ( Y < 0 ) { alert(‘ ’);}
else{alert(‘ ’); }
});
しかし、実際の操作では、指の上下スライドが直上直下になるのは難しく、少し斜めであれば、少し斜めであれば、X軸の判断で先に引き継がれ、私たちの実際の操作意欲とは乖離している.この場合、特殊な判断テクニックを追加し、コードを以下のように修正する必要があります(作業中は以下のコードでいいです):
// js addeventListener jquery
var mybody = document.getElementsByTagName('body')[0];
//
var startX, startY, moveEndX, moveEndY, X, Y;
mybody.addEventListener('touchstart', function(e) {
e.preventDefault();
startX = e.touches[0].pageX;
startY = e.touches[0].pageY;
}, false);
mybody.addEventListener('touchmove', function(e) {
e.preventDefault();
moveEndX = e.changedTouches[0].pageX;
moveEndY = e.changedTouches[0].pageY;
X = moveEndX - startX;
Y = moveEndY - startY;
if ( Math.abs(X) > Math.abs(Y) && X > 0 ) {
alert(" ");
}
else if ( Math.abs(X) > Math.abs(Y) && X < 0 ) {
alert(" ");
}
else if ( Math.abs(Y) > Math.abs(X) && Y > 0) {
alert(" ");
}
else if ( Math.abs(Y) > Math.abs(X) && Y < 0 ) {
alert(" ");
}
else{
alert(" ");
}
});
, , ——body , 0;
:
var mybody = document.getElementsByTagName('body')[0];
var h = document.documentElement.clientHeight;
mybody.style.height = h + 'px';
, 、 、 。
方法2
注意:標準座標系はスクリーン座標系とは異なり、スクリーン座標系では上半軸が負の値であり、変換を実現するには、Y座標の起点と終点を置き換えるだけでよい.
// js addeventListener jquery
var h = document.documentElement.clientHeight,
mybody = document.getElementsByTagName('body')[0];
mybody.style.height = h + 'px';
//
function GetSlideAngle(dx,dy) {
return Math.atan2(dy,dx) * 180 / Math.PI;
}
// 1: ,2: ,3: ,4: ,0:
function GetSlideDirection(startX,startY, endX, endY) {
var dy = startY - endY;
var dx = endX - startX;
var result = 0;
//
if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
return result;
}
var angle = GetSlideAngle(dx, dy);
if (angle >= -45 && angle < 45) {
result = 4;
}else if (angle >= 45 && angle < 135) {
result = 1;
}else if (angle >= -135 && angle < -45) {
result = 2;
}else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
result = 3;
}
return result;
}
//
var startX, startY;
mybody.addEventListener('touchstart', function (ev){
ev.preventDefault();
startX = ev.touches[0].pageX;
startY = ev.touches[0].pageY;
}, false);
mybody.addEventListener('touchmove', function (ev){
var endX, endY;
ev.preventDefault();
endX = ev.changedTouches[0].pageX;
endY = ev.changedTouches[0].pageY;
var direction = GetSlideDirection(startX, startY, endX, endY);
switch (direction){
case 0:
alert(" ");
break;
case 1:
alert(" ");
break;
case 2:
alert(" ");
break;
case 3:
alert(" ");
break;
case 4:
alert(" ");
break;
default:
}
}, false);