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. position: absolute;
  3. width: 50px;
  4. height: 50px;
  5. background-color: red;
  6. }

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

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

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

Javascript代码 
  1. // define global variable
  2. var canvas = document.getElementByIdx_x_x_x(“canvas”),
  3. spirit, startX, startY;
  4. // touch start listener
  5. function touchStart(event) {
  6. event.preventDefault();
  7. if (spirit ||! event.touches.length) return;
  8. var touch = event.touches[0];
  9. startX = touch.pageX;
  10. startY = touch.pageY;
  11. spirit = document_createElement_x_x_x(“div”);
  12. spirit.className = “spirit”;
  13. spirit.style.left = startX;
  14. spirit.style.top = startY;
  15. canvas.a(spirit);
  16. }
  17. // add touch start listener
  18. 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. event.preventDefault();
  3. if (!spirit || !event.touches.length) return;
  4. var touch = event.touches[0],
  5. x = touch.pageX – startX,
  6. y = touch.pageY – startY;
  7. spirit.style.webkitTransform = 'translate(' + x + 'px, ' + y + 'px)';
  8. }
  9. Canvas.addEventListener(“touchmove”, touchMove, false);

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

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

Javascript代码 
  1. function touchEnd(event) {
  2. If (!spirit) return;
  3. canvas.removeChild(spirit);
  4. spirit = null;
  5. }
  6. 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

移动WEB开发之JS内置touch事件[转]相关推荐

  1. Python Web开发之WSGI

    Python Web开发之WSGI WSGI(全称Web Server Gate Interface,Web服务器网关接口)是Python为了规范和简化Web服务开发过程,定义了一种Web服务器和应用 ...

  2. Swift Web 开发之 Vapor - 入门(一)

    简介 Vapor 是一个基于纯 Swift 构建出的 Web 开发框架,目前可以运行在 macOS 和 Ubuntu ,用于构建出漂亮易用的网站或者 API 服务. 官方称是用的最多的 Swift w ...

  3. Swift Web 开发之 Vapor - 模版 Leaf(三)

    模版引擎,对现在的 Web 开发极为重要,几乎所有主流 Web 框架都会支持一种或多种模版引擎,模版引擎可以分离用户界面和业务逻辑,工作原理主要是一种翻译,后端对特定的标记.语法.变量等渲染后再输送给 ...

  4. 移动web开发之rem布局(rem基础、媒体查询、 less 基础、rem适配方案)

    移动web开发之rem布局 一.rem基础 rem单位 rem (root em)是一个相对单位,类似于em,em是父元素字体大小. 不同的是rem的基准是相对于html元素的字体大小. 比如,根元素 ...

  5. 17. 【移动Web开发之flex布局】

    文章目录 [移动Web开发之flex布局]前端小抄(17) 一.flex布局体验 1.1 传统布局与flex布局 1.2 初体验 二.flex布局原理 2.1 布局原理 三.flex布局父项常见属性 ...

  6. 「学习笔记」移动Web开发之flex布局9

    「学习笔记」移动Web开发之flex布局9 一.flex布局体验 1.1 传统布局与flex布局 1.2 初体验 二.flex布局原理 2.1 布局原理 三.flex布局父项常见属性 3.1 常见父项 ...

  7. JS内置引用类型/内置对象

    JS内置引用类型/内置对象 概述 对象在 JavaScript 中被称为引用类型的值/实例,在 ECMAScript 中,引用类型是一种数据结构, 用于将数据和功能组织在一起.它也常被称为类,但这种称 ...

  8. 18. 【移动Web开发之rem适配布局】

    文章目录 [移动Web开发之rem适配布局]前端小抄(18) 一.rem单位 1.1 rem 单位 二.媒体查询 2.1 什么是媒体查询 2.2 语法规范 2.2.1 mediatype 查询类型 2 ...

  9. 「学习笔记」移动Web开发之rem适配布局10

    「学习笔记」移动Web开发之rem适配布局10 一.rem单位 1.1 rem 单位 二.媒体查询 2.1 什么是媒体查询 2.2 语法规范 2.2.1 mediatype 查询类型 2.2.2 关键 ...

最新文章

  1. 20100707 学习记录:[System.Web.Script.Services.ScriptService]引用问题
  2. Collection接口的常用方法
  3. C#序列化反序列化对象为base64字符串
  4. 13.IDA-显示正确的函数名称(去掉c++后缀命名)
  5. hdfs haadmin使用,DataNode动态上下线,NameNode状态切换管理,数据块的balance,HA下hdfs-api变化(来自学习资料)...
  6. 大工计算机基础在线作业答案,大工1209《计算机应用基础》在线作业123.doc
  7. pytorch 深入理解 tensor.scatter_ ()用法
  8. css之div内部靠右
  9. prototype.js开发笔记(转)
  10. FileUpload类中FileUpload1.FileName和FileUpload1.PostedFile.FileName的区别
  11. OI国家集训队论文集1999~2018
  12. c语言memcmp函数详解,C语言之memcmp()函数
  13. 算法竞赛入门经典阅读心得
  14. mysql查询同名同姓重名人数,全国同名同姓人数在线查询,重名率查询
  15. mysql删除视图sql语句_怎么样删除视图中的全部数据 用SQL语言编写。
  16. 强烈推荐:视频该如何推广?
  17. Linux服务器中Ebury Trojan病毒记
  18. Java字符串使用Split以竖线作为分隔符
  19. 创建学生、课程、老师、学生成绩表
  20. CF #764 Div.3(B ~D)

热门文章

  1. mysql update nowait_mysql innodb之select for update nowait
  2. 大工20秋计算机组成原理在线作业2,大工14秋《计算机组成原理》在线作业2答案...
  3. zemax光学设计超级学习手册_穿越十年的一个ZEMAX光学设计案例
  4. rto净化效率计算公式_全面剖析 石油化工行业RTO蓄热式焚烧炉的优势要素
  5. 周期均方根和有效值的区别_黑猪肉和白猪肉有啥区别?
  6. 红外线遥控c语言程序,红外遥控的C程序
  7. adc如何获取周期_LOL:千珏拥有ADC最需要的位移和无敌能力,为什么没人用她打下路?...
  8. 微博 Android 启动广告,使用Xposed去除微博国际版的启动广告
  9. java获取mysql执行计划_好程序员Java学习路线之MySQL的执行计划
  10. ctype函数_PHP Ctype(字符类型)函数