You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用触摸事件时touchmove函数中pageX值未更新的问题

解决touchmove中pageX值不更新的问题

嘿,这个问题我之前踩过好几次坑!你遇到的touchmove里pageX一直不变的情况,大概率是下面两个原因之一,我给你拆解下怎么解决:

1. 没有阻止触摸事件的默认行为

浏览器的触摸默认行为(比如页面滚动、缩放)会干扰touchmove事件的正常触发,导致事件对象里的坐标数据无法实时更新。你需要在touchstart或者touchmove事件里添加e.preventDefault()来禁用这些默认行为:

const targetElement = document.getElementById('your-target-element');

targetElement.addEventListener('touchstart', (e) => {
  e.preventDefault(); // 关键:阻止默认滚动/缩放行为,避免干扰坐标更新
  console.log('touchstart pageX:', e.touches[0].pageX);
});

targetElement.addEventListener('touchmove', (e) => {
  e.preventDefault();
  console.log('touchmove pageX:', e.touches[0].pageX); // 现在应该会实时变化了
});

⚠️ 注意:如果你的页面需要保留滚动功能,不要全局阻止默认行为,可以针对性地在需要拖动的元素上阻止,或者判断触摸方向后再决定是否阻止。

2. 错误复用了touchstart时的旧坐标值

如果你在touchstart时把pageX存在了变量里,然后在touchmove里一直用这个旧变量而不是从当前事件对象里获取,那肯定会一直输出同一个值。比如这种错误写法:

// 错误示例!
let oldPageX;
targetElement.addEventListener('touchstart', (e) => {
  oldPageX = e.touches[0].pageX;
  console.log('touchstart pageX:', oldPageX);
});

targetElement.addEventListener('touchmove', (e) => {
  console.log('touchmove pageX:', oldPageX); // 一直输出touchstart时的数值
});

正确的做法是每次touchmove都从当前事件的e.touches[0]里获取最新的pageX,就像第一个示例里那样。

额外提醒

触摸事件的坐标存在e.touches数组里(因为支持多指触摸),单指操作时取e.touches[0]就可以;如果是处理手指离开的情况,才用e.changedTouches。

按照上面的方法修改后,你应该就能看到touchmove里的pageX实时变化了!

内容的提问来源于stack exchange,提问作者rpivovar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:52:20