通过iframe碎片实现web局部打印

devtools/2024/11/14 11:53:33/

通过iframe碎片实现web局部打印

创建打印模板

首先,创建一个出货单的 HTML 模板,并用 CSS 进行样式设计。
tips:
1、直接通过iframe碎片拉起打印,会导致样式丢失,所以需要获取当前界面的样式。

${Array.from(document.querySelectorAll('link[rel="stylesheet"], style')).map(style => style.outerHTML).join('\n');}

2、通过浏览器拉起打印机打印会有一个延迟,如果直接执行 document.body.removeChild(iframe); 移除 iframe 碎片会导致打印机获取不到碎片的内容。所以需要对 removeChild() 进行延迟处理。

<template><div id="app"><button @click="printOrder">打印出货单</button><div id="printArea"><h1>出货单</h1><p>订单编号: {{ orderNumber }}</p><p>客户名称: {{ customerName }}</p><table><thead><tr><th>商品名称</th><th>数量</th><th>单价</th><th>总价</th></tr></thead><tbody><tr v-for="item in orderItems" :key="item.id"><td>{{ item.name }}</td><td>{{ item.quantity }}</td><td>{{ item.price }}</td><td>{{ item.total }}</td></tr></tbody></table><p>总计: {{ totalAmount }}</p></div></div>
</template><script>
export default {data() {return {orderNumber: '12345',customerName: '张三',orderItems: [{ id: 1, name: '商品1', quantity: 2, price: 100, total: 200 },{ id: 2, name: '商品2', quantity: 1, price: 200, total: 200 },],totalAmount: 400,};},methods: {printOrder() {const printContent = this.$refs.printArea.innerHTML;const iframe = document.createElement('iframe');iframe.style.position = 'absolute';iframe.style.width = '0px';iframe.style.height = '0px';iframe.style.border = 'none';document.body.appendChild(iframe);const iframeDoc = iframe.contentWindow.document;iframeDoc.open();iframeDoc.write(`<!DOCTYPE html><html><head><title>出货单</title>${Array.from(document.querySelectorAll('link[rel="stylesheet"], style')).map(style => style.outerHTML).join('\n');}<style>table {width: 100%;border-collapse: collapse;}th, td {border: 1px solid #000;padding: 8px;text-align: left;}</style></head><body>${printContent}</body></html>`);iframeDoc.close();iframe.contentWindow.focus();iframe.contentWindow.print();setTimeout(()=>{document.body.removeChild(iframe);},3000);},},
};
</script><style>
#printArea {width: 100%;padding: 20px;border: 1px solid #000;
}
table {width: 100%;border-collapse: collapse;
}
th, td {border: 1px solid #000;padding: 8px;text-align: left;
}
</style>

http://www.ppmy.cn/devtools/85578.html

相关文章

C++ string类基础实现

1.String头文件 namespace kingluo {class string{public:typedef char* iterator;typedef const char* const_iterator;iterator begin(){return _str;}iterator end(){return _str _size;}const_iterator begin()const{return _str;}const_iterator end()const{return _str…

自定义校验注解,优雅的实现手机号,身份证号的格式校验!

导读&#xff08;皮一下&#xff09; 为什么需要自定义校验注解&#xff1f; 系统执行业务逻辑之前&#xff0c;会对输入数据进行校验&#xff0c;检测数据是否有效合法的。所以我们可能会写大量的if else等判断逻辑&#xff0c;特别是在不同方法出现相同的数据时&#xff0c…

FOC笔记(一)电角度零点校准

当电机上电时&#xff0c;它处于位置的电角度未知。如果按上图U4&#xff08;100&#xff09;通电&#xff0c;也会让电角度为0,但是这样力量很大。 简单的方法是只控制d角度的磁场大小&#xff0c;转矩磁场q为0,生成一个定向磁场指向电角度为0。 foc->sin_sita 0;foc->…

MySQL、SqlServer、Oracle三大主流数据库实现分页查询的方法

在数据库管理系统&#xff08;DBMS&#xff09;中&#xff0c;分页查询是一种常见的需求&#xff0c;用于从大量数据中检索并展示一小部分数据给用户。不同的数据库系统提供了不同的方法来实现分页查询。下面将分别介绍MySQL、SQL Server和Oracle这三大主流数据库系统实现分页查…

mybatis批量插入、mybatis-plus批量插入、mybatis实现insertList、mybatis自定义实现批量插入

文章目录 一、mybatis新增批量插入1.1、引入依赖1.2、自定义通用批量插入Mapper1.3、把通用方法注册到mybatisplus注入器中1.4、实现InsertList类1.5、需要批量插入的dao层继承批量插入Mapper 二、可能遇到的问题2.1、Invalid bound statement 众所周知&#xff0c;mybatisplus…

【JavaScript】use strict

“use strict” 声明时&#xff0c;代码将会在严格模式下执⾏。严格模式包含了⼀些额外的规则和限制。 使⽤ “use strict” 的主要作⽤包括&#xff1a; 变量必须声明后再使⽤&#xff0c;不能通过不使⽤关键字创建全局变量不能通过 delete 操作符删除变量&#xff08;包括对…

Vue el-input 中 readonly和disabled的区别详解

在 Vue.js 的 Element UI 组件库中&#xff0c;el-input 是一个常用的输入框组件。readonly 和 disabled 是两个常见的属性&#xff0c;用于控制输入框的交互行为&#xff0c;但它们之间存在显著的差异。下面将详细解释这两个属性的区别。 readonly 定义&#xff1a;readonly…

Linux系列--shell编程一

一、Linux系统结构 一、内核层 内核是Linux系统的核心部分&#xff0c;它负责管理系统各种硬件设备、文件系统、内存管理和进程管理等核心任务。Linux内核设计了良好的模块化结构&#xff0c;可以动态地加载和卸载内核模块&#xff0c;这使得内核可以兼容各种不同的硬件设备和…