移动端的应用越来越多的开始采用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事件处理的更多相关文章

  1. INSPIRED启示录 读书笔记 - 第33章 新瓶装老酒

    精明的公司至少要手握两件“法宝” 1.对目标市场了如指掌,对现有产品的缺陷洞若观火 2.跟踪最亲的技术趋势.新技术层出不穷,让之前无法实现的方案变得可能

  2. HTML5新的标签和属性

    <article>标签定义外部的内容.比如来自一个外部的新闻提供者的一篇新的文章,或者来自 blog 的文本,或者是来自论坛的文本.亦或是来自其他外部源内容. HTML5:<arti ...

  3. Android touch事件处理流程

    前面我们看了key事件的处理流程,相信大家对此已经有了新的认识,这篇文章我打算带领大家来看看稍微复杂些的touch 事件的处理流程.说它复杂是因为key事件本身就key down,up,long pr ...

  4. Service Mesh 是新瓶装旧酒吗?

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 李云(花名: ...

  5. 自定义View系列教程06--详解View的Touch事件处理

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  6. HTML5新标签 w3c

    w3c标准下的HTML5新标签 ,做个归纳总结: H5标签 定义和用法 兼容性 <artical> 规定独立的自包含内容, 支持html中的全局属性, 支持html中的事件属性 IE: 支 ...

  7. html5新特性

    这一篇博文不会告诉你怎么去使用html5的新特性,只会给你总结一下新特性------对于好学的人可以把这篇文章当做一个目录 对于初接触的人来说是一个导向 对于已经接触过的人来说是一个检测你掌握程度的检 ...

  8. Cocoa Touch事件处理流程--响应者链

    Cocoa Touch事件处理流程--响应者链 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9264335 转载请注明 ...

  9. 让ie浏览器支持html5新标签的解决方法(使用html5shiv)

    没估计错的话旧版浏览器都是不识别这些新增的标签所以都是用行内元素来处理解决的,所以,有一个解决办法的突破口就是让它变成块状元素就不会处于同一行了,这样在新旧浏览器都是可以显示同样的效果,再者就是让浏览 ...

随机推荐

  1. WinForm 窗体初始位置篇

    1.在C#中,From本身有个StartPosition属性可以控制居中显示. StartPosition 默认值是WindowsDefaultLocation ,我们只需要改成CenterScree ...

  2. How to install cacti on centos 6

    Cacti – Network and performance monitoring tool   Cacti is one of best monitoring tool used to monit ...

  3. RabbitMQ消息的消费与持久化

    作为消费者的客户端要消费Rabbitmq的消息,首先要建立与它某个队列的连接,具体连接时可指定队列的BindingKey和关系的exchange标识,Rabbitmq判断若已有队列通过BindingK ...

  4. [LeetCode系列]子集枚举问题[有重复元素]

    给定一组数(未排序, 可能有重复元素), 求出所有可能的组合. 算法和无重复元素的相似. 唯一需要注意的是, 如果当前的数字和之前的相同, 算法就只会在结尾数字是此数字的组合后加上此数字. 比如现在是 ...

  5. CentOS6.5安装中文支持

    本人在安装CentOS6.5时选择是英文版,安装后打开文档,发现好些文档成了乱码了. 这个问题的原因是没有中文支持. 解决方法: 1.安装中文支持包 # yum groupinstall " ...

  6. SharePoint2010基于表单验证方法总结(转载)

    系统环境: win2008r2+ sql2008r2 +Visual Studio2010+sharepoint 2010 A.如果已经建立了web application  例如名字为: http: ...

  7. 基于标准库的string类实现简单的字符串替换

    感觉基本功还是不扎实,虽然能做些程序但是现在看来我还是个初学者(primer),试着完成习题结果还得修修改改. 废话不多说,实现功能很简单,<C++ Primer>9.5.2节习题. // ...

  8. jQuery实现页面监听(某一个值发生改变时触发)

    使用jQuery实现页面中监听   页面中某一个值(如input输入框)发生改变时触发. <html> <head> <title>RunJS</title& ...

  9. java代码----大二上机考试

    总结:对 冒泡排序熟悉,但不能灵活插入代码 package com.dkl; import java.io.*; import java.io.IOException; import java.uti ...

  10. SpringBoot中RedisTemplate订阅发布对象

    解说 RedisMessageListenerContainer Redis订阅发布的监听容器,你的消息发布.订阅配置都必须在这里面实现 addMessageListener(MessageListe ...