uni-app中uni-canvas在H5上没有touch事件响应

发布于 1周前 作者 songsunli 来自 Uni-App

uni-app中uni-canvas在H5上没有touch事件响应

项目属性 信息
产品分类 uniapp/H5
PC开发环境操作系统 Mac
PC开发环境操作系统版本号 14.0 (23A344)
HBuilderX类型 正式
HBuilderX版本号 3.98
浏览器平台 Chrome
浏览器版本 版本 119.0.6045.159(正式版本) (x86_64)
项目创建方式 HBuilderX

示例代码:

<u-popup v-model="showPop" mode="center" border-radius="14" :closeable="true">
<view class="pop">  
    <canvas canvas-id="handWriting" id="handWriting" class="pop-sign" disable-scroll="true" @touchstart="uploadScaleStart" @touchmove="uploadScaleMove"  
             @touchend="uploadScaleEnd" @tap="mouseDown"  >  
     </canvas>  

           <view class="u-row sign-btn-box">  
               <button @click="retDraw" class="delBtn">重写</button>  
               <button @click="subCanvas" class="subBtn">保存</button>     
           </view>  
</view>  
```

methods: { uploadScaleStart(event){ that.isWrite = true that.handwriting.uploadScaleStart(event) }, uploadScaleMove(event){ that.handwriting.uploadScaleMove(event) }, uploadScaleEnd(event){ that.handwriting.uploadScaleEnd(event) }, mouseDown(e){ console.log(‘mouseDown’,e); } }

操作步骤:

H5浏览器 打开签名界面 可以画布 touch 事件

从附件1 可以看到 在小程序中 uniapp 中的canvas 是有 touch 事件绘制及响应的,但是在H5 uni-canvas包裹下的canvas 没有touch事件绘制更没有响应touch

预期结果:

touch响应

实际结果:

无touch响应

bug描述:

uniapp 项目中 签名功能,在H5中没有touch 事件响应


5 回复

浏览器开启移动端模式了吗,pc模式是没有touch事件的。


我就是测试 H5下的签名功能,怎么开启移动模式啊?我也不能对每个用户说 你签名时开启一下移动模式啊

而且 应该有 鼠标在画布canvas的移动轨迹吧

回复 1***@qq.com: 只有触控设备才会有touch事件,可以看下mdn文档

uni-app 中使用 uni-canvas 组件时,如果在 H5 平台上无法响应 touch 事件,可能是由于以下原因导致的:

1. uni-canvastouch 事件支持

uni-canvas 组件在不同平台上的事件支持可能有所不同。在 H5 平台上,uni-canvas 可能并没有直接支持 touch 事件,而是需要使用 clickmousedown 等事件来模拟 touch 事件。

2. 解决方案

你可以通过以下方式来解决这个问题:

方法一:使用 clickmousedown 事件

在 H5 平台上,uni-canvas 支持 clickmousedown 事件,你可以使用这些事件来模拟 touch 事件。

<uni-canvas @click="handleClick" @mousedown="handleMouseDown"></uni-canvas>
export default {
  methods: {
    handleClick(event) {
      console.log('Canvas clicked', event);
    },
    handleMouseDown(event) {
      console.log('Canvas mouse down', event);
    }
  }
}

方法二:使用 @touchstart 事件

虽然 uni-canvas 在 H5 上可能不支持 @touchstart 事件,但你可以尝试在 uni-canvas 外层包裹一个 view 组件,并在 view 上监听 touch 事件。

<view @touchstart="handleTouchStart">
  <uni-canvas></uni-canvas>
</view>
export default {
  methods: {
    handleTouchStart(event) {
      console.log('Touch start', event);
    }
  }
}

方法三:使用原生 canvas 元素

如果你需要更精细的 touch 事件处理,可以直接使用原生 canvas 元素,并通过 @touchstart@touchmove 等事件来处理 touch 事件。

<canvas @touchstart="handleTouchStart" @touchmove="handleTouchMove"></canvas>
export default {
  methods: {
    handleTouchStart(event) {
      console.log('Touch start', event);
    },
    handleTouchMove(event) {
      console.log('Touch move', event);
    }
  }
}

3. 注意事项

  • 在 H5 平台上,touch 事件的兼容性可能不如 clickmousedown 事件好,因此建议优先使用 clickmousedown 事件。
  • 如果你需要跨平台兼容性,可以使用条件编译来处理不同平台的事件绑定。
export default {
  methods: {
    handleEvent(event) {
      // #ifdef H5
      console.log('H5 event', event);
      // #endif
      // #ifdef MP-WEIXIN
      console.log('WeChat Mini Program event', event);
      // #endif
    }
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!