首页常见问题正文

怎样解决移动端click事件的延时问题?

更新时间:2023-09-27 来源:黑马程序员 浏览量:

1695724505873_黑马程序员好口碑IT教育.gif

在移动端使用click事件时会出现300ms左右的延时问题,其原因是浏览器需要判断用户的操作是单次点击还是双次点击。例如,在手机上浏览网页时,由于手机屏幕比较小,页面中可能会有一些文字看不清楚。为了看清楚文字,用户通常会快速双击屏幕放大页面查看内容。当用户第一次点击屏幕时,浏览器无法立刻判断用户的操作,浏览器会等待300ms。如果用户在300ms内再次点击了屏幕,浏览器就会认为是一个双次点击的操作,否则就会认为是一个单次点击操作。

随着移动端网页的流行与普及,用户对网页性能有了更高的要求,而在移动端使用click事件会出现延时,这会影响用户的体验。下面我们给出了3个解决方案,用来处理click事件出现300ms延时的问题,大家可以根据实际需求进行选择。

1.禁用缩放解决移动端click事件出现300ms的延时问题

设置浏览器禁用默认的双击缩放即可去掉300ms的点击延时,示例代码如下:

<meta name="viewport" content="user-scalable=no">
上述代码中,使用user-scalable=no表明这个页面不可缩放,此时浏览器就会禁用双击缩放并且去掉300ms点击延时。但这个方案存在缺点,它完全禁用了双击缩放,当我们需要放大文字或者图片时无法满足需求。

2.封装touch事件解决移动端click 事件出现300 ms的延时问题

当浏览器允许用户缩放页面时,可以对touch事件进行封装,解决300ms延时问题,具体实现思路如下:

①当手指触摸屏幕时,记录当前触摸开始的时间。

②当手指离开屏幕时,用离开的时间减去触摸开始的时间,得到手指停留时间。

③如果手指停留时间小于150ms,并且没有滑动过屏幕,就定义为单次点击。

下面编写代码将touch事件手动封装成一个tap事件,解决300ms延时问题,示例代码如下:

//封装tap事件
function tap(obj,callback) {
  var isMove=false;           
//记录手指是否移动
  var startTime=0;            //记录触摸时的时间变量
  obj.addEventListener('touchstart',function(e){
    startTime=Date.now();
}):  //记录触摸时间
  });
obj.addEventListener('touchmove',function (e){
    isMove=true;              //查看手指是否有滑动(如果有,属于拖曳,不属于点击)
  });
  obj.addEventListener('touchend',function (e){
if(!isMove &6 (Date.now()-startTime)<150){
       // 如果手指触摸和离开时间小于150ms,属于点击
         callback && callback();//执行回调函数
    }
    isMove=false;                  // 取反
    startTime=0;
  });
}
// 调用
tap(div,function(){
//执行点击后的代码
});

上述方案可以检测单个元素发生点击时的状态,解决移动端click事件出现300ms的延时问题。

3.使用FastClick 插件解决移动端click 事件出现300 ms的延时问题

FastClick 插件是由FT Labs(英国金融时报实验室)团队开发的JavaScript库,它简单易用,容易上手,解决了click事件在移动端触发时有大约300ms延时的问题。FastClick的实现原理是在检测到touchend事件时,通过DOM自定义事件立即触发click事件,并阻止浏览器在300 ms之后的click事件。

下面讲解如何使用FastClick 插件解决移动端click事件出现300 ms的延时问题,具体步骤如下。

(1)通过官网下载fastclick.js至本地,并在HTML页面中使用<script>标签引入fastclick.js文件,引入方式如下:、

<script src="fastclick.js"></script>

(2)通过JavaScript方式对Fastclick进行实例化,示例代码如下:

  if('addEventListener'in document){
    document.addEventListener ('DOMContentLoaded', function () {
      FastClick.attach(document.body);
    }, false);
  }

上述代码中,FastClick.attach()方法的参数可以是任意的DOM元素,在这里使用document.body表示将body元素中的所有子元素都绑定FastClick事件,解决移动端click。

(3)在HTML页面中,编写结构代码,示例代码如下:

<body>
  <div></div>
</body>

(4)在<script>标签中的Fastclick实例化代码后,编写JavaScript代码,绑定click事件,示例代码如下:

var Odiv=document.querySelector('div');
Odiv.addEventListener('click', function(){
  alert('点击操作');
});


分享到:
在线咨询 我要报名
和我们在线交谈!