touchmove 事件在移动端为什么有时候不触发?
我正在做一个移动端的滑动组件,监听了 touchmove 事件,但在某些安卓机上滑着滑着就突然不触发了,特别奇怪。试过 preventDefault 也没用,不知道是不是被浏览器默认行为干扰了?
这是我的简化代码:
element.addEventListener('touchstart', (e) => {
console.log('start');
});
element.addEventListener('touchmove', (e) => {
e.preventDefault(); // 试图阻止滚动
console.log('moving:', e.touches[0].clientX);
});
element.addEventListener('touchend', (e) => {
console.log('end');
});
建议把 preventDefault 放到 touchstart 里试试,这样能更早地阻止默认行为:
另外,检查下 CSS 设置,如果用了 -webkit-overflow-scrolling: touch 可能会影响事件触发。还有个办法是用 passive: false 来加强事件监听器:
这个设置能告诉浏览器别太激进地优化你的事件处理,性能上可能有点影响,但至少能保证事件正常触发。实在不行就考虑用 transform 做滑动,性能和稳定性都更好些。