当前位置: 首页 > news >正文

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

通过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>

相关文章:

  • web前端 React 框架面试200题(五)
  • OMOST 作画能力的硬核解析[C#]
  • 当 Nginx 出现请求的缓存数据损坏,如何处理?
  • Hadoop-HDFS
  • Java | Leetcode Java题解之第279题完全平方数
  • 在spyder中使用arcgis pro的包
  • LoFTR关键点特征匹配算法环境构建与图像匹配测试Demo
  • 图像分类算法概述:深度学习方法
  • 乐尚代驾六订单执行一
  • C#初级——输出语句和转义字符
  • JAW:一款针对客户端JavaScript的图形化安全分析框架
  • Java 序列流:Java 对象的序列化和反序列化详解
  • 基于 HTML+ECharts 实现智慧运维数据可视化大屏(含源码)
  • SpringCloud 负载均衡
  • linux、windows、macos,命令终端清屏
  • [Vue CLI 3] 配置解析之 css.extract
  • Android Studio:GIT提交项目到远程仓库
  • classpath对获取配置文件的影响
  • Elasticsearch 参考指南(升级前重新索引)
  • ES6系列(二)变量的解构赋值
  • ES6系统学习----从Apollo Client看解构赋值
  • JAVA 学习IO流
  • js正则,这点儿就够用了
  • js中的正则表达式入门
  • MQ框架的比较
  • PAT A1050
  • Python打包系统简单入门
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Travix是如何部署应用程序到Kubernetes上的
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 通过几道题目学习二叉搜索树
  • 小试R空间处理新库sf
  • ​Linux·i2c驱动架构​
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (3)选择元素——(17)练习(Exercises)
  • (AngularJS)Angular 控制器之间通信初探
  • (六)Flink 窗口计算
  • (原)Matlab的svmtrain和svmclassify
  • (转)关于pipe()的详细解析
  • ***详解账号泄露:全球约1亿用户已泄露
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Core中Emit的使用
  • .NET MVC之AOP
  • .NET 服务 ServiceController
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [.net]官方水晶报表的使用以演示下载
  • [8] CUDA之向量点乘和矩阵乘法
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解
  • [BIZ] - 1.金融交易系统特点