以下是几种普及得比较好的触摸事件,可以在绝大多数现代浏览器中来测试这一事件(必须是触屏设备):
(on)touchstart:触摸开始的时候触发 (on)touchmove:手指在屏幕上滑动的时候触发
(on)touchend:触摸结束的时候触发
(on)touchcancel:系统取消touch事件的时候触发。例如电话接入或者弹出信息。一般用在游戏:玩着的时候,突然来电话了,就触发touchcancel事件暂停游戏、存档等操作。
而每个触摸事件都包括了三个触摸对象列表,每个列表里包含了对应的一系列触摸点(触摸对象,用来实现多点触控):
touches:当前位于屏幕上的所有手指的列表。 targetTouches:位于当前DOM元素上手指的列表。
changedTouches:涉及当前事件手指的列表。
每个触摸点由包含了如下触摸信息(常用):
identifier:一个数值,touch对象的unique ID ,唯一标识触摸会话(touch
session)中的当前手指。一般为从0开始的流水号(android4.1,uc) target:DOM元素,是动作所针对的目标。 client /
clientY:触摸点相对于浏览器窗口viewport的位置,不包含滚动距离 pageX / pageY:触摸点相对于页面的位置,包含滚动距离
screenX /screenY:触摸点相对于屏幕的位置
radiusX/radiusY/rotationAngle:画出大约相当于手指形状的椭圆形,分别为椭圆形的两个半径和旋转角度。初步测试浏览器不支持,好在功能不常用。
有了这些信息,就可以依据这些事件信息为用户提供不同的反馈了。
Touch事件与Mouse事件的出发关系
在触屏操作后,手指提起的一刹那(即发生touchend后),系统会判断接收到事件的element的内容是否被改变,
如果内容被改变,会解析为touch事件,接下来的click事件都不会触发,
如果内容没有改变,则会解析为click事件,按照mousedown,mouseup,click的顺序触发事件。 特别需要提到的是,在解析为click事件时,只有再触发一个触屏事件时,才会触发上一个事件的mouseout事件。
因此有关于hover的小技巧,当点击过一个按钮之后,这个按钮就会一直处于hover的状态,此时基于这个伪类所设置的css也是起作用的,直到用手指点击另外一个地方,才会完成mouseout事件。
gesture事件(手势事件)
与touch事件相近,也用得很多的是gesture事件,这个事件将在下一篇讲到。
touch事件demo
<meta name="viewport" content="width=device-width,height=device-height,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=0">
<div id="canvas">
<div id="move"></div>
</div>
<style>
*{margin:0;padding:0;}
html,body{ width:100%;height:100%;}
#canvas{position:relative;width:100%;height:100%;}
#move{position:absolute;width:100px;height:100px;background:#0F0;}
.spirit {position:absolute;width:50px;height:50px;background-color:red;}
</style>
<script>
var canvas = document.getElementById("canvas");
var spirit, startX, startY;
var a = 1;
// touch start listener
function touchStart(event) {
event.preventDefault();
if (spirit ||! event.touches.length) return;
var touch = event.touches[0];
startX = touch.pageX;
startY = touch.pageY;
spirit = document.createElement("div");
spirit.className = "spirit";
spirit.style.left = startX - 50 + "px";
spirit.style.top = startY - 50 + "px";
canvas.appendChild(spirit);
spirit.innerHTML = a++;
}
// touch move listener
function touchMove(event) {
event.preventDefault();
if (!spirit || !event.touches.length) return;
var touch = event.touches[0];
//spirit.style.left = touch.pageX - 50 + "px";
//spirit.style.top = touch.pageY - 50 + "px";
//或者用下面的
var x = touch.pageX - startX;
var y = touch.pageY - startY;
spirit.style.webkitTransform = ‘translate(‘ + x + ‘px, ‘ + y + ‘px)‘;
}
// touch end listener
function touchEnd(event) {
if (!spirit) return;
canvas.removeChild(spirit);
spirit = null;
}
// add touch start listener
canvas.addEventListener("touchstart", touchStart, false);
canvas.addEventListener("touchmove", touchMove, false);
canvas.addEventListener("touchend", touchEnd, false);
</script>