移动端长按手势如何避免被快速点击误触发?
我在给移动端图片添加长按缩放功能时遇到了问题。用了touchstart记录时间,touchend计算差值,但快速点击操作还是会触发长按的回调。之前尝试用flag标记正在触摸,但点击事件还是能穿过去…
let pressTimer;
element.addEventListener('touchstart', () => {
pressTimer = setTimeout(() => {
handleLongPress(); // 这个方法被错误触发了
}, 500);
});
element.addEventListener('touchend', () => {
clearTimeout(pressTimer);
});
后来发现当手指抬起太快时,touchend会立刻清除定时器,但为什么快速点击(比如0.3秒内触摸)还是会偶尔执行handleLongPress?是不是需要结合click事件做拦截?
核心改动:
1 加了个moved标志位,手指滑动就取消长按
2 在click事件里拦截误触
3 记得所有清理逻辑都要清除定时器
我之前也以为只要touchend清除就够了,结果发现安卓上快速滑动也会漏。这个方案现在项目里跑着没出过问题,拿去改改吧。
另外500ms阈值可以调,苹果建议用700ms,不过实际用500体验更好。
记得加上touchmove的监听,不然用户手指滑动时也会触发长按,这体验就很糟心了。