Html5新瓶装老酒之一--Touch事件处理
移动端的应用越来越多的开始采用html5来实现的。Html5有许多新特性需要开发者注意,比如css3,touch事件等等。比如做一个轮播图,分析其实现要领,有三点:
1.图片的轮播效果对应的css 样式;
2.定时操控函数改变css样式来实现动画;
3.绑定触摸事件对动画的播放进行控制。
在原来的桌面js开发中,jQuery应用非常广泛;而在移动端的js开发中,Zepto更胜一筹。Zepto为很大程度上接近兼容jQuery的js 轻量lib库,只考虑对主流移动浏览器web-kit核心进行支持。
在触摸事件的绑定上,采用Zepto的swipeRight和swipeLeft事件处理:
$(cache.player).swipeLeft(function(){
处理动画的播放控制;
});
这就是典型的事件绑定回调函数,与常见的
$(btn).click(function(){
处理点击事件;
});
点击绑定非常近似,
只不过事件的名字不同而已。
在chrome dev tools顺利通过iphone和galaxy的模拟,但是在iphone,android真机内嵌浏览器下,还是出现了意想不到的问题:
1. 在iphone上滑动基本无效;
2. 在小米和三星上,左滑幅度大的话等于退出移动客户端的内嵌浏览器。
这是为什么呢?第二个问题移动客户端的内嵌浏览器左滑幅度大的问题是内嵌浏览器在滑动下自带默认操作,方便在内嵌浏览器和客户端实现切换吧。
第一个问题就比较头痛了,闪过了debug的念头。在手机端debug,难道要装个debug工具在手机上?或者来个真机模拟测试?男默女泪,人艰不拆。以上想法实现起来都没有现成的,可行的目前只有jsConsole。JsConsole的调试方法,就是包含一个http://jsconsole.com/生成的Javascript文件。在调试时,移动端会连接到远程服务器上并把console.log的内容在服务端上显示,达到debug的目的。
相应的也对zepto的touch事件代码进行了分析:
$(document) .on('touchstart MSPointerDown pointerdown', function(e){})
.on('touchmove MSPointerMove pointermove', function(e){})
.on('touchend MSPointerUp pointerup', function(e){
…
if ((touch.x2 && Math.abs(touch.x1 - touch.x2) > 30) ||
(touch.y2 && Math.abs(touch.y1 - touch.y2) > 30)){
//swipeTimeout = setTimeout(function() {
touch.el.trigger('swipe')
touch.el.trigger('swipe' + (swipeDirection(touch.x1, touch.x2, touch.y1, touch.y2)))
touch = {}
//}, 0)
}
…
})
代码中可见有三个事件绑定函数。这三个绑定事件为touchstart,touchmove,touchend。在滑动时,手刚点上触摸屏,会触发touchstart事件,移动时每隔十几毫秒会进行touchmove事件的触发,手从触摸屏上移走会触发touchend事件。
在W3C的touchEvent文档中有callback函数的e有说明
interface TouchEvent : UIEvent {
readonly attribute TouchList touches;
readonly attribute TouchList targetTouches;
readonly attribute TouchList changedTouches;
readonly attribute boolean altKey;
readonly attribute boolean metaKey;
readonly attribute boolean ctrlKey;
readonly attribute boolean shiftKey;
};
其中touches和changedTouches中有对触摸点对象的封装
对于任何滑动事件的处理,思路如下:在touchEnd和touchStart触发时做一个touch对象的数据记录,比较两者的移动距离来界定其是左滑还是右滑来进行相应回调的触发即可进行左滑、右滑的事件处理。
iphone中内嵌浏览器Zepto为什么存在问题呢,主要是其在touchEnd中回调时启用了
swipeTimeout = setTimeout(function() {
touch.el.trigger('swipe')
touch.el.trigger('swipe' + (swipeDirection(touch.x1, touch.x2, touch.y1, touch.y2)))
touch = {}
}, 0) setTimeout定时函数。这个定时函数在iphone上经常没有机会执行。导致程序的swipeLeft,swipeRight事件在内嵌浏览器无法被触发导致,在safari和chrome下没有问题。这也说明了zepto的兼容性比较差。
移动端的问题基本上是对旧有事件体系的一种扩充,由于移动端存在多种浏览器的兼容性的问题,因此一些个性化的问题会存在。相信这些问题在HTML5长期的改进中会得到解决。
参考文献:
1.触摸事件: http://www.w3.org/TR/touch-events/
2.关于js定时器的深入研究:http://ejohn.org/blog/how-javascript-timers-work/
Html5新瓶装老酒之一--Touch事件处理的更多相关文章
- INSPIRED启示录 读书笔记 - 第33章 新瓶装老酒
精明的公司至少要手握两件“法宝” 1.对目标市场了如指掌,对现有产品的缺陷洞若观火 2.跟踪最亲的技术趋势.新技术层出不穷,让之前无法实现的方案变得可能
- HTML5新的标签和属性
<article>标签定义外部的内容.比如来自一个外部的新闻提供者的一篇新的文章,或者来自 blog 的文本,或者是来自论坛的文本.亦或是来自其他外部源内容. HTML5:<arti ...
- Android touch事件处理流程
前面我们看了key事件的处理流程,相信大家对此已经有了新的认识,这篇文章我打算带领大家来看看稍微复杂些的touch 事件的处理流程.说它复杂是因为key事件本身就key down,up,long pr ...
- Service Mesh 是新瓶装旧酒吗?
点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 李云(花名: ...
- 自定义View系列教程06--详解View的Touch事件处理
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- HTML5新标签 w3c
w3c标准下的HTML5新标签 ,做个归纳总结: H5标签 定义和用法 兼容性 <artical> 规定独立的自包含内容, 支持html中的全局属性, 支持html中的事件属性 IE: 支 ...
- html5新特性
这一篇博文不会告诉你怎么去使用html5的新特性,只会给你总结一下新特性------对于好学的人可以把这篇文章当做一个目录 对于初接触的人来说是一个导向 对于已经接触过的人来说是一个检测你掌握程度的检 ...
- Cocoa Touch事件处理流程--响应者链
Cocoa Touch事件处理流程--响应者链 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9264335 转载请注明 ...
- 让ie浏览器支持html5新标签的解决方法(使用html5shiv)
没估计错的话旧版浏览器都是不识别这些新增的标签所以都是用行内元素来处理解决的,所以,有一个解决办法的突破口就是让它变成块状元素就不会处于同一行了,这样在新旧浏览器都是可以显示同样的效果,再者就是让浏览 ...
随机推荐
- Oracle 11gR2 RAC集群服务启动与关闭总结
引言:这写篇文章的出处是因为我的一名学生最近在公司搭建RAC集群,但对其启动与关闭的顺序和原理不是特别清晰,我在教学工作中也发现了很多学员对RAC知识了解甚少,因此我在这里就把RAC里面涉及到的最常用 ...
- 函数参数个数不确定时使用va_start
今天在网上看程序时忽然发现别人的函数参数中有省略号,甚是吃惊,发现其函数中使用了va_start,经过查资料大概明白其用法,个人觉得很好用! #include <stdio.h> #inc ...
- 【转载】Leaflet 中文api
L.Map API各种类中的核心部分,用来在页面中创建地图并操纵地图. 使用 example // initialize the map on the "map" div with ...
- 最近遇到的几个纯C编程的陷阱
首先是一个不容易看出来的语法上的陷阱 经过调试得出的错误是对非socket的socket操作出错,sockfd在调试过程中发现是0,不是一个合理的文件描述符. 仔细一看原来是括号忘记加了,该运算是先用 ...
- vss和vs2008组合搭建源代码管理器
用源代码管理项目,是为了方便开发和管理组内项目,一个组做的是同一套项目,彼此知道各个模块的进度和开发情况,这也是开发项目所需要的.今天整理了VSS的安装.创建.连接及添加项目等操作. 一.安装VSS( ...
- struts2学习(10)struts2国际化
一.国际化简介: 二.struts2国际化设置: struts.xml: <?xml version="1.0" encoding="UTF-8" ?&g ...
- 【转】jMeter入门实例
人们对从认识事物都有一个具体到抽象的过程,学习Jmeter也不例外,通过一个实例来进行学习,一方面可以让初学者有所见即所得的信心,另一方面,其实也是在初学者心中留下了对这事物的一个朦胧的印象,这在以后 ...
- node中的require
/*在node中,可以使用require()函数来加载模块. * require函数使用一个参数,参数值可以带有完整路径的模块的文件名,也可以为模块名.当使用node中提供的模块时,在require函 ...
- python socket打造一个定位工具
前言: 刚刚学习socket,打算后期得学习 怎么写exploit. 原理: 其实很简单,客户端写个爬虫.然后将获取到的IP放入高德地图 在通过socket发送.利用ngrok达到能外网搞事. 准备: ...
- 【转】浅析VO、DTO、DO、PO的概念、区别和用处
原文地址:http://blog.csdn.net/zjrbiancheng/article/details/6253232 概念: VO(View Object):视图对象,用于展示层,它的作用是把 ...