移动端的click
移动端的click
移动端click和touch的关系
手指在屏幕上滑动时 各个touch的触发顺序
touchstart
touchmove
touchcancel 滑动中突然有alert 或者其他情况导致滑动中断
touchend
关于轻拍tap(也就是单击) 触发的顺序是
touchstart
touchend
mousemove
mousedown
mouseup
click (300ms延迟才触发)
为什么click延迟300ms
移动端click是点一下触发 为什么会延迟300ms呢?
首先需要的知道的是 click虽然是PC上针对鼠标的事件 但是在触摸屏上点一下 也会触发click事件
不过移动端还有dbclick(双击放大页面)所以得有一个时间间隔来判断是单击还是双击
PS
http://am-team.github.io/amg/dev-exp-doc.html#click的300ms延迟响应
在手机早期,浏览器有系统级的放大和缩小的功能,用户在屏幕上点击两次之后,系统会触发站点的放大/缩小功能。不过由于系统需要判断用户在点击之后,有没有接下来的第二次点击,因此在用户点击第一次的时候,会强制等待300ms,等待用户在这个时间内,是否有用户第二次的点击,如果没有的话,就会click的事件,否则就会触发放大/缩小的效果。
$(function(){
var msg = $('.msg');
$('.title').tap(function(){
msg.html(+new Date)
});
$('.title').click(function(){
msg.html(msg.html() + ' '+ +new Date)
});
});
用这个例子试一试就发现 click明显晚于tap
在chrome 和 ff 的mobile版本中, 如果设置了页面禁止缩放 没有延迟
比如设置了<meta name="viewport" content="user-scalable=no">
或者<meta name="viewport" content="width=device-width">
在IOS上就有很明显的延迟
那就用touchend?
如果我们直接使用touchend事件来代替click事件,但这样副作用也很大,移动端的交互体验全靠触摸,touchstart将会干扰其他交互行为的处理,例如滚动、拖拽等, 也被认为是做了点击操作。
另外一个问题即触发touchend事件后,在该区域300ms后还会触发一次click事件,(上面已经提到"轻拍" 所触发的事件顺序 其中是会触发click事件的)
也就是穿透
这样不合理
用tap会带来穿透问题
什么是穿透
假如你在列表页面上创建一个弹出层,弹出层有个关闭的按钮(绑定了tap事件),你点了这个按钮关闭弹出层后,(且这个弹出层消失了) 这个个按钮正下方的内容也会执行点击事件(或打开链接)。这个就是一个“点透”现象。
更详细的说
重叠的区域里,被遮盖的元素绑定click,遮盖的元素绑定touch事件,且touch后遮盖的元素会隐藏的话,就会造成穿透,因为click是在touch之后延迟触发的,浏览器会误认为是在遮盖的元素上触发了click。
为什么会穿透
点了tap之后, 此时click事件还在延迟的300ms之中,当300ms到来的时候,click到的其实不是完成而是隐藏之后的下方的元素,如果正下方的元素绑定的有click事件此时便会触发,如果没有绑定click事件的话就当没click,但是正下方的是input输入框(或者select选择框或者单选复选框),点击默认聚焦而弹出输入键盘,也就出现了上面的点透现象。
来个栗子感受一下 dialog是悬浮在input元素上的一个div
$(function(){
var msg = $('.msg');
$('.title').tap(function(){
msg.html(+new Date)
$('.dialog').remove();
});
$('.input').click(function(){
$('.input').text('clicked');
});
});
zepto的tap事件
首先tap并不是原生就有的事件 而是根据touchstart touchend的位置以及相隔时间综合判断而触发的一个事件
zepto中 touchstart touchend绑定在了 body 上
$(document.body).bind('touchstart', function(e){
now = Date.now()
delta = now - (touch.last || now)
touch.el = $(parentIfText(e.touches[0].target))
//....
}).bind('touchmove', function(e){
//...
}).bind('touchend', function(e){
cancelLongTap()
//...
// normal tap
} else if ('last' in touch) {
touch.el.trigger('tap')
touchTimeout = setTimeout(function(){
touchTimeout = null
touch.el.trigger('singleTap')
touch = {}
},
}
});
而click的触发是由机器决定的(或者说是机器模拟的click ) 为了消除这个300ms后才有的click 就有了fastclick
fastclick
FastClick 是 FT Labs 专门为解决移动端浏览器 300 毫秒点击延迟问题所开发的一个轻量级的库。简而言之,FastClick 在检测到 touchend 事件的时候,会通过 DOM 自定义事件立即触发一个模拟 click 事件,并把浏览器在 300 毫秒之后真正触发的 click 事件阻止掉。
使用方式很简单
window.addEventListener( "load", function() {
FastClick.attach( document.body );
}, false );
fastclick实现
FastClick.prototype.onTouchEnd = function(event){
// 一些状态监测代码
// 从这里开始,
if (!this.needsClick(targetElement)) {
// 如果这不是一个需要使用原生click的元素,则屏蔽原生事件,避免触发两次click
event.preventDefault();
// 触发一次模拟的click
this.sendClick(targetElement, event);
}
}
模拟click事件
FastClick.prototype.sendClick = function(targetElement, event) {
// 这里是一些状态检查逻辑
// 创建一个鼠标事件
clickEvent = document.createEvent('MouseEvents');
// 初始化鼠标事件为click事件
clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
// fastclick的内部变量,用来识别click事件是原生还是模拟
clickEvent.forwardedTouchEvent = true;
// 在目标元素上触发该鼠标事件,
targetElement.dispatchEvent(clickEvent);
在zepto上改造一下 , 约1336行的touchend事件中 在触发了tap之后
e.preventDefault();
var clickEvent = document.createEvent('MouseEvents');
// 初始化鼠标事件为click事件
//Pass in the options
// event.initMouseEvent(
// opts.type,
// opts.canBubble,
// opts.cancelable,
// opts.view,
// opts.detail,
// opts.screenX,
// opts.screenY,
// opts.clientX,
// opts.clientY,
// opts.ctrlKey,
// opts.altKey,
// opts.shiftKey,
// opts.metaKey,
// opts.button,
// opts.relatedTarget
// );
clickEvent.initMouseEvent("click", true, true, window, 1, 0, 0, touch.x1, touch.y1, false, false, false, false, 0, null);
clickEvent.forwardedTouchEvent = true;
touch.el[0].dispatchEvent(clickEvent);
改造后 在IOS中click事件 和tap约10ms差距(不同机器不同 PC只有5ms)
并且点透的问题也OK了
移动端的click的更多相关文章
- 关于移动端的Click事件
在移动端执行Click事件,通常情况出现有300毫秒的延迟,为防止这种不必要的延迟效果,我们可以换种方式来实现,同样达到快速执行Click事件的效果. 先了解一下移动端Click的执行顺序: touc ...
- 移动端的click事件延迟触发的原理是什么?如何解决这个问题?
移动端的click事件延迟触发的原理是什么?如何解决这个问题? 原理 :移动端屏幕双击会缩放页面 300ms延迟 会出现点透现象 在列表页面上创建一个弹出层,弹出层有个关闭的按钮,你点了这个按钮关闭弹 ...
- 百度地图在移动端下click无效的解决方案
这是由于百度地图在移动端屏蔽了click事件,在网上找到一种方法,利用touchClick方法来模拟click事件,代码如下(需要JQ插件): //给jquery添加touchClick方法 (fun ...
- 移动端的click点透问题
在移动端开发中,有时会出现click点透的问题. 一.什么是click点透 以下情况,在B元素上有半透明红色遮盖层A,黄色B元素内有可点击链接C. tips:以下举例仅针对webkit内核浏览器,所有 ...
- vue.js下移动端绑定click事件失效,pc端正常的问题
原因可能是 我在项目中使用到了 better-scroll,默认它会阻止 touch 事件.所以在配置中需要加上 click: true 即可. 例如: mounted () { this.scrol ...
- 解决在移动端上 click事件延迟300 毫秒的问题 fastclick.js
1 为什么会发生延迟300毫秒的问题 移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击.为了能够立即响应用户的点击事件,才有了FastClick ...
- better-scroll在移动端绑定click事件失效
在做一个列表的时候需要点击列表将列表信息输出,给<li>加个一个很简单的@click,可是没有反应. 原因是使用了better-scroll,默认它会阻止touch事件.所以在配置中需要加 ...
- 移动端消除click事件的延迟效果
https://github.com/Plaputta/jquery.event.special.fastclick 用fastclick事件,类似zepto的tap事件,若想去除连点效果,可在外层显 ...
- 移动端web开发,click touch tap区别
转自: http://blog.csdn.net/sly94/article/details/51701188 移动端用tap时会有穿透问题 一:click与tap比较 click与tap都会触发点击 ...
随机推荐
- 解决VS2010打开Web页面时经常由于内存较低而导致VS2010自动关闭的问题
在使用VS2010 开发Web应用程序的时候,经常打开一个Web页面进行编辑前台代码的时候要等待很久(甚至等了半天结果还挂掉,简直令人抓狂), 之前也在网上找了很多相关的方法,都没办法解决,今天无意中 ...
- 又一个类dapper轮子:VIC.DataAccess
DataAccess Author: Victor.X.Qu Email: fs7744@hotmail.com DataAccess is a c# project for sql data map ...
- Set无序怎么办?
在JAVA中,提供多种不同的结构来组织对象,Set(集合)是其中的一种,本身是一个接口,其迭代时的顺序取决于其具体实现. 典型的实现包括: HashSet:哈希表是通过使用称为散列法的机制来存储信息的 ...
- 比callback更简洁的链式执行promise
promise自己理解的也不够深刻,具体知识点不在这里细说了 直接上个例子,清晰明了,自己去悟吧 <script type="text/javascript"> //模 ...
- Android IT资讯网络阅读器应用源码
这个是Android IT资讯网络阅读器应用,也是一款通过jsoup解析Html获取内容的网络阅读器,和前面的其实是类似的,也是大学时期闲暇完成,对照CSDN的Web页面元素设计进行解析提取内容,核心 ...
- vb6.0 时间日期
使用year(now)可以得到4位数的年 你还可以用Format来得到, 还有FormatDateTime 下面两种都是一样的结果: FormatDateTime(now,vbLongDate ...
- Oracle EBS-SQL (SYS-7):表单个性化查询.sql
SELECT * FROM FND_FORM_CUSTOM_RULES; SELECT * FROM FND_FORM_CUSTOM_ACTIONS; SELECT * FROM FND_FORM_C ...
- 省去路由器,Windows 7 也能做无线AP
电脑越来越白菜了,很多朋友家里已经有不少于二台电脑了.比方说一台笔记本一台台试机,哪么上网和联机的问题,随之而来了,二台电脑很多人可能会去买一个路由器,事实上,如果你其中一台有二个网卡一个有线一个无线 ...
- 两个DIV,左DIV宽度固定,右DIV自动填满剩余空间
<style type="text/css"> #main{ width:98%; } #sidebar{ float:left; width:200px; backg ...
- java积累
数组的使用 package javaDemo; import java.util.*; /** * * @author Administrator * @version 1.0 * * */ publ ...