Vue 项目中实现打印功能:基于目标 ID 的便捷打印方案

一、引言

在 Vue 项目开发中,实现打印功能是一个常见的需求。本文将介绍如何封装一个打印方法,使得用户只需传入需要打印的目标 ID 名称,即可轻松实现预览并打印的功能。这种方法不仅简单易用,还具有一定的通用性,适合在各种 Vue 项目中应用。完整项目代码:https://gitcode.com/Jiaberrr/vue3-pc-template/overview,演示地址:https://env-00jxt0stsnl3-static.normal.cloudstatic.cn/

二、代码实现思路

1. 确保 DOM 加载完成

printToPdf函数中,首先检查document.readyState是否为loading。如果是,说明 DOM 尚未完全加载,此时需要监听DOMContentLoaded事件,在事件触发后执行打印操作。如果document.readyState不是loading,则可以直接执行打印操作。

2. 获取目标元素

performPrint函数中,通过document.getElementById方法获取传入的目标 ID 对应的元素。如果未找到该元素,则在控制台输出错误信息并返回。

3. 克隆目标元素

为了避免对原页面布局产生影响,克隆目标元素及其子元素。同时,为克隆元素设置宽度为320mm,这可以根据实际需求进行调整。

4. 隐藏和显示元素

在打印之前,需要隐藏页面上的其他元素,只显示需要打印的内容。通过beforeprint事件监听,在打印前将idapp的元素隐藏,并将克隆的元素添加到body中。在打印完成后,通过afterprint事件监听,将克隆的元素从body中移除,并恢复idapp的元素的显示。

5. 触发打印

通过window.print()方法触发浏览器的打印功能。

6. 移除事件监听器

在打印完成后,移除beforeprintafterprint事件监听器,避免重复触发。

三、代码实现

function printToPdf(targetId) {
    // 确保DOM已完全加载
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', function () {
            performPrint(targetId);
        });
    } else {
        performPrint(targetId);
    }
}

function performPrint(targetId) {
    const targetElement = document.getElementById(targetId);

    if (!targetElement) {
        console.error('Element with ID'+ targetId +'not found.');
        return;
    }

    // 克隆目标元素及其子元素
    const clonedElement = targetElement.cloneNode(true);
    clonedElement.style.width = '320mm'

    // 在打印之前隐藏所有元素
    function hideAllElements() {
        document.getElementById('app').style.display = 'none'
        // 将克隆的元素添加到body中
        document.body.appendChild(clonedElement);
    }

    // 在打印结束后恢复所有元素
    function showAllElements() {
        document.body.removeChild(clonedElement);
        document.getElementById('app').style.display = ''
    }

    // 添加事件监听器以在打印之前和之后执行操作
    window.addEventListener('beforeprint', hideAllElements);
    window.addEventListener('afterprint', showAllElements);

    // 触发打印
    window.print();

    // 打印完成后移除事件监听器
    window.removeEventListener('beforeprint', hideAllElements);
    window.removeEventListener('afterprint', showAllElements);
}

// 调用函数
export default printToPdf

四、使用方法

在 Vue 项目中使用该打印方法非常简单。首先,确保在需要使用的组件中引入该方法:

 

import printToPdf from '@/path/to/printToPdf.js'; // 根据实际路径引入

然后,在需要触发打印的地方调用该方法,并传入需要打印的目标元素的 ID:

export default {
    methods: {
        printContent() {
            printToPdf('target-id'); // 将'target-id'替换为实际的目标ID
        }
    }
}

在模板中,可以添加一个按钮来触发打印操作:

<template>
    <div>
        <button @click="printContent">打印</button>
    </div>
</template>

五、总结

通过上述方法,我们成功地在 Vue 项目中封装了一个便捷的打印功能。用户只需传入目标 ID,即可实现对特定元素的打印预览和打印操作。这种方法具有良好的可扩展性和维护性,可以根据项目的具体需求进行进一步的优化和定制。希望本文能对大家在 Vue 项目中实现打印功能有所帮助。

六、注意事项

  1. 由于不同浏览器对打印的支持和样式渲染可能存在差异,在实际应用中需要在多种浏览器上进行测试,确保打印效果符合预期。
  2. 如果需要打印的内容包含复杂的样式和布局,可能需要对克隆元素的样式进行进一步的调整和优化,以保证打印效果的准确性。
  3. 这种方法目前只是简单地隐藏了idapp的元素,如果页面结构较为复杂,可能需要隐藏更多的元素或者对元素进行更精细的处理,以确保打印内容的纯净性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948491.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARM 汇编基础总结

GNU 汇编语法 编写汇编的过程中&#xff0c;其指令、寄存器名等可以全部使用大写&#xff0c;也可以全部使用小写&#xff0c;但是不能大小写混用。 1. 汇编语句的格式 label: instruction comment label即标号&#xff0c;表示地址位置&#xff0c;有些指令前面可能会有标…

《塑战核心》V1.0.0.9952官方中文版

体验打击感满分的近距离战斗。击败蜂拥而至的敌人&#xff0c;每次击杀都会让你变得更强。 《塑战核心》官方中文版https://pan.xunlei.com/s/VODW7effpagQN1JU0UpBQQ5uA1?pwdmr8g#

综合练习dfs_1

1863. 找出所有子集的异或总和再求和 之前我们就做了到关于找集合子集的问题&#xff0c;但我们不需要记录路径上的数&#xff0c;求路径上数的异或和就可以。 class Solution {int path;int sum0; public:int subsetXORSum(vector<int>& nums) {dfs(nums,0);return …

【Python学习(五)——条件判断】

Python学习&#xff08;五&#xff09;——条件判断 本文介绍了条件判断&#xff0c;仅作为本人学习时记录&#xff0c;感兴趣的初学者可以一起看看&#xff0c;欢迎评论区讨论&#xff0c;一起加油鸭~~~ 心中默念&#xff1a;Python 简单好学&#xff01;&#xff01;&#x…

PPT加页码并改格式

如何快捷插入自定义 1、插入文本框&#xff0c;并处于输入状态 2、点击插入幻灯片编号的图标&#xff0c;就自动生成页码了 3、然后调整这个页码为想要的格式&#xff0c;到需要加页码的页面&#xff0c;将文本框复制过去就行了

Git 入门(一)

git 工作流如下&#xff1a; 命令如下&#xff1a; clone&#xff08;克隆&#xff09;: 从远程仓库中克隆代码到本地仓库checkout &#xff08;检出&#xff09;:从本地仓库中检出一个仓库分支然后进行修订add&#xff08;添加&#xff09;: 在提交前先将代码提交到暂存区com…

windows远程桌面无法连接,报错:“由于没有远程桌面授权服务器可以提供许可证,远程会话被中断。请跟服务器管理员联系”

windows远程桌面无法连接&#xff0c;报错&#xff1a;“由于没有远程桌面授权服务器可以提供许可证&#xff0c;远程会话被中断。请跟服务器管理员联系” 问题描述&#xff1a;解决方法&#xff1a;无法删除条目解决如下&#xff1a;正常激活详见&#xff1a;[RDS远程服务激活…

【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析

文章目录 类的加载器ClassLoader自定义类加载器双亲委派机制概念源码分析优势劣势如何打破Tomcat 沙箱安全机制JDK9 双亲委派机制变化 类的加载器 获得当前类的ClassLoader clazz.getClassLoader() 获得当前线程上下文的ClassLoader Thread.currentThread().getContextClassLoa…

蓝色简洁引导页网站源码

一款蓝色的简洁引导页&#xff0c;适合资源分发和网站备用引导。 1.源码上传至虚拟机或者服务器 2.绑定域名和目录 3.访问域名安装 4.安装完成后就行了 https://pan.quark.cn/s/b2d8b9c5dc7f https://pan.baidu.com/s/17h1bssUNhhR9DMyNTc-i9Q?pwd84sf https://caiyun.139.com…

Linux驱动开发(18):linux驱动并发与竞态

并发是指多个执行单元同时、并行执行&#xff0c;而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问 则很容易导致竞态。对于多核系统&#xff0c;很容易理解&#xff0c;由于多个CPU同时执行&#xff0c;多个CPU同时读、写共享资源时很容易造成竞态。…

docker中使用Volume完成数据共享

情景概述 在一个docker中&#xff0c;部署两个MySQL容器&#xff0c;假如它们的数据都存储在自己容器内部的data目录中。这样的存储方式会有以下问题&#xff1a; 1.无法保证两个MySQL容器中的数据同步。 2.容器删除后&#xff0c;数据就会丢失。 基于以上问题&#xff0c;容…

django StreamingHttpResponse fetchEventSource实现前后端流试返回数据并接收数据的完整详细过程

django后端环境介绍&#xff1a; Python 3.10.14 pip install django-cors-headers4.4.0 Django5.0.6 django-cors-headers4.4.0 djangorestframework3.15.2 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 总环境如下&#xff1a; Package Version -…

R机器学习:神经网络算法的理解与实操,实例解析

神经网络算法是一种模仿生物神经网络&#xff08;尤其是人脑&#xff09;结构和功能的算法。它由大量相互连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;这些神经元组织成层&#xff0c;通过传递信号来处理信息。神经网络算法在机器学习、人工智能等领域中扮演…

供应链系统设计-供应链中台系统设计(七)- 商品中心设计篇

概述 上篇文章我们大致讲了一些商品中心相关的概念&#xff0c;例如&#xff1a;SPU、SKU、Item等等&#xff0c;在这里我们来简单的回顾一下&#xff1a; 商品概念的分层与定义&#xff1a; SPU&#xff08;Standard Product Unit&#xff09;&#xff1a;代表产品系列或产品…

人工智能在SEO中的应用与关键词优化策略

内容概要 随着科技的迅猛发展&#xff0c;人工智能在搜索引擎优化&#xff08;SEO&#xff09;中的应用逐渐成为业界关注的热点。AI技术不仅可以有效提高关键词的优化策略&#xff0c;还能在提升内容效率、增强用户体验方面发挥重要作用。通过对相关技术的深入探讨&#xff0c…

EPS32基础篇开发

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 开发 EPS32基础篇 前言一、GPIO输入输出GPIO可设置一下4种状态代码示例&#xff1a;检测按键&#xff0c;按下时&#xff1a;LED亮&#xff0c;松开时&#xff0c;LED灭 二、…

Backend - C# 的日志 NLog日志

目录 一、注入依赖和使用 logger 二、配置记录文件 1.安装插件 NLog 2.创建 nlog.config 配置文件 3. Programs配置日志信息 4. 设置 appsettings.json 的 LogLevel 5. 日志设定文件和日志级别的优先级 &#xff08;1&#xff09;常见的日志级别优先级 &#xff08;2&…

【游戏设计原理】47 - 超游戏思维

对于这条原理&#xff0c;我首先想到的是开放世界&#xff0c;或者探索性游戏&#xff0c;这是最能包容各类玩家的游戏类型。这类游戏定义了基本规则&#xff0c;玩家的可操作性很强。就像上图里的沙池一样&#xff0c;里面有滑梯&#xff0c;是规则性比较明确的&#xff0c;而…

24年无人机行业资讯 | 12.23-12.29

24年无人机行业资讯 | 12.23-12.29 1、 国家发改委新设低空经济司&#xff0c;助力低空经济规范发展2、商务部支持无人机民用国际贸易&#xff0c;强调出口管制与安全并重3、滨州高新区首架无人机成功下线4、 2025第九届世界无人机大会筹备推进会顺利召开5、2024年世界无人机竞…

【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下&#xff0c;跨境电商行业正以前所未有的态势重塑国际贸易格局&#xff0c;成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》&#xff0c;…