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)
没估计错的话旧版浏览器都是不识别这些新增的标签所以都是用行内元素来处理解决的,所以,有一个解决办法的突破口就是让它变成块状元素就不会处于同一行了,这样在新旧浏览器都是可以显示同样的效果,再者就是让浏览 ...
随机推荐
- laravel的学习历程
首要,表明态度:PHP是世界上最佳的言语.(梗) laravel说是php将来,形似不假. 最开端触摸的是thinkphp,格外喜爱她的分层,文档格外完全,阅读起来没任何妨碍. 比较laravel,我 ...
- 浅谈Trie
所谓\(Trie\)就是字典树. 何为字典树?想象一下我们平时用拼音查字法在字典树查汉字的时候,一位一位确定这个汉字的拼音从而翻到我们想要看的那一面. 所以\(Trie\)树跟字典一样,是一种逐位检索 ...
- (转)如何获得当前ListVIew包括下拉的所有数据?
ListView listView = activity.getListView();获取的仅仅是当前屏幕显示的list,但是具有下拉信息,不在当前屏幕,但是下拉显示的数据无法或得到.谁知道如何获得当 ...
- 历届试题 Excel地址
问题描述 Excel单元格的地址表示很有趣,它使用字母来表示列号. 比如, A表示第1列, B表示第2列, Z表示第26列, AA表示第27列, AB表示第28列, BA表示第53列, .... 当然 ...
- VBA7种遍历方法
Sub 在选定文档最后加入一句话() '遍历文件 Dim MyDialog As FileDialog On Error Resume NextApplication.ScreenUpdating = ...
- Python基础之元组tuple(带了枷锁的列表)
元组不能直接插入删除修改元素. 逗号是关键 创建空元组 元组的一些操作符 别忘了逗号,"*"重复操作符也可以使用 元组通过切片间接更新 插入元素,可以使用拼接操作符(“+”) &g ...
- Java GC日志查看
Java GC类型 Java中的GC有哪几种类型? 参数 描述 UseSerialGC 虚拟机运行在Client模式的默认值,打开此开关参数后, 使用Serial+Serial Old收集器组合进行垃 ...
- 全连接BP神经网络
前馈神经网络 前馈神经网络(feedforward neural network)是最朴素的神经网络,通常我们所说的前馈神经网络有两种,一种叫反向传播网络(Back propagation Netwo ...
- 编译hostapd时,出现错误:/usr/bin/ld: cannot find -lnl
book@ubuntu:/work/project/wifi/04.hostapd/hostapd-2.0/hostapd$ make /usr/bin/ld: cannot find -lnl co ...
- 用嵌套List实现DataGrid的主从表显示
//首先构造嵌套List,也就是一个list在另一个list中充当成员//如:referModels 在res中充当成员var res = totalAffectedMedels.Select(c = ...