vue/uniapp H5页面截图

1.引入html2canvas

复制代码
npm install html2canvas

2.代码实现

javascript 复制代码
<template>
  <view class="container">
    <!-- 截图的目标区域,设置 id="capture-box" -->
    <view id="capture-box" class="content-box">
      123456
    </view>
  </view>
</template>
<script>
import html2canvas from "html2canvas"
export default {
    mounted(){
        const element = document.getElementById('capture-box');
        const canvas = html2canvas(element, {
              // 配置项
              useCORS: true, // 允许加载跨域图片(重要)
              scale: window.devicePixelRatio, // 提高清晰度(适配 Retina 屏幕)
              logging: false, // 关闭日志
              backgroundColor: '#ffffff', // 确保背景色正确(默认透明可能变黑)
              windowHeight: element.scrollHeight // 确保截图高度包含所有滚动内容
        });
        const base64Image = canvas.toDataURL('image/png');
    }
}
注:报错Error in mounted hook: "TypeError: canvas.toDataURL is not a function"
  1. 版本差异 :你引入的 html2canvas 版本较旧(例如 0.5.x 版本),该版本默认返回的是 DOM <canvas> 元素对象,确实有 toDataURL 方法;但如果你使用的是 1.x 版本,默认行为可能会发生细微变化,或者在某些异步处理中变量被意外覆盖。
  2. 变量命名冲突 :这是最常见的"低级错误"。在 Vue 的 <script> 中,你可能把接收截图结果的变量命名为 canvas,这可能会和 HTML 原生的 <canvas> 标签对象或者组件内的变量混淆,尤其是在 v-for 循环中使用了 canvas 作为 key 或 item 名字。
方案一:检查变量命名冲突
javascript 复制代码
const canvas = html2canvas(element)
const base64 = canvas.toDataURL();

改为

const myCanvas = html2canvas(element)
const base64 = myCanvas.toDataURL();
方案二:使用异步处理
javascript 复制代码
methods: {
    async handleCapture() {
        const element = document.getElementById('capture-box');
        const canvas = await html2canvas(element, {
          useCORS: true, // 允许加载跨域图片(重要)
          scale: window.devicePixelRatio, // 提高清晰度(适配 Retina 屏幕)
          logging: false, // 关闭日志
          backgroundColor: '#ffffff', // 确保背景色正确(默认透明可能变黑)
          windowHeight: element.scrollHeight // 确保截图高度包含所有滚动内容
        });
        const base64Image = canvas.toDataURL('image/png');

        console.log('截图成功', base64Image);
        
    }
}
方案三:检查变量命名冲突

有时异步处理可能导致变量丢失,可以尝试使用 .then() 调用,这是 html2canvas 最传统的写法,最稳妥:

javascript 复制代码
<template>
  <view class="container">
    <!-- 截图的目标区域,设置 id="capture-box" -->
    <view id="capture-box" class="content-box">
      123456
    </view>
  </view>
</template>
<script>
import html2canvas from "html2canvas"
export default {
    mounted(){
        const element = document.getElementById('capture-box');
        html2canvas(element, {
            // 配置项
            useCORS: true, // 允许加载跨域图片(重要)
            scale: window.devicePixelRatio, // 提高清晰度(适配 Retina 屏幕)
            logging: false, // 关闭日志
            backgroundColor: '#ffffff', // 确保背景色正确(默认透明可能变黑)
            windowHeight: element.scrollHeight // 确保截图高度包含所有滚动内容
        }).then(res=>{
            console.log(res.toDataURL('image/png'));
        })
    }
}
相关推荐
To_OC2 小时前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC2 小时前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
天渺工作室3 小时前
实现一个adblock/adblock plus等浏览器广告拦截器检测插件
前端·javascript
阳光是sunny3 小时前
Vue 项目怎么做用户行为全链路监控?轻量插件方案详解
前端·面试·架构
ZhengEnCi3 小时前
Q04-Vite禁用CSS代码分割-解决生产环境样式加载顺序混乱问题
前端·vue.js·vite
九酒4 小时前
AI Agent 开发踩坑记:口播功能非得用 APP 原生实现吗?
前端·人工智能·agent
Jackson__5 小时前
做了一段时间的AI coding后,我终于搞清了 CLI 和 MCP 的区别
前端·agent·ai编程
IT_陈寒7 小时前
JavaScript项目实战经验分享
前端·人工智能·后端
用户47949283569158 小时前
6w star,GitHub 趋势第一的 Ponytail,这个agent插件到底在火什么
前端·后端
薛定喵的谔9 小时前
我开源了一个精致的 Next.js 博客模板:Skyplume
前端·前端框架·next.js