前端打印(不使用插件,没有副作用)

今天要写一个打印,以前写过是直接调用window.print() ,因为之间是点击预览,跳转页面,打印,所以也没发现有什么副作用,今天,打印是在当前页打印局部,网上部分方法说,打印前把body赋值成局部元素,打印后复原,我发现这样会让打印之后,页面点击事件失效

但是我找到一个无副作用的,是在取到全局dom,后把自己不需要的元素给隐藏掉,然后打印,因为拿到dom后赋值给了变量,直接操作变量,所以也不会影响原页面, 还可以自定义打印时候,打印样式,代码如下

把下面的代码是封装的,你只需要,新建一个文件,命名为print.ts/print.js(当然了名字你可以随便起),然后把下面代码赋值进去

export default function printHtml(html) {let style = getStyle();let container = getContainer(html);document.body.appendChild(style);document.body.appendChild(container);getLoadPromise(container).then(() => {window.print();document.body.removeChild(style);document.body.removeChild(container);});
}// 设置打印样式
function getStyle() {
let styleContent = `
#print-container {display: none;
}
@media print {body > :not(.print-container) {display: none;}html,body {display: block !important;}#print-container {display: block;}//DetialContentCss 到  .contentTitle2都是我自己的样式,所以你也可以在这里写你打印的元素的样式.DetialContentCss {border: 1px solid #333;padding: 20px;margin: 0 20px;.contentTitle {font-size: 22px;text-align: center;}.formCss{display: flex;align-items: center;justify-content: space-around;margin: 40px 80px;}}.contentTitle2 {font-size: 14px;margin: 10px 0px;padding: 0 4px;display: flex;align-items: center;justify-content: space-between;}}`;let style = document.createElement("style");style.innerHTML = styleContent;return style;
}// 清空打印内容
function cleanPrint() {let div = document.getElementById('print-container')if (!!div) {document.querySelector('body').removeChild(div)}
}// 新建DOM,将需要打印的内容填充到DOM
function getContainer(html) {cleanPrint()let container = document.createElement("div");container.setAttribute("id", "print-container");container.innerHTML = html;return container;
}// 图片完全加载后再调用打印方法
function getLoadPromise(dom) {let imgs = dom.querySelectorAll("img");imgs = [].slice.call(imgs);if (imgs.length === 0) {return Promise.resolve();}let finishedCount = 0;return new Promise(resolve => {function check() {finishedCount++;if (finishedCount === imgs.length) {resolve();}}imgs.forEach(img => {img.addEventListener("load", check);img.addEventListener("error", check);})});
}

然后打印页面引入使用一下,下面是你的打印页面的代码

//引入
import printHtml from "./helper/print"//使用
function  clickPrint(){
//获取要打印的元素,你可以用id,然后用原生方法通过id去拿元素,我是vue3,直接使用了reflet print = tsPrint.value.innerHTML;printHtml(print)
}

参考大佬地址

window.print() 前端实现网页打印详解_window.print();-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流畅的 Python 第二版(GPT 重译)(三)

第五章:数据类构建器 数据类就像孩子一样。它们作为一个起点是可以的,但要作为一个成熟的对象参与,它们需要承担一些责任。 马丁福勒和肯特贝克 Python 提供了几种构建简单类的方法,这些类只是一组字段,几乎没有额外功…

前端vue2学习(事件处理)总结

事件处理 <div id"root"><h2>事件处理&#xff0c;hello&#xff0c;{{name}}</hr><button v-on:click"showInfo1">点我提示信息1(不传参)</botton><button click"showInfo2(12,$event)">点我提示信息2&am…

Linux 安装 JDK、MySQL、Tomcat(图文并茂)

所需资料 下载 1.1 软件安装方式 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可rpm安装软件已经按照re…

美易官方:科技巨头涨势好标普指数年底前有望升至6000点

高盛&#xff0c;作为全球领先的金融机构之一&#xff0c;近日发布了一份报告&#xff0c;预测在科技巨头的涨势推动下&#xff0c;标普500指数年底前有望升至6000点。这一预测引起了市场的广泛关注&#xff0c;投资者们纷纷开始重新评估自己的投资策略。 David Kostin等策略师…

金晟富:3.24黄金周末行情解析!周一开盘黄金分析及操作

换资共勉&#xff1a; ​ 此刻看文章的朋友你们好&#xff0c;周末愉快&#xff01;周末&#xff0c;我也习惯性的写分析&#xff0c;为的也是让大家对行情走势有所了解&#xff0c;这样在周一面对行情的时候我们也能从容应对&#xff0c;同时&#xff0c;针对手中持有多空单的…

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包。 #################### 免责声明&#xff1a;工具本身并无好坏&#xff0c;希望大家以遵守《网络安全法》相关法律为前提来使用该工具&#xff0c;支持研究学习&#xff0c;切勿用于非法犯罪活动&#xff0c;对于恶…

202基于matlab的曲柄滑块机构的运动学仿真分析

基于matlab的曲柄滑块机构的运动学仿真分析&#xff0c;分析各个杆的速度、位移、加速度曲线&#xff0c;以及曲柄滑块机构的动画。程序已调通&#xff0c;可直接运行。 202 matlab 曲柄滑块机构 运动学仿真分析 - 小红书 (xiaohongshu.com)

第九篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python处理PDF文件

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、重要作用介绍二、Python库处理PDF文件基础操作和高级操作介绍&#xff08;一&#xff09;基础操作介绍&#xff08;二&#xff09;高级操作介绍 三、Python库处理PDF文件基础操作示例代码…

H5实现Web ECharts教程:轻松创建动态数据图表

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

【OpenBayes 官方教程】快速部署通义千问 72B 大模型

本教程主要为大家介绍怎样在 OpenBayes 上快速部署通义千文 72B 大模型&#xff0c;新朋友点击下方链接注册后&#xff0c;即可获得 4 小时 RTX 4090 5 小时 CPU 的免费使用时长哦&#xff01; 注册链接 https://openbayes.com/console/signup?ryuudi_nBBThttps://openbaye…

算法|数学与数论|素数筛

数学与数论|素数筛 1.判断素数 2.朴素筛 3.埃氏筛 4.欧拉筛(线性筛) 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 质数(素数)&…

一文读懂SPI通讯协议

一文读懂SPI通讯协议 引言 SPI(Serial Peripheral Interface)是一种同步串行通信接口协议,常用于嵌入式系统和芯片之间的通信。在本篇文章中,我们将详细介绍SPI通讯协议的工作原理、时序图和常见应用场景,并且通过丰富的示例代码帮助读者深入理解。 SPI通讯协议的基本概…

C++_第四周做题总结

id:19 A.三数论大小&#xff08;引用&#xff09; 题目描述 输入三个整数&#xff0c;然后按照从大到小的顺序输出数值。 要求&#xff1a;定义一个函数&#xff0c;无返回值&#xff0c;函数参数是三个整数参数的引用&#xff0c;例如int &a, int &b, int &c。…

【教程】高效数据加密混淆方法及实现简介

背景 在需要对数据进行传输或者表达时&#xff0c;通常要求数据加密的安全级别不高&#xff0c;但希望加解密时间复杂度尽可能低。这时使用传统的对称加密&#xff08;如3DES、AES&#xff09;或非对称加密&#xff08;如RSA、ECC&#xff09;显然不太适合。因为加密的安全级别…

【MySQL】10. 复合查询(重点)

复合查询&#xff08;重点&#xff09; 前面我们讲解的mysql表的查询都是对一张表进行查询&#xff0c;在实际开发中这远远不够。 1. 基本查询回顾 数据还是使用之前的雇员信息表 在标题7的位置&#xff01; mysql> select * from emp where sal > 500 or job MANAG…

【数据结构取经之路】队列循环队列

目录 引言 队列的性质 队列的基本操作 初始化 判空 销毁 队列的长度 插入 删除 返回队头元素 循环队列 假溢出 空与满的判定 实现 初始化 插入 判空 销毁 删除 返回队列长度 返回队列头元素 判满 引言 队列和栈一样&#xff0c;也是数据结构的一种&…

特征工程 | 数据清洗、异常值处理、归一化、标准化、特征提取

目录 一. 数据清洗1. 数据清洗&#xff1a;格式内容错误数据清洗2. 数据清洗&#xff1a;逻辑错误清洗3. 数据清洗&#xff1a;去除不需要的数据4. 数据清洗&#xff1a;关联性验证 二. 异常值的处理1. 删除2. 填充 三. 归一化和标准化1. 归一化2. 标准化 四. 特征提取1. One-H…

MyBatis是纸老虎吗?(六)

经过前面一些列文章的梳理&#xff0c;我们已将MyBatis框架所需要的资源都准备好了&#xff1a;数据库连接信息储存在Configuration对象中的Environment属性中&#xff08;该对象中有这样几个属性String类型的id&#xff0c;TransactionFactory类型的transactionFactory、DataS…

如何优雅的爬取公众号文章

目录 相关函数库介绍 代码例子 IP池免费送 相关函数库介绍 在合法合规的前提下&#xff0c;爬取微信公众号文章可以使用以下几个Python库&#xff1a; requests&#xff1a;这是一个非常流行的HTTP库&#xff0c;用于发送各种HTTP请求。它简单易用&#xff0c;能够高效地处…

关于序列化和反序列化

什么是序列化&#xff0c;什么是反序列化 简单来说&#xff1a; 序列化&#xff1a;将数据结构或对象转换成二进制字节流的过程反序列化&#xff1a;将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程 为什么要进行序列化 我们要将java对象进行网络传输&a…