iOS移动WEB开发之JS内置touch事件, OS系统的Safari也支持click 以及mouseover等传统的交互事件,不推荐在iOS浏览器应用上使用click和mouseover,主要是该事件是为支持鼠标点击而设计出来的。Click事件在iOS上有半秒延迟,因为iOS要highlight接收到click的element。而mouseover/out等事件则会被手指的点击触发。因此在iOS系统上上,应当抛弃传统的交互事件模型而接受一个新的事件模型。Touch事件一级更高级 的Gesture事件,会让网页交互起来像native应用一般。处理Touch事件可以让你跟踪用户的每一根手指的位置。你可以绑定以下四种Touch事件:
touchstart:
touchmove:
touchend:
touchcancel:
client / clientY:触摸点相对于浏览器窗口viewport的位置
pageX / pageY:触摸点相对于页面的位置
screenX /screenY:触摸点相对于屏幕的位置
identifier: touch对象的unique ID
从一个单根手指触摸的实例开始进入多触式网页的世界。当一根手指放下的时候,屏幕上出现一个方块,手指移动方块也随着移动,手指提起方块消失。首先,让我们定义一下方块的css:
Javascript代码
- .spirit
{ / * 方块的class名称*/ -
-
position: absolute; -
-
width: 50px; -
-
height: 50px; -
-
background-color: red; -
- }
- <body
style=”height: 100%;margin:0;padding:0”> -
- <div
id=”canvas” style=”position: relative;width:100%;height: 100%;”></div> -
- </body>
- //
define global variable -
- var
canvas = document.getElementByIdx_x_x_x(“canvas”), -
-
spirit, startX, startY; -
- //
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_x_x_x(“div”); -
-
spirit.className = “spirit”; -
-
spirit.style.left = startX; -
-
spirit.style.top = startY; -
-
canvas.a(spirit); -
- }
-
- //
add touch start listener -
- canvas.addEventListener(“touchstart”,
touchStart, false);
Javascript代码
- function
touchMove(event) { -
-
event.preventDefault(); -
-
if (!spirit || !event.touches.length) return; -
-
var touch = event.touches[0], -
-
x = touch.pageX – startX, -
-
y = touch.pageY – startY; -
-
spirit.style.webkitTransform = ‘translate(‘ + x + ‘px, ‘ + y + ‘px)’; -
- }
-
- Canvas.addEventListener(“touchmove”,
touchMove, false);
- function
touchEnd(event) { -
-
If (!spirit) return; -
-
canvas.removeChild(spirit); -
-
spirit = null; -
- }
-
- 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/safariwebconten
多触式设备上特有的gesture event(android和iOS对这个事件的封装大同小异)。这个事件是对touch event的更高层的封装,和touch一样,它同样包括gesturestart,gesturechange,gestureend三个事件回调:
gesturestart
gesturechange
gestureend
1、第一根手指放下,触发touchstart,除此之外什么都不会发生(请参照第二篇文章,手指提起才会触发mouse的各事件)
2、第二根手指放下,触发gesturestart
3、触发第二根手指的touchstart
4、立即触发gesturechange
5、手指移动,持续触发gesturechange,就像鼠标在屏幕上移动的时候不停触发mousemove一样
6、第二根手指提起,触发gestureend,以后将不会再触发gesturechange
7、触发第二根手指的touchend
8、触发touchstart!注意,和第一篇文章里介绍的一样,多根手指在屏幕上,提起一根,会刷新一次全局touch!重新触发第一根手指的touchstart,这点和苹果官方网站上介绍的不同。
9、提起第一根手指,触发touchend
var angle = event.rotation;
var scale = event.scale;
e.target.style.webkitTransform = ‘scale(‘ + e.scale + startScale + ‘) rotate(‘ + e.rotation + startRotation + ‘deg)’;
http://wanglingshu.com/wp-content/uploads/ios-gesture.html
http://cubiq.org/scrolling-div-on-iphone-ipod-touch