DoubleTap 手势在移动端怎么监听才有效?
我在用原生 JS 做一个移动端图片预览功能,想实现双击放大,但试了好几种方法都识别不到 doubletap。用 dblclick 事件在手机上根本没反应,是这个事件不支持移动端吗?
后来我试着自己用 touchstart 计时判断,但总误触发单击或者三连点,逻辑特别混乱。有没有靠谱的写法?比如下面这种尝试:
let lastTap = 0;
element.addEventListener('touchend', (e) => {
const now = Date.now();
if (now - lastTap <= 300) {
console.log('double tap!');
}
lastTap = now;
});
这段代码有时候能触发,有时候又不行,尤其在快速滑动后点击就完全失效了,到底该怎么正确处理?
我来给你一个经过实战检验的方案,这个方案要处理几个关键点:
1. 区分单击和双击
2. 防止快速滑动误触
3. 处理多点触控的情况
直接上代码吧,我加详细注释给你解释:
这个方案比你的尝试多了几个关键处理:
1. 加入了touchmove事件监听,滑动时会取消点击判定
2. 使用setTimeout来延迟执行单击事件,给双击判定留出时间窗口
3. 添加了isDoubleTap状态标识,防止双击后仍然触发单击
4. 排除了多点触控的情况
另外有个小技巧,实际项目中你可能会发现有时候双击后页面会短暂缩放,这是因为浏览器默认的双击缩放行为。解决方法是在meta标签里加上:
如果你觉得这个实现还是有点复杂,可以考虑用现成的库比如hammer.js,但了解原生实现原理总是有好处的。