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. Angular 18+ 高级教程 – Component 组件 の 生命周期钩子 (Lifecycle Hooks)

    前言 之前在 Component 组件 の Angular Component vs Custom Elements 文章中,我们有学习过几个基础的 Lifecycle Hooks. 比如 OnCha ...

  2. 新题速看!2021阿里、腾讯、字节都在问的SQL数据库笔试题及答案都给你整理好啦!

    ​    前  言 2021到了最后一个月份,年后肯定有蛮多小伙伴需要跳槽换工作,但对于年限稍短的软件测试工程师,难免会需要进行笔试,而在笔试中,基本都会碰到一道关于数据库的大题,今天这篇文章呢,就收 ...

  3. HDLC报文简单分析

    最近在学习HDLC协议,从刚开始的一窍不通到现在的懵懵懂懂,下面分享一段报文解析,给初学者一点点经验的分析. 报文:7E A0 57 03 02 B8 4B 5B E6 E7 00 C4 01 C1 ...

  4. Project: Kill e

    接到上级任务,今天来暗杀 \(e\) 据说杀死 \(e\) 的方式就是把他算出来,好吧,现在我们还是来算一下 考虑使用如下代数式求解 \[e\ \text{site:baidu.com} \] 虽然我 ...

  5. Haproxy详解以及基于Haproxy的高可用实战

    1.Haproxy与Keepalived VRRP 介绍 软件:haproxy 主要是做负载均衡的7层,也可以做4层负载均衡 apache也可以做7层负载均衡,但是很麻烦.实际工作中没有人用. ngi ...

  6. Linux_动态库与静态库(其一)

    1.动态库和静态库的定义 动态库(.so):动态库是编译后不嵌入目标文件中的共享库,在程序运行的时候才去链接动态库的代码,可以被多个程序共享使用,通常以 .so 结尾. 静态库(.a):静态库是将一组 ...

  7. 图片的穿透效果 -- pointer-events: none

    使用场景:当我们需要选择上传文件的时候,图片把input输入框覆盖在上面,点击的时候不能出发input输入框所以要给图片设置穿透属性 : 具体代码: #image { position: fixed; ...

  8. 63.CDN优化

    虽然CDN引入组件库可以优化项目,减轻服务器负载,但是在真实的项目开发中不推荐使用CDN : 因为: 1. 使用第三方服务器不稳定 2. 需要后端配置 3. 要知道组件库的全局变量名

  9. java工具篇-IDEA

    java的开发离不开好的开发工具,这就需要了解集成开发工具idea 背景黑白风格 设置方法File–>settings–>Appearance & Behavior–>App ...

  10. OpenCV开发笔记(八十一):通过棋盘格使用鱼眼方式标定相机内参矩阵矫正摄像头图像

    前言   对于广角摄像头通过相机图片可以识别出棋盘角点计算相机内参矩阵,通过畸变校准可以得到较好的效果,但是鱼眼摄像头通过这种方式获得周围四周的图像效果并不是很好.所以,鱼眼摄像头在校准上与普通摄像头 ...