移动端的点击事件的有延迟,为什么会有?

2020-09-14 16:03发布

4条回答
流流流年
2楼 · 2020-09-14 17:06

因为浏览器捕获第一次单击后,会先等待一段时间,如果在这段时间区间里用户未进行下一次点击,则浏览器会做单击事件的处理。如果这段时间里用户进行了第二次单击操作,则浏览器会做双击事件处理。

桥豆麻袋
3楼 · 2020-09-14 17:25

 2007年苹果发布首款iphone上IOS系统搭载的safari为了将适用于PC端上大屏幕的网页能比较好的展示在手机端上,使用了双击缩放(double tap to zoom)的方案,比如你在手机上用浏览器打开一个PC上的网页,你可能在看到页面内容虽然可以撑满整个屏幕,但是字体、图片都很小看不清,此时可以快速双击屏幕上的某一部分,你就能看清该部分放大后的内容,再次双击后能回到原始状态。 双击缩放是指用手指在屏幕上快速点击两次,iOS 自带的 Safari 浏览器会将网页缩放至原始比例。 原因就出在浏览器需要如何判断快速点击上,当用户在屏幕上单击某一个元素时候,例如跳转链接,此处浏览器会先捕获该次单击,但浏览器不能决定用户是单纯要点击链接还是要双击该部分区域进行缩放操作,所以,捕获第一次单击后,浏览器会先Hold一段时间t,如果在t时间区间里用户未进行下一次点击,则浏览器会做单击跳转链接的处理,如果t时间里用户进行了第二次单击操作,则浏览器会禁止跳转,转而进行对该部分区域页面的缩放操作。那么这个时间区间t有多少呢?在IOS safari下,大概为300毫秒。这就是延迟的由来。造成的后果用户纯粹单击页面,页面需要过一段时间才响应,给用户慢体验感觉,对于web开发者来说是,页面js捕获click事件的回调函数处理,需要300ms后才生效,也就间接导致影响其他业务逻辑的处理。 

//解决方案: fastclick可以解决在手机上点击事件的300ms延迟 zepto的touch模块,tap事件也是为了解决在click的延迟问题



一、tap.js解决方案


[html] view plain copy

  1. <script src="tap.js">script>  

  2.   

  3. <div id="container">  

  4.   <button id="button-1">Click eventbutton>  

  5.   <button id="button-2">Tap eventbutton>  

  6. div>  

  7.   

  8. <div id="output">div>  

  9.   

  10. <script>  

  11.   var container = document.getElementById('container')  

  12.   var button1 = document.getElementById('button-1');  

  13.   var button2 = document.getElementById('button-2');  

  14.   var output = document.getElementById('output');  

  15.   

  16.   var tap = new Tap(container);  

  17.   

  18.   button1.addEventListener('click', callback, false);  

  19.   button2.addEventListener('tap', callback, false);  

  20.   

  21.   function callback (e) {  

  22.       e.preventDefault();  

  23.       var p = document.createElement('p');  

  24.       p.textContent = 'event: ' + e.type;  

  25.       output.insertBefore(p, output.firstChild);  

  26.   }  

  27. script>  



二、fastclick.js解决方法


[html] view plain copy

  1. <html xmlns="http://www.w3.org/1999/xhtml">  

  2. <head>  

  3.     <title>title>  

  4.     <style>  

  5.         *  

  6.         {  

  7.             margin: 0;  

  8.         }  

  9.         body  

  10.         {  

  11.         }  

  12.         .button  

  13.         {  

  14.             background-color: #3d3d3d;  

  15.             border: 0px;  

  16.             height: 80px;  

  17.             width: 80%;  

  18.             font-size: 50px;  

  19.             margin: 10% 0% 0% 10%;  

  20.             color: #fff;  

  21.         }  

  22.         .fu  

  23.         {  

  24.             min-height: 100%;  

  25.             min-width: 100%;  

  26.             background-color: Black;  

  27.             background: rgba(0,0,0,0.4);  

  28.             position: absolute;  

  29.             top: 0;  

  30.             text-align: center;  

  31.             display: none;  

  32.         }  

  33.         .ts  

  34.         {  

  35.             margin: 8% auto;  

  36.             width: 400px;  

  37.             height: 400px;  

  38.             top: 59%;  

  39.             background-color: #fff;  

  40.             text-align: center;  

  41.         }  

  42.     style>  

  43.     <script src="fastclick.js" type="text/javascript">script>  

  44.     <script src="jquery-1.7.2.js" type="text/javascript">script>  

  45.     <script type="application/javascript">  

  46.         window.addEventListener('load', function () {  

  47.             FastClick.attach(document.body);  

  48.         }, false);  

  49.         function xian() {  

  50.      

  51.             $(".fu").show().hide(350);  

  52.         }  

  53.     script>  

  54. head>  

  55. <body>  

  56.     <div>  

  57.         <div class="but">  

  58.             <input class="button" type="button" value="点击我" onclick="xian()" />div>  

  59.         <div class="fu" >  

  60.             <div class="ts">  

  61.                 我是浮层  

  62.             div>  

  63.         div>  

  64.     div>  

  65. body>  

  66. html>  




kitidog2016
4楼 · 2020-09-14 18:27

大多数基于触摸的浏览器设备,在点击时都会有个 300ms 的事件触发等待时间,做过 web app 开发的同学应该都遇到过这个情况,通过下面的5步可以轻松搞定这个延迟。

1、不要太纠结于此
是否能接受这 300ms 的时间延迟,往往取决于你的应用和目标受众,比如:如果是个内容为主,并且菜单较少的应用,那么用户在阅读上花费的事件远远大于在菜单上消耗的事件,这种 情况下 300ms 是完全可以接受的,并且没有 300ms 延迟的体验并不会好很多。分析你的应用判断是否需要解决这个不是问题的问题,在做正确抉择。

2、禁用缩放 (chrome 和 firefox)

在 chrome 和 firefox 的移动版本中,如果禁用了页面缩放,那么着 300ms 的延迟就会自动消失,具体代码如下:


但是这一方案在 safari 上并不起作用,还会降低有视觉或运动障碍用户的可访问性。

3、设置 viewport 的 device-width (chrome 32+)
在 chrome 32+ 中,如果设置了 viewport 的宽度小于或等于物理设备的宽度,那么也会达到禁用缩放的效果。

注意:这里的最大缩放比与上面meta中的值并不一致,这个是关键点。

4、使用指针事件 (IE10+)

微软已经针对触摸问题发布了具体的规范,例如:在你滚屏的时候 pointerup 事件并不会被触发。

这儿有一个非标准的 CSS 触摸 action 属性,它允许你移除特定元素或整个文档的触发延迟,而无需禁用缩放:

a, button, .myelements {-ms-touch-action: manipulation; /* IE10  */touch-action: manipulation;     /* IE11+ */}


5、使用fastclick.js

FastClick 是 FT Labs 专门为解决移动端浏览器 300 毫秒点击延迟问题所开发的一个轻量级的库。简而言之,FastClick 在检测到touchend事件的时候,会通过 DOM 自定义事件立即触发一个模拟click事件,并把浏览器在 300 毫秒之后真正触发的click事件阻止掉。使用方法如下。

      第一步:在页面中引入fastclick.js文件。
      第二步:在js文件中添加以下代码
      在 window load 事件之后,在body上调用FastClick.attach()即可。

window.addEventListener(function(){FastClick.attach( document.body );},false );

如果你项目使用了JQuery,就将上面的代码改写成:

$(function() {FastClick.attach(document.body);});


6、使用 touchend 事件处理

不同于 click 和 touchstart,touchend 没有这个 300ms 的延迟,而是即时触发,你完全可以在 WebGL 或 canvase 游戏中进行实践,但是在web 页面中单单使用 touchend 并不一定靠谱.

1、如果用户在两个不同元素之间触发了 touchstart 和touchend,那么 click 不会被触发 .

2、如果用户触发了 touchstart,但是在touchend之前是一个长长的 touchmove 滚动, 那么 click 也不会被触发.

3、在站点上任然应该保留 click 事件以兼容那些非触摸设备,这是你就要考虑事件的重复触发问题.

在此处输入内容已有同行为我们封装了部分解决方法:

1、FastClick 来至于FT实验室的一个插件,仅仅只有10kb,但是能解决上面的2-4步.

2、Tappy 来自于Filament Group,仅仅1kb,概念上类似于上面的指针事件.

问题:当你为多个元素进行这些事件绑定时,有可能出现性能的损耗.

是否有完美的解决方案呢?

是否需要解决 300ms 在于自己的判断,300ms被设计出来是有特定的用途,上面的meta属性中进行了设定,在chrome和firefox下能起作用,希望其他厂商也能尽 快提供这类支持。touch-action: manipulation 这个css属性能把风险降到最低,虽然现在只有微软支持,但是作为W3C规范和HTML5test的一部分,因此也许我们并不需要等待太久。


cc收获啦
5楼 · 2020-09-15 09:19

这与双击缩放的方案有关。平时我们有可能已经注意到了,双击缩放,即用手指在屏幕上快速点击两次,可以看到内容或者图片放大,再次双击,浏览器会将网页缩放至原始比例。

      浏览器捕获第一次单击后,会先等待一段时间,如果在这段时间区间里用户未进行下一次点击,则浏览器会做单击事件的处理。如果这段时间里用户进行了第二次单击操作,则浏览器会做双击事件处理。这段时间就是上面提到的300毫秒延迟。


相关问题推荐

  • 回答 120

    相对前几年来说,要高上不少了,毕竟入行的人也是越来越多了,基础的工作对应想要参与的人群基数越来越大,但是对于高端人才的需求还是很多,人才还是相对稀缺性的。所以,想要学web或者其他技术也一样,别等,别观望。web前端就业方向特别多包括web前端开发...

  • 回答 25

    相对定位和绝对定位是定位的两种表现形式,区别如下:一、主体不同1、相对定位:是设置为相对定位的元素框会偏移某个距离。2、绝对定位:absolute 脱离文档流,通过 top,bottom,left,right 定位。二、特点不同1、相对定位:在使用相对定位时,无论是否进行移...

  • 抓包是什么意思?2020-04-01 17:36
    回答 7
    已采纳

    抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。抓包可以通过抓包工具来查看网络数据包内容。通过对抓获的数据包进行分析,可以得到有用的信息。目前流行的...

  • 回答 89

    常用的前端框架有Bootstrap框架、React框架、Vue框架、Angular框架、Foundation框架等等

  • 回答 65
    已采纳

    前端是目的就业前景非常不错的一个计算机技术,但是自学的话还是有一定难度的,网络上自学是碎片化的,同时互联网技术跟新换代快,自己的话比较吃力也学习不到最新的技术。

  • SSR 是什么意思?2020-03-20 18:56
    回答 6

    SSR就是一台服务器,可以利用 SSR 在远程的服务器上配置 SSR,使其能够成为 SSR 节点,这样本地电脑或者其它设备利用 SSR 节点实现 VPN 或者远程上网及游戏加速等方面。ShadowsocksR(简称 SSR)是 Shadowsocks 分支,在 Shadowsocks 的基础上增加了一些数据...

  • 回答 52
    已采纳

    计算机培训方向比较多,建议找适合自己的方向选择培训编程类:JAVA、WEB、Python、C/C++、C#等测试类:软件测试运维类:云计算、网络安全设计类:UI设计、3D建模等

  • 回答 11

    1、代码判断xAxis: {type: &#39;time&#39;,splitLine: {show: false},interval: 3600, // 设置x轴时间间隔axisLabel: {formatter: function(value, index) {return liangTools.unix2hm(value)}}},首先要把xAxis 显示类型设置成time,然后设置对应X轴......

  • 回答 8

    HTML5 + CSS + JavaScript 开发 跨平台重用代码 

  • 回答 4

    采用rem单位自动响应,并提供独有栅格化系统快速定义宽高、边距节省css代码量,同时总结各大型移动端网页,提供一套ui颜色搭配规范,尺寸规范,字体规范等。

  • 回答 10

    iView UI、ioni、SUI

  • 回答 6

     jQTouch 

  • 回答 4

    如果只是普通的移动端用vue react 或者dva 如果是要编译成小程序什么的或者混生 就用uni-app(对应vue语法)taro(对应react) 或者纯原生 这个没有限制的,自己怎么舒服怎么来

  • 回答 4

    因为可以运用在网页和小程序的开饭中,而且开源,用着便宜,企业都很喜欢

  • 回答 10

    一、Visual Studio Code下载地址:https://code.visualstudio.com/微软在2015年4月30日Build 开发者大会上正式宣布了 Visual Studio Code 项目:一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。Visual Stud...

  • 回答 9

    jQuery自带淡入淡出效果 https://www.w3school.com.cn/jquery/jquery_fade.asp 看看这个 

没有解决我的问题,去提问