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

React移动端触摸点偏移实现:修改pageY只读属性报错的解决方案

解决React中无法修改Touch对象pageY的问题

嘿,刚接触React遇到这个问题很正常,我来帮你理清楚咋解决!

首先为啥会报错?因为浏览器提供的Touch对象是只读的,你没法直接给它的pageY属性赋值,这就是那个Uncaught TypeError的根源。那该咋实现你要的“把触摸点识别为稍靠上250单位”的需求呢?给你两种靠谱的方案:

方案一:使用时计算偏移(推荐)

不用去修改原始的触摸事件对象,而是在你需要用到坐标值的地方,直接计算偏移后的结果就行。这样不会破坏原生事件的完整性,也没副作用。

比如你要把偏移后的坐标用来更新状态或者定位元素:

onTouchStart = {(event) => {
  // 计算靠上250单位的坐标:pageY越小越靠上,所以用原始值减250
  const adjustedPageY = event.touches[0].pageY - 250;
  // 这里用adjustedPageY做你需要的操作,比如存到状态里
  this.setState({
    touchX: event.touches[0].pageX,
    touchY: adjustedPageY
  });
}}

方案二:创建自定义触摸对象副本

如果你的场景必须要传递一个类似Touch的对象给其他函数,可以把原生触摸对象的属性复制到一个新对象里,再修改需要的字段:

onTouchStart = {(event) => {
  // 复制原生Touch对象的所有属性到新对象
  const customTouch = { ...event.touches[0] };
  // 修改pageY为偏移后的值
  customTouch.pageY = customTouch.pageY - 250;
  // 把这个自定义对象传给你的处理函数
  this.handleCustomTouch(customTouch);
}}

小提醒

尽量别去修改原生的事件对象,因为浏览器会复用这些对象,修改后可能会影响其他依赖这个事件的组件或逻辑,方案一才是更稳妥的选择哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:53:44