[前端] touch事件

jquery touch事件解析及方向判断

 

介绍:

touch事件在jQuery的高版本 用on来实现 $('div').on('touchstart', function(e) { …… }); 


touchstart  触摸开始的时候触发
touchmove   手指在屏幕上滑动的时候触发
touchend    触摸结束的时候触发


touches 当前位于屏幕上的所有手指列表(返回的是一个数组)
targetTouches  位于当前DOM元素上所有的手指列表(返回的也是一个数组)
changedTouches 涉及当前事件手指的列表(发生变化的触点)
identifier     一个数值,唯一标识触摸会话(touch session)中的当前手指。一般从0开始的流水号
target  DOM元素,是动作所针对的目标

 

代码:

 

// 手指在Body中点击时的记录
var startX, startY;
$("body").on("touchstart", function(e) {
    startX = e.originalEvent.changedTouches[0].pageX;  // 记录 最初点击时第一个触摸点的x坐标
    startY = e.originalEvent.changedTouches[0].pageY;  // 记录 最初点击时第一个触摸点的y坐标
});

// 阻止touchmove时的body默认事件
$('body').on('touchmove', function(e) {
    e.preventDefault();
});

// 记录/操作 当手指离开的操作 $('body')在操作的时候换成具体的选择器如$('#box')
$("body").on("touchend", function(e) {
    var moveEndX = e.originalEvent.changedTouches[0].pageX;   //  手指离开时的x坐标
    var moveEndY = e.originalEvent.changedTouches[0].pageY;   //  手指离开时的y坐标
    var X = moveEndX - startX; // 离开时的x坐标 - 开始触摸的x坐标 = 横向偏移值
    var Y = moveEndY - startY; // 离开时的y坐标 - 开始触摸的y坐标 = 纵向偏移值

    if ( Math.abs(X) > Math.abs(Y) && X > 0 ) {       // 从左到右
        alert("left 2 right");
    }
    else if ( Math.abs(X) > Math.abs(Y) && X < 0 ) {  // 从右到左
        alert("right 2 left");
    }
    else if ( Math.abs(Y) > Math.abs(X) && Y > 0) {   // 从上到下
        alert("top 2 bottom");
    }
    else if ( Math.abs(Y) > Math.abs(X) && Y < 0 ) {  // 从下到上
        alert("bottom 2 top");
    }
    else{
        alert("just touch");
    }
});

 

 

 

 

js使用touch事件

 

document.addEventListener("touchstart", function() {}, false);  // false- 默认。事件句柄在冒泡阶段执行

 

详细介绍(http://javascript.ruanyifeng.com/dom/event.html

 

 

 

Touch对象

 

Touch对象代表一个触摸点。触摸点可能是一根手指,也可能是一根触摸笔。它有以下属性。

(1)identifier

identifier属性表示Touch实例的独一无二的识别符。它在整个触摸过程中保持不变。

var id = touchItem.identifier;

 

TouchList对象的identifiedTouch方法,可以根据这个属性,从一个集合里面取出对应的Touch对象。

(2)screenX,screenY,clientX,clientY,pageX,pageY

screenX属性和screenY属性,分别表示触摸点相对于屏幕左上角的横坐标和纵坐标,与页面是否滚动无关。

clientX属性和clientY属性,分别表示触摸点相对于浏览器视口左上角的横坐标和纵坐标,与页面是否滚动无关。

pageX属性和pageY属性,分别表示触摸点相对于当前页面左上角的横坐标和纵坐标,包含了页面滚动带来的位移。

(3)radiusX,radiusY,rotationAngle

radiusX属性和radiusY属性,分别返回触摸点周围受到影响的椭圆范围的X轴和Y轴,单位为像素。

rotationAngle属性表示触摸区域的椭圆的旋转角度,单位为度数,在0到90度之间。

上面这三个属性共同定义了用户与屏幕接触的区域,对于描述手指这一类非精确的触摸,很有帮助。指尖接触屏幕,触摸范围会形成一个椭圆,这三个属性就用来描述这个椭圆区域。

(4)force

force属性返回一个0到1之间的数值,表示触摸压力。0代表没有压力,1代表硬件所能识别的最大压力。

(5)target

target属性返回一个Element节点,代表触摸发生的那个节点。

TouchList对象

TouchList对象是一个类似数组的对象,成员是与某个触摸事件相关的所有触摸点。比如,用户用三根手指触摸,产生的TouchList对象就有三个成员,每根手指对应一个Touch对象。

TouchList实例的length属性,返回TouchList对象的成员数量。

TouchList实例的identifiedTouch方法和item方法,分别使用id属性和索引值(从0开始)作为参数,取出指定的Touch对象。

TouchEvent对象

TouchEvent对象继承Event对象和UIEvent对象,表示触摸引发的事件。除了被继承的属性以外,它还有一些自己的属性。

(1)键盘相关属性

以下属性都为只读属性,返回一个布尔值,表示触摸的同时,是否按下某个键。

  • altKey 是否按下alt键
  • ctrlKey 是否按下ctrl键
  • metaKey 是否按下meta键
  • shiftKey 是否按下shift键

(2)changedTouches

changedTouches属性返回一个TouchList对象,包含了由当前触摸事件引发的所有Touch对象(即相关的触摸点)。

对于touchstart事件,它代表被激活的触摸点;对于touchmove事件,代表发生变化的触摸点;对于touchend事件,代表消失的触摸点(即不再被触碰的点)。

var touches = touchEvent.changedTouches;

 

(3)targetTouches

targetTouches属性返回一个TouchList对象,包含了触摸的目标Element节点内部,所有仍然处于活动状态的触摸点。

var touches = touchEvent.targetTouches;

 

(4)touches

touches属性返回一个TouchList对象,包含了所有仍然处于活动状态的触摸点。

var touches = touchEvent.touches;

 

触摸事件的种类

触摸引发的事件,有以下几类。可以通过TouchEvent.type属性,查看到底发生的是哪一种事件。

  • touchstart:用户接触触摸屏时触发,它的target属性返回发生触摸的Element节点。

  • touchend:用户不再接触触摸屏时(或者移出屏幕边缘时)触发,它的target属性与touchstart事件的target属性是一致的,它的changedTouches属性返回一个TouchList对象,包含所有不再触摸的触摸点(Touch对象)。

  • touchmove:用户移动触摸点时触发,它的target属性与touchstart事件的target属性一致。如果触摸的半径、角度、力度发生变化,也会触发该事件。

  • touchcancel:触摸点取消时触发,比如在触摸区域跳出一个情态窗口(modal window)、触摸点离开了文档区域(进入浏览器菜单栏区域)、用户放置更多的触摸点(自动取消早先的触摸点)。

下面是一个例子。

var el = document.getElementsByTagName("canvas")[0];
el.addEventListener("touchstart", handleStart, false);
el.addEventListener("touchmove", handleMove, false);

function handleStart(evt) {
  // 阻止浏览器继续处理触摸事件,
  // 也阻止发出鼠标事件
  evt.preventDefault();
  var touches = evt.changedTouches;

  for (var i = 0; i < touches.length; i++) {
    console.log(touches[i].pageX, touches[i].pageY);
  }
}

function handleMove(evt) {
  evt.preventDefault();
  var touches = evt.changedTouches;

  for (var i = 0; i < touches.length; i++) {
    var id = touches[i].identifier;
    var touch = touches.identifiedTouch(id);
    console.log(touch.pageX, touch.pageY);
  }
}

 

欢迎关注技术开发分享录:http://fenxianglu.cn/

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天空还下着雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值