AlloyFinger手势识别在移动端滑动时触发两次end事件怎么办?
我在用AlloyFinger实现移动端左右滑动切换页面时,发现onPanEnd事件会被触发两次,导致页面跳转逻辑混乱。代码检查过事件绑定没重复,但问题依然存在:
const engine = new AlloyFinger(document.body, {
recognizers: [[AlloyFinger.Pan, { direction: AlloyFinger.DIRECTION_HORIZONTAL }]]
});
engine.on('panend', (e) => {
console.log('触发次数:', e.direction); // 滑动一次会输出两次方向
if(e.direction === 2) { // 右滑
this.prevPage();
} else if(e.direction === 4) { // 左滑
this.nextPage();
}
});
尝试过在事件里加防重标识,但发现两次触发的时间间隔只有几毫秒,可能跟移动端touch事件冒泡有关?求大神指点怎么排查
直接优化一下事件处理逻辑:
这个方案的核心是:
1. **加了deltaTime判断**,过滤掉不合理的超短滑动
2. **用isEndHandled变量控制**,屏蔽掉第一次误触发
3. **用requestAnimationFrame延迟执行**,保证只响应最终方向
如果你用的是较老版本的AlloyFinger(比如1.x),升级到最新2.x版本也能缓解这个问题,因为官方优化了识别逻辑。如果还是不行,可以考虑换用hammer.js,它对手势识别更稳定。
原理很简单,加个标志位
isEndTriggered,第一次触发后立刻把它设为true,然后用setTimeout延迟一小会再重置。这样就能避免短时间内多次触发的问题。如果你还觉得不放心,可以试试把
setTimeout的时间调到 100ms,基本够用了。移动端这种小坑太多了,习惯就好 😅