1、click 和 tap 比较html
二者都会在点击时触发,可是在手机WEB端,click会有 200~300 ms,因此请用tap代替click做为点击事件。android
singleTap和doubleTap 分别表明单次点击和双次点击。ios
2、关于tap的点透处理git
在使用zepto框架的tap来移动设备浏览器内的点击事件,来规避click事件的延迟响应时,有可能出现点透的状况,即点击会触发非当前层的点击事件。github
处理方式:web
(1)、浏览器
github上有一个叫作fastclick的库,它也能规避移动设备上click事件的延迟响应,https://github.com/ftlabs/fastclick
将它用script标签引入页面(该库支持AMD,因而你也能够按照AMD规范,用诸如require.js的模块加载器引入),而且在dom ready时初始化在body上,如:框架
1
2
3
|
$(
function
(){
new
FastClick(document.body);
})
|
而后给须要“无延迟点击”的元素绑定click事件(注意再也不是绑定zepto的tap事件)便可。
固然,你也能够不在body上初始化它,而在某个dom上初始化,这样,只有这个dom和它的子元素才能享受“无延迟”的点击dom
实践开发中发现,当元素绑定fastclick后,click响应速度比tap还要快一点点。哈哈ide
(2)、为元素绑定touchend事件,并在内部加上e.preventDefault();
$demo.on(
'touchend'
,
function
(e){
//
改变了事件名称,tap是在body上才被触发,而touchend是原生的事件,在dom自己上就会被捕获触发
$demo.hide()
e.preventDefault();
//
阻止“默认行为”
})
其中包括:touchstart,touchmove,touchend,touchcancel 这四个事件
touchstart,touchmove,touchend事件能够类比于mousedown,mouseover
,mouseup的触发。
touchstart : 当手指触摸到屏幕会触发;
touchmove : 当手指在屏幕上移动时,会触发;
touchend : 当手指离开屏幕时,会触发;
固然还有一个touchcancel,是在拖动中断时候触发。
例如:
这4个事件的触发顺序为:
touchmove
-> …… -> touchmove ->touchend
可是单凭监听上面的单个事件,不足以知足咱们去完成监听在触屏手机常见的一些手势操做,如双击、长按、左右滑动、缩放等手势操做。须要组合监听这些事件去封装对这类手势动做。
其实市面上不少框架都针对手机浏览器封装了这些手势,例如jqmobile、zepto、jqtouch,不过悲剧发生了,对于某些Android系统(我本身测试到的在android 4.0.x),touchmove和touchend事件不能被很好的触发,举例子说明下:
好比手指在屏幕由上向下拖动页面时,理论上是会触发 一个 touchmove
,和最终的 touchend ,但是在android 4.0上,touchmove只被触发一次,触发时间和touchstart
差很少,而touchend直接没有被触发。这是一个很是严重的bug,在google Issue已有很多人提出 http://code.google.com/p/android/issues/detail?id=19827
暂时我只发如今android 4.0会有这个bug,听说 ios 3.x的版本也会有。
而显然jqmobile、zepto等都没有意识到这个bug对监听实现带来的严重影响,因此在直接使用这些框架的event时,或多或少会出现兼容性问题!