javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JavaScript click事件

JavaScript中click事件默认等待300ms延迟问题详解

作者:韩曙亮

这篇文章主要介绍了JavaScript中click事件默认等待300ms延迟问题,当用户单击页面元素时,浏览器无法立刻判断用户的操作是单次点击还是双击,因此浏览器会在首次点击后默认等待300ms左右,下面来深入介绍一下,需要的朋友可以参考下

一、JavaScript中click事件300ms延迟问题

1、问题来源

早期 移动端浏览器 为了实现 " 双击缩放 ( double tap to zoom ) " 功能 而设计的 等待机制 ;

在 移动端网页发展初期 , 手机屏幕尺寸小、分辨率低 , 浏览器提供了 " 双击页面某区域 " 将该区域放大至全屏的功能 , 方便用户查看内容 ;

当用户单击页面元素时 , 浏览器无法立刻判断用户的操作是 :

因此 , 浏览器会默认等待 300ms 左右 , 确认用户没有进行第二次点击后 , 才会触发原生的 click 事件 , 这就造成了 click 事件的 300ms 延迟 ;

2、浏览器适配问题

浏览器适配问题 :

二、解决方案

1、设置viewport元标签(全局禁用/双击缩放功能)

在 HTML 的 <head> 中 添加 viewport 配置 user-scalable=no , 指定页面缩放规则 , 禁用用户手动缩放 ( 包括双击缩放 ) :

<head>
  <!-- 核心配置 : initial-scale=1.0 固定初始缩放比例 , user-scalable=no 禁用缩放 -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
</head>

viewport 关键属性说明 :

2、使用CSS的touch-action属性(局部/全局禁用)

touch-action 是 CSS3 新增属性 , 用于 指定浏览器 如何处理 元素的触摸事件 , 设置为 manipulation 可禁用双击缩放 , 同时 保留平移 ( 滑动 ) 和 捏合缩放功能 ( 比 user-scalable=no 更灵活 ) :

/* 全局生效 : 禁用所有元素的双击缩放 */
* {
  touch-action: manipulation;
}
/* 局部生效 : 仅禁用指定按钮的双击缩放 */
.btn {
  touch-action: manipulation;
}

3、使用移动端原生触摸事件替代click事件

移动端浏览器 提供了 touchstart、touchmove、touchend 等原生触摸事件 , 这些事件 没有 300ms 延迟 , 可直接用于替代 click 事件实现点击交互 ;

优先使用 touchend 事件 , touchstart会在手指刚接触屏幕时触发 , 若用户只是滑动页面 ( 而非点击 ) , 也会触发该事件 , 容易造成误操作 ;

touchend在手指离开屏幕时触发 , 更贴近 " 点击 " 的交互逻辑 , 示例如下 :

// 获取目标元素
const btn = document.querySelector('.btn');
// 绑定touchend事件 , 替代click
btn.addEventListener('touchend', function(e) {
  // 阻止事件冒泡 ( 按需可选 ) 
  e.stopPropagation();
  // 阻止浏览器默认行为 ( 避免触发后续的click事件 , 防止点击穿透 ) 
  e.preventDefault();
  // 执行你的点击业务逻辑
  console.log('按钮被点击 ( 无300ms延迟 ) ');
  alert('触摸事件触发成功');
});

以上就是JavaScript中click事件默认等待300ms延迟问题详解的详细内容,更多关于JavaScript click事件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文