手机触屏的js事件

处理Touch事件能让你跟踪用户的每一根手指的位置。你可以绑定以下四种Touch事件:

1.touchstart:  // 手指放到屏幕上的时候触发

2.touchmove:  // 手指在屏幕上移动的时候触发

3.touchend:  // 手指从屏幕上拿起的时候触发

4touchcancel:  // 系统取消touch事件的时候触发。至于系统什么时候会取消,不详

属性

1.client / clientY:// 触摸点相对于浏览器窗口viewport的位置

2.pageX / pageY:// 触摸点相对于页面的位置

3.screenX /screenY:// 触摸点相对于屏幕的位置

4.identifier: // touch对象的unique ID

//touchstart事件

function touchSatrtFunc(e) {

//evt.preventDefault(); //阻止触摸时浏览器的缩放、滚动条滚动等

var touch = e.touches[0]; //获取第一个触点

var x = Number(touch.pageX); //页面触点X坐标

var y = Number(touch.pageY); //页面触点Y坐标

//记录触点初始位置

startX = x;

startY = y;

}

//touchmove事件

function touchMoveFunc(e) {

//evt.preventDefault(); //阻止触摸时浏览器的缩放、滚动条滚动等

var touch = evt.touches[0]; //获取第一个触点

var x = Number(touch.pageX); //页面触点X坐标

var y = Number(touch.pageY); //页面触点Y坐标

var text = ‘TouchMove事件触发:(‘ + x + ‘, ‘ + y + ‘)‘;

//判断滑动方向

if (x - startX != 0) {

//左右滑动

}

if (y - startY != 0) {

//上下滑动

}

}

一、手机上的触摸事件

基本事件:

touchstart   //手指刚接触屏幕时触发

touchmove    //手指在屏幕上移动时触发

touchend     //手指从屏幕上移开时触发

下面这个比较少用:

touchcancel  //触摸过程被系统取消时触发

每个事件都有以下列表,比如touchend的targetTouches当然是 0 咯:

touches         //位于屏幕上的所有手指的列表

targetTouches   //位于该元素上的所有手指的列表

changedTouches  //涉及当前事件的所有手指的列表

我们来看几个关键的地方:

changedTouches/touches/targetTouches

touches:为屏幕上所有手指的信息

PS:因为手机屏幕支持多点触屏,所以这里的参数就与手机有所不同

targetTouches:手指在目标区域的手指信息

changedTouches:最近一次触发该事件的手指信息

比如两个手指同时触发事件,2个手指都在区域内,则容量为2,如果是先后离开的的话,就会先触发一次再触发一次,这里的length就是1,只统计最新的

PS:一般changedTouches的length都是1

touchend时,touches与targetTouches信息会被删除,changedTouches保存的最后一次的信息,最好用于计算手指信息
这里要使用哪个数据各位自己看着办吧,我也不是十分清晰(我这里还是使用changedTouches吧)

复制代码

其中坐标常用pageX,pageY:

pageX    //相对于页面的 X 坐标

pageY    //相对于页面的 Y 坐标

clientX  //相对于视区的 X 坐标

clientY  //相对于视区的 Y 坐标

screenX  //相对于屏幕的 X 坐标

screenY  //相对于屏幕的 Y 坐标

identifier // 当前触摸点的惟一编号

target   //手指所触摸的 DOM 元素

复制代码

其他相关事件:

event.preventDefault()   //阻止触摸时浏览器的缩放、滚动条滚动

var supportTouch = "createTouch" in document  //判断是否支持触摸事件

更多深入内容?点击:http://www.cesclub.com/bw/jishuzhongxin/Webjishu/2011/1216/18069.html

二、示例

以下是获取不同类型滑动的代码具体做法,结合前人的思想,封装好了,可以借鉴学习:

 1 var touchFunc = function(obj,type,func) {
 2     //滑动范围在5x5内则做点击处理,s是开始,e是结束
 3     var init = {x:5,y:5,sx:0,sy:0,ex:0,ey:0};
 4     var sTime = 0, eTime = 0;
 5     type = type.toLowerCase();
 6
 7     obj.addEventListener("touchstart",function(){
 8         sTime = new Date().getTime();
 9         init.sx = event.targetTouches[0].pageX;
10         init.sy = event.targetTouches[0].pageY;
11         init.ex = init.sx;
12         init.ey = init.sy;
13         if(type.indexOf("start") != -1) func();
14     }, false);
15
16     obj.addEventListener("touchmove",function() {
17         event.preventDefault();//阻止触摸时浏览器的缩放、滚动条滚动
18         init.ex = event.targetTouches[0].pageX;
19         init.ey = event.targetTouches[0].pageY;
20         if(type.indexOf("move")!=-1) func();
21     }, false);
22
23     obj.addEventListener("touchend",function() {
24         var changeX = init.sx - init.ex;
25         var changeY = init.sy - init.ey;
26         if(Math.abs(changeX)>Math.abs(changeY)&&Math.abs(changeY)>init.y) {
27             //左右事件
28             if(changeX > 0) {
29                 if(type.indexOf("left")!=-1) func();
30             }else{
31                 if(type.indexOf("right")!=-1) func();
32             }
33         }
34         else if(Math.abs(changeY)>Math.abs(changeX)&&Math.abs(changeX)>init.x){
35             //上下事件
36             if(changeY > 0) {
37                 if(type.indexOf("top")!=-1) func();
38             }else{
39                 if(type.indexOf("down")!=-1) func();
40             }
41         }
42         else if(Math.abs(changeX)<init.x && Math.abs(changeY)<init.y){
43             eTime = new Date().getTime();
44             //点击事件,此处根据时间差细分下
45             if((eTime - sTime) > 300) {
46                 if(type.indexOf("long")!=-1) func(); //长按
47             }
48             else {
49                 if(type.indexOf("click")!=-1) func(); //当点击处理
50             }
51         }
52         if(type.indexOf("end")!=-1) func();
53     }, false);
54 };

完整的触控事件

 1 //捕获手势事件(与捕捉鼠标事件是一样的,只需要添加一个监听器就好了)====添加一个事件监听addEventListener
 2 /**
 3 *在document下面监听touchstart和touchend这两个事件
 4 *touches[]是一个数组,多点触控,此处只需要在2048中采用单点触控即可
 5 *
 6 */
 7 var startx=0,starty=0,endx = 0,endy = 0;
 8 document.addEventListener(‘touchstart‘,function(event){
 9     startx = event.touches[0].pageX;//获取屏幕X的位置;
10     starty = event.touches[0].pageY;
11 });
12 document.addEventListener(‘touchmove‘,function(event){
13     event.preventDefault();//阻止触摸时浏览器的缩放,滚动条滚动
14 });
15 document.addEventListener(‘touchend‘,function(event){
16     endx = event.changedTouches[0].pageX;
17     endy = event.changedTouches[0].pageY;
18
19     //声明两个变量来保存向量
20     var subx = endx-startx;
21     var suby = endy-starty;
22     if (Math.abs(subx)<0.3*documentWidth && Math.abs(suby)<0.3*documentWidth) {
23         return;//处理小范围滑动,不操作,即容错处理
24     };
25     //触控事件的逻辑===上滑,下滑,左滑,右滑;
26     /*
27     *注意:在移动手机端中,纵坐标向下为正。
28     */
29     if (Math.abs(subx)>=Math.abs(suby)) {
30         //横坐标移动范围比纵坐标移动范围广
31         if (subx>0) {
32             //右滑
33             if (moveRight()) {
34                 setTimeout("generateOneNumber()",210);
35                 setTimeout("isgameover()",300);
36             };
37         } else{
38             //左滑
39             if (moveLeft()) {
40                 setTimeout("generateOneNumber()",210);
41                 setTimeout("isgameover()",300);
42             };
43         };
44     } else{//纵坐标移动范围比横坐标移动范围广
45         if (suby>0) {
46             //下滑
47             if (moveDown()) {
48                 setTimeout("generateOneNumber()",210);
49                 setTimeout("isgameover()",300);
50             };
51         } else{
52             //上滑
53             if (moveUp()) {
54                 setTimeout("generateOneNumber()",210);
55                 setTimeout("isgameover()",300);
56             };
57         };
58     };
59
60 });
时间: 2024-10-21 14:03:13

手机触屏的js事件的相关文章

js手机触屏轮播效果

以前自己用纯js写的,找了N就都没找到,还是从同事哪里重新拿过来的,仅是备忘,看过新浪新闻的手机触屏端后,自己写了个效果,比新浪的省代码多了 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Cache-Control&

手机触屏滑动插件idangerous.swiper.js

手机触屏滑动插件 idangerous.swiper.js 演示地址:http://www.idangero.us/sliders/swiper/demos.php 下载地址:https://github.com/nolimits4web/Swiper

Zepto手机触屏翻屏

demo: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,use

Mobiscroll手机触屏日期选择器

   最近在制作jquery mobile因要用到日历控件,突然发现Mobiscroll非常不错.于是摘下来记录. A Mobiscroll是一个用于触摸设备(Android phones.iPhone. iPad.Galaxy Tab)的日期和时间选择器jQuery插件.可以让用户很方便的只需要滑动数字就可以选择日期.Mobiscroll作为一款jQuery日期插件可以让用户自定义主题,完全通过CSS文件修改样式,经过测试可以完美使用在iOS4.Android 2.2. Android 2.3

jQuery手机触屏左右滑动切换栏目和焦点图

实现jQuery手机触屏左右滑动用到一个滑动插件TouchSlide,大家可以百度下. 首先来看看左右滑动切换焦点图: JQuery代码 $(function(){ TouchSlide({ slideCell:"#slideBox", titCell:".myhd ul", //开启自动分页 autoPage:true ,此时设置 titCell 为导航元素包裹层 mainCell:".bd ul", effect:"leftLoop

触屏Tap模拟事件

触屏的click因为有双击判断所以有200ms的延迟,zepto里的touch.js兼容不好所以tap也没法直接用. gibhub上有个fastclick太大了. 自己用touched写个简单的模拟tap事件,并在内部加上e.preventDefault();阻止系统默认行为. /* 模拟Tab事件 @obj:元素 @callback:回调函数 */ function Tap(obj, callback){ document.body.addEventListener('touchend',fu

触屏设备触摸事件实验和记录

1. 事件概述 触屏设备的原始触摸事件有四个,[touchstart][touchmove][touchend][touchcancle],这里只讲前三个,因为最后一个是被动被打断时冒出的事件. 2. touchstart 用户把手指放到屏幕上的一刹那,触发的事件. 3. touchmove 用户用手指在屏幕上滑动,会持续触发这个事件. 4. touchend 用户的手指离开屏幕时触发的事件. 5. 属性概述 每一次触发事件,这个事件会 attach 一些 properties,就是附带一些额外

jquery -- 触屏设备touch事件

几种普及得比较好的触摸事件,你可以在绝大多数现代浏览器中来测试这一事件(必须是触屏设备哦): touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结束的时候触发 而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点(用来实现多点触控): touches:当前位于屏幕上的所有手指的列表. targetTouches:位于当前DOM元素上手指的列表. changedTouches:涉及当前事件手指的列表. 每个触摸点由包含

手机触屏版页面开发总结

在最初进行JS 框架的选型, 选择的是jQuery + jquery.mobile. 框架选型问题: [1]大小问题, jQuery 是 277KB ,jquery.mobile 是 451KB ,当用户处于弱网络时,这个大小对于手机端的加载来讲,完全是一场灾难.  [2]抛开 jquery.mobile 的大小不说, 对于移动端的开发而言, jquery.mobile并无出色的优势可言.在使用的过程中jquery.mobile  会给页面的DOM元素附加居多无用的CSS样式名, 大大减低了DO