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'));
        })
    }
}
相关推荐
এ慕ོ冬℘゜19 分钟前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康28 分钟前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
大模型码小白29 分钟前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
随心点儿1 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage
一点一木1 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github
IT_陈寒2 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
kyriewen2 小时前
我让AI改一个bug——它偷偷动了5个我没让它碰的地方
前端·javascript·ai编程
段一凡-华北理工大学2 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe3 小时前
C++——多态
开发语言·c++
遇乐的果园3 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习