1.移动端与pc端的区别

  • (1)移动端没有鼠标,自然也没有鼠标事件。所以onmousedown之类的事件监听在移动端时无效的。
  • (2)移动端为了响应双击事件,onclick事件有300ms的延迟,接下来的300ms内有没有再次点击,有的话视为双击,没有的话视为单击。
  • (3)移动端双击事件:移动端双击时,除了有dblclick事件触发,还有相应的手势效果(放大/缩小),不过不同的浏览器效果不一致。有些浏览器两种特性都支持,有些只支持其中的一种,但是一般最少都支持一种。

下面的代码可以验证当前手机上onclick事件的延迟(在没有设置viewport的时候执行)

 <!-- <meta name="viewport" content="width=device-width, initial-scale=1.0"> -->
<script>
var box = document.querySelector(".box")
var click_time,touchstart_time,touchend_time
box.ontouchstart = function(){
//获取事件触发时的时间戳
touchstart_time = new Date().getTime()
console.log('touchstart time = ' + touchstart_time)
}
box.ontouchend = function(){
//获取事件触发时的时间戳
touchend_time = new Date().getTime()
console.log('touchend time = ' + touchend_time)
}
box.onclick = function(){
//获取事件触发时的时间戳
click_time = new Date().getTime()
console.log('click time = ' + click_time) //click一般要晚于touchend事件 我们来看看事件差
console.log(`与touchstart的时间差${click_time - touchstart_time}`)
console.log(`与touchend的时间差${click_time - touchend_time}`)
}
</script>

下面是chrome浏览器手机模式执行时的效果:

下面是火狐浏览器手机模式执行时的效果:

下面是Edge浏览器手机模式执行时的效果:

使用真机测试时记得引入下面的插件,才能查看控制台的输出情况:

<script src="http://cdn.jsdelivr.net/npm/eruda"></script>
<script>
eruda.init();
</script>

IOS13 Safari/chrome/edge/alook/执行效果都差不多,但是无论怎么算click延迟都大于300ms:

总结:click事件的延迟是存在的,但是不同的设备和浏览器计算延迟的方式不一致

下面的代码验证移动端的双击效果(在没有设置viewport的时候执行):

box.ondblclick = function(){
console.log('dblclick')
}

PC火狐浏览器手机模式(不仅执行dblclick事件,而且有双击放大/缩小的效果):

PC chrome/edge浏览器手机模式(不执行dblclick事件,有双击放大/缩小的效果):

IOS13真机执行效果:

Safari/火狐:能执行dblclick事件,双击放大/缩小。

Edge:能执行dblclick事件,三击放大/缩小(快速点3次)。

chrome:能执行dblclick事件,页面不缩放。

安卓via浏览器:不执行dblclick事件,双击放大/缩小。

2.touch事件

touch事件没有延迟,它是移动端特有的,pc端不支持

他有以下几个事件:

touchstart:开始触屏事件

touchmove:手指滑动事件(持续触发,只touch不滑动不会触发)

touchstend:触屏结束事件

touchcancal:触屏意外中断事件(手机中途来电?)

基本用法:

<script>
document.addEventListener("touchstart",function(){
console.log("touchstart")
})
document.addEventListener("touchmove",function(){
console.log("touchmove")
})
document.addEventListener("touchend",function(){
console.log("touchend")
})
</script>

如果在touchstart中阻止了默认事件,则onlcik事件不会被触发(阻止默认事件不要挂载到document上,浏览器可能不支持)

<script>
var box = document.querySelector(".box")
box.addEventListener("touchstart",function(e){
console.log("touchstart")
//阻止默认事件,可阻止click事件
e.preventDefault()
})
box.addEventListener("touchmove",function(e){
console.log("touchmove")
})
box.addEventListener("touchend",function(e){
console.log("touchend")
})
box.addEventListener("click",function(e){
console.log("click")
})
box.ondblclick = function(){
console.log('dblclick')
}
</script>

PC Chrome浏览器手机模式执行效果(click和dblclick都不执行,且双击时不缩放):

PC 火狐浏览器手机模式执行效果(单击时不执行click和dblclick,):

IOS13手机浏览器执行效果:

Safari/Chrome/火狐/Edge:单击/双击都不执行click和dblclick,页面不缩放(换句话说,能阻止页面缩放和click和dblclick事件)

3.touchEvent事件对象

touchEvent事件对象描述了当前事件中的一系列信息

e.target:触发事件的Dom元素,要注意的是,在同一个touch事件中,用户touch过程产生了滑动,可能touchstart碰触的元素和touchend时元素已经不是同一个,但是他们的e.target依旧指向touchstart中碰触的元素

代码:

效果:

touch事件触发时,可能有一个或多个触点,可以用下面的属性(数组)获取相应的信息:

e.touches:当前屏幕上所有触摸点的列表(只针对touchstart)

e.targetTouches:当前对象上所有触摸点的列表(只针对touchstart)

e.changedTouches:

对于 touchstart 事件, 这个 TouchList 对象列出在此次事件中新增加的触点。

对于 touchmove 事件,列出和上一次事件相比较,发生了变化的触点。

对于touchend事件,changedTouches 是已经从触摸面的离开的触点的集合(也就是说,手指已经离开了屏幕/触摸面)。

每个触点包含下面的属性:

clientX:触摸目标在视口中的x坐标。

clientY:触摸目标在视口中的y坐标。

identifier:标识触摸的唯一ID。

pageX:触摸目标在页面中的x坐标。

pageY:触摸目标在页面中的y坐标。

screenX:触摸目标在屏幕中的x坐标。

screenY:触摸目标在屏幕中的y坐标。

target:触摸的DOM节点目标。

如图:

4.onclick事件延迟的处理

实际开发中300ms的延迟让用户的体验非常不好,我们自然要把延迟去除,而click也涉及到dblclick事件,这里一并测试。

方法一: 更改默认视口宽度为设备宽度

<meta name="viewport" content="width=device-width">

PC Chrome手机模式(click延迟取消,双击不执行dblclick,双击页面不缩放):

PC 火狐手机模式(click延迟取消,双击执行dblclick,双击页面不缩放):

IOS13 真机测试:

Safari/Chrome/Edge/火狐:click大大降低,双击执行dblclick,双击页面不缩放,三击不缩放。

更改默认视口宽度后,click延迟大大降低,在真机测试中,click只比touchend落后40ms左右,dblclic大都能触发。

方法二:fastclick

原理: 在检测到touchend事件的时候,会通过DOM自定义事件立即出发模拟一个click事件,并把浏览器在300ms之后真正的click事件阻止掉(原理应该就是前面所说的在touchstart中阻止默认事件,所以后续的dblclick不会被执行)

屏幕适配方案中,viewport适配需要破坏完美视口,此时配合fastclick可以解决click的延迟问题

步骤:引入fastclick文件,在页面成功加载后,执行FastClick.attach()函数,并传入相应的dom元素

优点:click延迟只有1-2ms,比方法一延迟更低

缺点: 脚本相对较大

<!-- 引入fastclick -->
<script src="https://cdn.bootcss.com/fastclick/1.0.6/fastclick.js"></script>
<script>
window.onload = function(){
// 初始化,传入的参数表明整个页面中FastClick都生效
FastClick.attach(document.body) var box = document.querySelector(".box")
var click_time,touchstart_time,touchend_time
box.ontouchstart = function(){
//获取事件触发时的时间戳
touchstart_time = new Date().getTime()
console.log('touchstart time = ' + touchstart_time)
}
box.ontouchend = function(){
//获取事件触发时的时间戳
touchend_time = new Date().getTime()
console.log('touchend time = ' + touchend_time)
}
box.onclick = function(){
//获取事件触发时的时间戳
click_time = new Date().getTime()
console.log('click time = ' + click_time) //click一般要晚于touchend事件 我们来看看事件差
console.log(`与touchstart的时间差${click_time - touchstart_time}`)
console.log(`与touchend的时间差${click_time - touchend_time}`)
}
box.ondblclick = function(){
console.log('dblclick')
}
}
</script>

fastclick使click延迟会降低至1-2ms,安卓via依旧触发dblclick,而ios13一众浏览器都不触发

5.click与dblclick事件总结

(1)未设置视口宽度时,click事件存在300ms的延迟,而dblclick事件有些浏览器不能触发(安卓via)

(2)设置视口宽度为设备名宽度后,click时间延迟降低,降低幅度可能取决于系统。在ios13中多数浏览器都还有40ms,而安卓via只有7-8ms。ios13和安卓via都能触发dblclick事件,视口宽度不是设备宽度则不行。

(3)在touchstart事件中阻止默认事件后,ios13一众浏览器都不触发click和dblclick事件,包括安卓via。

(4)使用fastclick一般配合viewport适配,安卓via依旧触发dblclick,而ios13一众浏览器都不触发。

web移动端触屏事件的更多相关文章

  1. js移动端触屏事件

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...

  2. 从零开始学 Web 之 移动Web(二)JD移动端网页,移动触屏事件

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  3. 移动端touch触屏滑动事件、滑动触屏事件监听!

    一.触摸事件 ontouchstart.ontouchmove.ontouchend.ontouchcancel 目前移动端浏览器均支持这4个触摸事件,包括IE.由于触屏也支持MouseEvent,因 ...

  4. 移动端触屏滑动,JS事件

    先了解下 移动端的触屏滑动 毕竟这玩意其实和PC端还是有一定的区别的 hh 整理了下网上的资料放一放 移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等 ...

  5. 移动端触屏click点击事件延迟问题,以及tap的解决方案

    在移动端 触屏click事件虽然也会响应,但是总感觉是有延迟,一直听说click事件在手机上有200~300毫秒的延迟问题,亲自测了一下,在pc端模拟手机的话是测不出来的,但是用手机测试时发现延迟非常 ...

  6. JS案例之5——移动端触屏滑动

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...

  7. 转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)

    本文转载自CSDN的jzj1993,原文连接:http://blog.csdn.net/jzj1993/article/details/39158865 有时我们需要使用安卓实现在后台模拟系统按键,比 ...

  8. HTML5学习总结-09 拖放和手机触屏事件

    一 拖放 拖放(Drag 和 drop)是 HTML5 标准的组成部分.拖放是一种常见的特性,即抓取对象以后拖到另一个位置.在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 课程参考 ht ...

  9. (转)js的左右滑动触屏事件

    原文:http://blog.sina.com.cn/s/blog_6a0a183f0100zsfk.html (2012-01-20 08:55:53) 转载▼ 标签: 移动设备 触屏事件 杂谈 分 ...

  10. [IOS]自定义长触屏事件

    写一个Demo来自定义一个长触屏事件,自定义长按手势. 实现步骤: 1.创建一个自定义手势类,命名为LongPressGestureRecognizer,在创建的时候继承UIGestureRecogn ...

随机推荐

  1. 『面试题』WEB前端面试专题-Promise相关

    题目一 const promise = new Promise((resolve, reject) => { console.log(1); resolve(); console.log(2); ...

  2. RxJS 系列 – Join Operators

    前言 前几篇介绍过了 Creation Operators Filtering Operators Join Creation Operators Error Handling Operators T ...

  3. 阿里面试官常问的TCP和UDP,你真的弄懂了吗?

      前  言 作为软件测试,大家都知道一些常用的网络协议是我们必须要了解和掌握的,面试的时候面试官也非常喜欢问一些协议相关的问题,其中有两个协议因为非常基础,出现的频率非常之高,分别是 "T ...

  4. 借助 Flutter 顺畅地开发多平台应用

    Flutter 已于近期发布了 Flutter 2,Flutter 和 Dart 的产品总监 Tim Sneath 在 2021 年三月上旬举办的 Flutter Engage 活动中表示,Flutt ...

  5. [TK] Tourist Attractions

    题目描述 给出一张有 \(n\) 个点 \(m\) 条边的无向图,每条边有边权. 你需要找一条从 \(1\) 到 \(n\) 的最短路径,并且这条路径在满足给出的 \(g\) 个限制的情况下可以在所有 ...

  6. 【USB3.0协议学习】Topic3·三种Reset Events分析

    USB3.0中的三种Reset Events 1. PowerOn Reset PowerOn Reset被用来代指上电复位,当一个device接入到root hub或者外置hub的时候,该devic ...

  7. kdump

    Kdump简单介绍 什么是Kdump? Kdump是在系统崩溃.死锁或死机时用来转储内存运行参数的一个工具和服务,是一种新的crash dump捕获机制,用来捕获kernel crash(内核崩溃)的 ...

  8. Pytorch 实现 GAN 网络

    Pytorch 实现 GAN 网络 原理 GAN的基本原理其实非常简单,假设我们有两个网络,G(Generator)和D(Discriminator).它们的功能分别是: G 是一个生成网络,它接收一 ...

  9. 活动预告 | 中国数据库联盟(ACDU)中国行第三站定档成都,邀您探讨数据库前沿技术

    数据库技术一直是信息时代中不可或缺的核心组成部分,随着信息量的爆炸式增长和数据的多样化,其重要性愈发凸显.作为中国数据库联盟(ACDU)的品牌活动之一,[ACDU 中国行]在线下汇集数据库领域的行业知 ...

  10. 在Vue3中如何实现四种全局状态数据的统一管理?

    四种全局状态数据 在实际开发当中,会遇到四种全局状态数据:异步数据(一般来自服务端).同步数据.同步数据又分为三种:localstorage.cookie.内存.在传统的 Vue3 当中,分别采用不同 ...