移动WEB开发之JS内置touch事件[转]

 iOS上的Safari也支持click 和mouseover等传统的交互事件,只是不推荐在iOS的浏览器应用上使用click和mouseover,因为这两个事件是为了支持鼠标点击而设计 出来的。Click事件在iOS上会有半秒左右的延迟,原因是iOS要highlight接收到click的element。而 mouseover/out等事件则会被手指的点击触发。所以,在iOS上,应当抛弃传统的交互事件模型而接受一个新的事件模型。Touch事件和更高级 的Gesture事件,能让你的网页交互起来像native应用一样。

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

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

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

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

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

    Gesture事件则是对touch事件的更高级的封装,主要处理手指slide、rotate、scale等动作,将在下一篇文章详述。

    在开始描述touch事件之前,需要先描述一下多触式系统中特有的touch对象(android和iOS乃至nokia最新的meego系统都模拟了类 似的对象,这里只针对iOS,因为我只有iPad可用于测试。。)。这个对象封装一次屏幕触摸,一般来自于手指。它在touch事件触发的时候产生,可以 通过touch event handler的event对象取到(一般是通过event.changedTouches属性)。这个对象包括一些重要的属性:

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

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

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

identifier: touch对象的unique ID

    我们从一个单根手指触摸的实例开始进入多触式网页的世界。当一根手指放下的时候,屏幕上出现一个方块,手指移动方块也随着移动,手指提起方块消失。首先,让我们定义一下方块的css:

Javascript代码 
  1. .spirit {              / * 方块的class名称*/  
  2.   
  3.          position: absolute;  
  4.   
  5.          width: 50px;  
  6.   
  7.          height: 50px;  
  8.   
  9.          background-color: red;  
  10.   
  11. }  



    然后,在body下定义一个接收事件的容器,这里body的height必须是100%才能占满整个viewport:

Html代码 
  1. <body style=”height: 100%;margin:0;padding:0”>  
  2.   
  3. <div id=”canvas”  style=”position: relative;width:100%;height: 100%;”></div>  
  4.   
  5. </body>  



    定义touchstart的事件处理函数,并绑定事件:

Javascript代码 
  1. // define global variable  
  2.   
  3. var canvas = document.getElementByIdx_x_x_x(“canvas”),  
  4.   
  5.        spirit, startX, startY;  
  6.   
  7. // touch start listener  
  8.   
  9. function touchStart(event) {  
  10.   
  11.          event.preventDefault();  
  12.   
  13.          if (spirit ||! event.touches.length) return;  
  14.   
  15.          var touch = event.touches[0];  
  16.   
  17.          startX = touch.pageX;  
  18.   
  19.          startY = touch.pageY;  
  20.   
  21.          spirit = document_createElement_x_x_x(“div”);  
  22.   
  23.          spirit.className = “spirit”;  
  24.   
  25.          spirit.style.left = startX;  
  26.   
  27.          spirit.style.top = startY;  
  28.   
  29.          canvas.a(spirit);  
  30.   
  31. }  
  32.   
  33. // add touch start listener  
  34.   
  35. canvas.addEventListener(“touchstart”, touchStart, false);  



    首先,我们将方块spirit作为一个全局对象,因为我们现在要测试单根手指所以屏幕上最好只有一个物体在移动(等会有多触实例)。在 touchStart这个事件处理函数中,我们也首先判断了是否已经产生了spirit,也就是是否已经有一个手指放到屏幕上,如果是,直接返回。

    和传统的event listener一样,多触式系统也会产生一个event对象,只不过这个对象要多出一些属性,比如这里的event.touches,这个数组对象获得 屏幕上所有的touch。注意这里的event.preventDefault(),在传统的事件处理函数中,这个方法阻止事件的默认动作,触摸事件的默 认动作是滚屏,我们不想屏幕动来动去的,所以先调用一下这个函数。我们取第一个touch,将其pageX/Y作为spirit创建时的初始位置。接下 来,我们创建一个div,并且设置className,left,top三个属性。最后,我们把spirit对象a到容器中。这样, 当第一根手指放下的时候,一个红色的,50px见方的方块就放到屏幕上了。

    然后,我们要开始处理手指在屏幕上移动的事件:

Javascript代码 
  1. function touchMove(event) {  
  2.   
  3.          event.preventDefault();  
  4.   
  5.          if (!spirit || !event.touches.length) return;  
  6.   
  7.          var touch = event.touches[0],  
  8.   
  9.               x = touch.pageX – startX,  
  10.   
  11.                y = touch.pageY – startY;  
  12.   
  13.          spirit.style.webkitTransform = 'translate(' + x + 'px, ' + y + 'px)';       
  14.   
  15. }  
  16.   
  17. Canvas.addEventListener(“touchmove”, touchMove, false);  



    在touch move listener中,我们使用webkit特有的css属性:webkitTransform来移动方块,这个属性具体怎么用请google之。建议构造 面向iOS设备的网页的时候尽量使用webkit自己的特性,不但炫,更可以直接利用硬件来提高性能。

    最后,我们处理touchend事件。手指提起的时候方块从屏幕上移除。

Javascript代码 
  1. function touchEnd(event) {  
  2.   
  3.          If (!spirit) return;  
  4.   
  5.          canvas.removeChild(spirit);  
  6.   
  7.          spirit = null;  
  8.   
  9. }  
  10.   
  11. canvas.addEventListener(“touchend”, touchEnd, false);  



在你的ipad或者iphone上测试一下以上代码。如果不出意外的话,一个完整的多触式web程序就诞生了。。

这种事件处理模式虽然能够满足我们开发多触式网页应用的需求,但是start – move – end的流程有点繁琐,能不能封装一些常用的动作让我们用一个event handler就能解决问题呢。没错,Gesture事件就是为了这个目的设计出来的,它封装了手指的scale, slide, rotate等常用的动作。不过,下一章我们再来讨论这个问题。。

附件是一个更加复杂一些的例子,每根手指放下的时候都会产生一个不同颜色的方块,手指动的时候方块跟着动,手指提起的时候方块消失,请下载查看试用。


通过附件所包含的实例,我们可以看出一些较为隐蔽的特性。首先,这里我们没有再使用event.touches取所有touch的对象,而是使用 event.changedTouches这个数组,用来取得所有跟本次事件相关的touch。但是,这里我发现一个奇怪的特性,不知道是我的ipad有 问题还是本来就是这样,就是在有多根手指放在屏幕上的时候,如果提起一根手指,touchend事件的changedTouches中会包含所有手指的 touch对象,然后,其他几根留在屏幕上的手指会重新触发touchstart,并刷新所有的touch对象(identifier都不一样了)。如果 这是一个所有设备都有的特性,那么将给编程者带来一些不便,不知道水果为啥要这么处理。

对touch event的介绍我们点到为止,这里给大家推荐两篇文档:

Safari dom additions reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariJSRef/Intro/Intro.html#//apple_ref/doc/uid/TP40001482-CH2g-BAJDAJAG

Safari web content guide:

http://developer.apple.com/library/safari/#documentation/appleapplications/reference/safariwebcontent/Introduction/Introduction.html 

转载于:https://www.cnblogs.com/hfgb/p/7115837.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写代码的软件用什么编写的_如何通过像编写代码一样克服对编写的恐惧

编写代码的软件用什么编写的by Chris Rowe通过克里斯罗 How often do you get the fear? What do I mean by fear? How about the knot I got in my stomach just before I plunged out of plane on a parachute jump? It’s more than the brain logically planning to av…

快速学习一个新的模块

1、模块名.__doc__查看函数简介&#xff0c;为了便于查看&#xff0c;采用print&#xff08;模块名.__doc__&#xff09;打印出来&#xff0c;这样的格式便于查看。 2、采用内置方法dir()查看模块的变量、函数、类等等&#xff1b;采用"模块名.__all__"查看模块中提供…

php 公钥格式转换,如何把OpenSSH公钥转换成OpenSSL格式

《如何把OpenSSH公钥转换成OpenSSL格式》要点&#xff1a;本文介绍了如何把OpenSSH公钥转换成OpenSSL格式&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。首先看看OpenSSL工具的简单使用方法,我们以rsa加密算法为例生成一个私钥&#xff1a;openssl genrsa -o…

模拟操作系统(Java)

gitee完整代码下载 github完整代码下载 一、 需求分析 模拟一个采用多道程序设计方法的单用户操作系统&#xff0c;该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口四部分。预计程序所能达到的功能&#xff1a; 进程管理模拟&#xff1a;实现操作系统进程管…

数据库面试复习_数据科学面试复习

数据库面试复习大面试前先刷新 (REFRESH BEFORE THE BIG INTERVIEW) 介绍 (Introduction) I crafted this study guide from multiple sources to make it as comprehensive as possible. This guide helped me prepare for both the technical and behavioral aspects of the …

hibernate缓存

&#xff08;转自&#xff1a;http://www.cnblogs.com/java-class/p/6108175.html&#xff09; 阅读目录 1. 为什么要用 Hibernate 缓存&#xff1f;2. 项目实战3. Hibernate 缓存原理回到顶部1. 为什么要用 Hibernate 缓存&#xff1f; Hibernate是一个持久层框架&#xff0c;…

oracle 连接greenplum,Oracle通过DBLINK访问GreenPlum

为多个数据库之间的整合和迁移做POC&#xff0c;尝试使用Oracle Gateway和Heterogeneous Service来中转访问&#xff0c;测试过好多次&#xff0c;最终发现只有在32位的Oracle当中才能成功配置。 配置环境如下&#xff1a; Windows 2003 32bit 或 Windows 2008 64bit Oracle10G…

如何使用React和Redux前端创建Rails项目

by Mark Hopson马克霍普森(Mark Hopson) 如何使用React和Redux前端(加上Typescript&#xff01;)创建Rails项目 (How to create a Rails project with a React and Redux front-end (plus Typescript!)) 在Rails项目中使用React和Redux设置单页Javascript App的完整指南。 (A …

分布与并行计算—用任务管理器画CPU正弦曲线(Java)

class drawSin implements Runnable{Overridepublic void run() {final double SPLIT 0.01;// 角度的分割final int COUNT (int) (2 / SPLIT);// 2PI分割的次数&#xff0c;也就是2/0.01个&#xff0c;正好是一周final double PI Math.PI;final int interval 100;// 时间间…

Rails文件上传file_field报错Encoding::UndefinedConversionError

服务器用的是ubuntu12 64bit&#xff0c;环境是ruby1.9.3rails3mysql&#xff0c;测试是在windows2003上。 上传一个【.gitconfig】文件&#xff0c;没有问题&#xff0c;上传【新浪微博数据挖掘.pdf】报错&#xff0c;上传【back.jpg】报错。 下面是两段信息&#xff0c;是从【…

好久不来这里写东西了.

我正准备离开学校去实现自己的目标,很清楚自己在学校的... ...做共享程序员,就不得不考虑些商业上的东西,自己要吃饭啊!我想我是该好好的处理一下这二者的关系. 转载于:https://www.cnblogs.com/wangxiang/archive/2007/01/01/609714.html

Asp.net mvc中使用配置Unity

第一步&#xff1a;添加unity.mvc 第二步&#xff1a;在添加之后会在app_start中生成UnityConfig.cs&#xff0c;UnityMvcActivator.cs 第三步&#xff1a;使用 第四步&#xff1a;效果展示 转载于:https://www.cnblogs.com/WJ--NET/p/7117839.html

顶级数据恢复_顶级R数据科学图书馆

顶级数据恢复Data science is the discipline of making data useful数据科学是使数据有用的学科 When we talk about the top programming language for Data Science, we often find Python to be the best fit for the topic. Sure, Python is undoubtedly an excellent cho…

xp系统oracle数据库,Oracle10g 数据库的安装基于windowsXP

Oracle的安装一、首先去官网下载自身系统相对应的数据库软件http://www.oracle.com/cn/index.htmlOracle软件本身是免费的&#xff0c;个人用途完全没关系&#xff0c;商业用途并被发现才会被Oracle所要求收费&#xff0c;收费买的不是软件&#xff0c;而是授权。何谓授权&…

了解React Native中的不同JavaScript环境

by Khoa Pham通过Khoa Pham 了解React Native中的不同JavaScript环境 (Get to know different JavaScript environments in React Native) React Native can be very easy to get started with, and then at some point problems occur and we need to dive deep into it.Reac…

分布与并行计算—生命游戏(Java)

生命游戏其实是一个零玩家游戏&#xff0c;它包括一个二维矩形世界&#xff0c;这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多&#xff0c;这个细胞会因为资源匮…

正确认识 Vista 激活期限

当我们在安装 Vista 时&#xff0c;可以不输入序列号进行安装&#xff0c;这和以往的操作系统安装有所不同&#xff0c;我们不必再为安装系统时找不到我们的序列号标签而发愁。如果不输入序列号而继续安装系统&#xff0c;那么系统将提示我们有30天的激活期限&#xff01;这里的…

Oracle使用hs odbc连接mssql2008

1.创建odbc 2.在 product\11.2.0\dbhome_1\hs\admin\ 下拷贝initdg4odbc,把名字改为initcrmsql&#xff08;init所建odbc的名称&#xff09; HS_FDS_CONNECT_INFO crmsql #odbc名称 HS_FDS_TRACE_LEVEL 0 HS_FDS_RECOVERY_ACCOUNTsa #要连接的数据库名称 HS_FDS_RECOVERY_PWD…

oracle修改物化视图字段,获取物化视图字段的修改矢量(一)

当表建立了物化视图日志之后&#xff0c;表的DML修改会被记录到物化视图日志中&#xff0c;而物化视图日志则包含了一个修改矢量&#xff0c;来记录哪个列被修改。在文章列的修改矢量可以通过2的N次方来获得&#xff0c;也就是POWER(2, N)。而N的值&#xff0c;就是列的位置。但…

聚合 数据处理_R中聚合的简介:强大的数据处理工具

聚合 数据处理by Satyam Singh Chauhan萨蒂扬辛格乔汉(Satyam Singh Chauhan) R中聚合的简介&#xff1a;强大的数据处理工具 (An introduction to aggregates in R: a powerful tool for playing with data) Data Visualization is not just about colors and graphs. It’s …