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'));
        })
    }
}
相关推荐
努力努力再努力wz1 分钟前
【Lua 入门系列】模块与包(一):从多文件组织到require 运行时加载机制、模块缓存、预加载搜索与 Lua 文件搜索机制
开发语言·junit·lua
fengci.6 分钟前
CTF2困难部分
开发语言·网络·python·安全·php
佳得动7 分钟前
编译和链接的认识(C语言)
c语言·开发语言
程序员大阳17 分钟前
副队长JavaScript教程(67)-Ajax初识:背景、历史与核心概念
javascript·ajax·同步·异步·概念·背景·来是
大黄说说18 分钟前
PHP 异步怎么实现?Swoole、Workerman 使用场景对比
开发语言·php·swoole
十二同学啊19 分钟前
Python 工程化详解:项目结构、依赖管理、代码质量、测试与部署
java·开发语言·python
程序员大阳21 分钟前
副队长JavaScript教程(70)-Ajax同源策略与跨域
javascript·ajax·同源策略·跨越·corp
乐橙开放平台25 分钟前
跨地域监控难管理?通过 GB28181 把各地海康大华乐橙摄像头注册到云端平台
开发语言·笔记·物联网·自动化·php·音视频·智能家居
广东融科数据服务有限公司26 分钟前
网络监控经常卡顿、掉线、画面模糊?一线排查问答实录
开发语言·网络·php
Ramble_Naylor32 分钟前
Rust深度解读:高性能 Web 网关与 Axum 架构剖析
前端·架构·rust