博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
移动端click延迟和tap事件
阅读量:5050 次
发布时间:2019-06-12

本文共 2268 字,大约阅读时间需要 7 分钟。

一、click等事件在移动端的延迟

click事件在移动端和pc端均可以触发,但是在移动端有延迟现象。

1、背景

由于早期移动设备浏览网页时内容较小,为了增强用户体验,苹果公司专门为移动设备设计了双击放大的功能,以确保用户可以方便地放大网页内容,但是当用户单击按钮的时候,移动设备需要延迟约300ms执行,以判断用户是否是要双击。

2、验证

下面通过js代码来直观地验证click等事件的延迟

<div class="result">点我试试</div>

var startTime;         //打印信息函数         var log = function(msg) { var p = document.createElement('p'); //计算触发事件 //new Date().getTime() 获取当前时间 //new Date().getTime()-startTime 获取事件响应与touchStart的时间差 p.innerHTML = (new Date().getTime())+" : "+(new Date().getTime()-startTime)+" : "+msg; //添加到页面中中 document.body.appendChild(p); } //触屏 var touchStart = function(){ startTime = new Date().getTime(); log('touchStart'); } //触屏结束 var touchEnd = function() { log('touchEnd'); } //鼠标按下 var mouseDown = function() { log('mouseDown'); } //鼠标点击 var mouseClick = function(){ log('mouseClick'); } //鼠标弹起 var mouseUp = function() { log('mouseUp'); } var result = document.querySelector('.result'); //绑定事件 result.addEventListener('mousedown',mouseDown); //先绑定pc端点击事件 result.addEventListener('click',mouseClick); result.addEventListener('mouseup',mouseUp); result.addEventListener('touchstart',touchStart);//绑定移动端事件 result.addEventListener('touchend',touchEnd);

移动端 时间响应原则:优先响应移动端独有事件。

二、解决办法

1、使用touch事件模拟click事件

如下使用touchstart和touched封装了一个移动端的tap事件

var idcast = {
        //传入dom元素         tap:function(dom,callback) { //判断是否传入了dom元素,或者dom元素是否是一个对象 if(!dom||typeof dom != "object"){ return; } var startX,startY,time,moveX,moveY,distanceX,distanceY; dom.addEventListener("touchstart",function(e) { if(e.targetTouches.length>1) { return; } startX = e.targetTouches[0].clientX; startY = e.targetTouches[0].clientY; time = Date.now(); }); dom.addEventListener("touchend",function(e) { if(e.changedTouches.length>1) { //说明不止一个手指 return; } //判断时间差异 if(Date.now()-time>150){ //长按操作 return; } //获取松开手指的时候的坐标与触摸开始时的坐标差异 moveX = e.changedTouches[0].clientX; moveY = e.changedTouches[0].clientY; distanceX = moveX - startX; distanceY = moveY - startY; //判断坐标差异 if(Math.abs(distanceX) < 6 && Math.abs(distanceY) <6) { //说明是点击而非滑动 //执行tap事件相应之后的处理操作 //若函数不为空才调用 callback&&callback(e); console.log("移动端点击单击事件--tap事件"); } }) } }

可以直接调用idcast中tap方法。

2、使用zepto中已经封装好的tap事件直接调用

$(menuBox).on("tap",callback)

zepto下载链接:

转载于:https://www.cnblogs.com/jaelynl/p/10175892.html

你可能感兴趣的文章
生产案例、Linux出现假死,怎么回事?
查看>>
树结构(三)---- 多路查找树
查看>>
07深入理解C指针之---指针类型和长度
查看>>
06深入理解C指针之---指针操作和比较
查看>>
SQL Server发送邮件的存储过程
查看>>
【20160924】GOCVHelper 图像处理部分(3)
查看>>
HashMap底层原理
查看>>
js/jQuery实现类似百度搜索功能
查看>>
【转】排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
查看>>
myeclipse中修改servlet的模板代码
查看>>
js 倒计时10s
查看>>
再次陷入迷惘期的一点感想
查看>>
字符串的常用方法
查看>>
SQL查询语句 常用示例
查看>>
抄写例题作业1
查看>>
Nginx geo模块
查看>>
mingw using pthread
查看>>
centos6.4搭建基于ftp的yum源让本地局域网服务器使用
查看>>
php GD 和图像处理函数, 制作一张图片
查看>>
设计模式第二篇-观察者模式
查看>>