JavaScript中click事件默认等待300ms延迟问题详解
作者:韩曙亮
一、JavaScript中click事件300ms延迟问题
1、问题来源
早期 移动端浏览器 为了实现 " 双击缩放 ( double tap to zoom ) " 功能 而设计的 等待机制 ;
在 移动端网页发展初期 , 手机屏幕尺寸小、分辨率低 , 浏览器提供了 " 双击页面某区域 " 将该区域放大至全屏的功能 , 方便用户查看内容 ;
当用户单击页面元素时 , 浏览器无法立刻判断用户的操作是 :
- 单次点击 , 需要触发 click 事件 ;
- 双击缩放 的 第一次点击 , 需要 等待第二次点击 , 间隔约 300ms ;
因此 , 浏览器会默认等待 300ms 左右 , 确认用户没有进行第二次点击后 , 才会触发原生的 click 事件 , 这就造成了 click 事件的 300ms 延迟 ;
2、浏览器适配问题
浏览器适配问题 :
- 早期浏览器 : click 事件 300ms 延迟问题 在 早期 移动端浏览器 ( iOS Safari < 9.3、Android 原生浏览器 < 4.4 ) 中 可以重现 ;
- 现代浏览器 : 现代浏览器 已逐步优化 , 没有 300 ms 延迟问题 , 但部分老旧环境或特殊场景仍可能存在 ;
二、解决方案
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 关键属性说明 :
width=device-width: 让页面宽度适配设备屏幕宽度 ;initial-scale=1.0: 初始缩放比例为 1:1 , 无默认缩放 ;maximum-scale=1.0: 限制最大缩放比例为 1:1 ;user-scalable=no: 禁止用户手动缩放页面 ( 包括双击缩放和捏合缩放 ) ;
2、使用CSS的touch-action属性(局部/全局禁用)
touch-action 是 CSS3 新增属性 , 用于 指定浏览器 如何处理 元素的触摸事件 , 设置为 manipulation 可禁用双击缩放 , 同时 保留平移 ( 滑动 ) 和 捏合缩放功能 ( 比 user-scalable=no 更灵活 ) :
/* 全局生效 : 禁用所有元素的双击缩放 */
* {
touch-action: manipulation;
}
/* 局部生效 : 仅禁用指定按钮的双击缩放 */
.btn {
touch-action: manipulation;
}- 作用 : 告诉浏览器 , 该元素的触摸操作仅支持 " 平移 " 和 " 捏合缩放 " , 不支持 " 双击缩放 " , 因此无需等待 300ms , click 事件会立即触发 ;
- 兼容性 : 支持 iOS Safari >= 9.1、Android Chrome >= 36 , 现代移动端浏览器均兼容 ;
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事件的资料请关注脚本之家其它相关文章!
