React如何实现浏览器打印部分内容详析


Posted in Javascript onMay 19, 2019

前言

近期着手项目任务的打印功能,在此作个记录,本文介绍基于React的一种调用浏览器打印页面指定内容的方法。

整体思路: 通过构建一个隐藏的元素(该元素包裹需打印的内容),当打印行为触发时,将页面其他的一些不需要打印的元素隐藏,然后将需打印的元素追加到body中,打印完成后,再恢复初始状态即可。浏览器打印的本质还是将web页面中的元素打印出来而已。

1. 构建待打印元素

在页面中构建一个display为none的元素,里面的内容为你需要打印的内容。我们还需要设置包裹打印内容的元素的ref属性,以便于后面获取到元素。

<div style={{ display: 'none' }}>
 <div ref={el => (this.printRef = el)}>
 { 打印内容 }
 </div>
</div>

2. 打印动作触发时的处理

处理流程:

  1. 获取待打印元素;
  2. 将根元素隐藏;
  3. 将待打印元素追加到body中;
  4. 调用浏览器的打印预览;
  5. 预览界面关闭后,将待打印元素从body中移除,将原始页面恢复。
let printView = this.state.printRef //获取待打印元素
document.querySelector('#root').className = 'print-hide' //将根元素隐藏
document.body.appendChild(printView) //将待打印元素追加到body中
window.print() //调用浏览器的打印预览
document.body.removeChild(printView) //将待打印元素从body中移除
document.querySelector('#root').className = '' //将原始页面恢复

对应的CSS设置:

@page {
 size: A4;
 margin: 0;
}
@media print {
 html, body {
  min-width: 0;
  width: 210mm; 
  height: 297mm;
 }
 .print-hide {
 visibility: hidden!important;
 display: none!important;
 }
}

其中,@page中的size可以自己设置纸张的大小,如果是A4纸可以直接设置值为A4,媒体查询@media print中设置的是打印时的样式,因为打印设备知道其输出区域的物理大小,所以使用厘米(cm)、毫米(mm)、英寸(in)等作为打印设计的单位完全可行。

补充(其他原生的打印方法)

直接替换body的内容为要打印的内容,之后再重新刷新页面。

const old = window.document.body.innerHTML //备份原来的页面
window.document.body.innerHTML = ''
window.document.body.appendChild(/* 将你要打印的内容附加到这 */)
window.print() //调用print()函数时,会跳出打印预览的界面,以下的代码被阻塞,关闭预览界面后继续执行
window.document.body.innerHTML = old
window.location.reload() //重新加载旧页面

打开一个新窗口,将打印内容放到新窗口打印,打印结束后关闭新窗口

const newWindow = window.open("打印窗口", "_blank")
const docStr = '<div>test</div>' //需要打印的内容
newWindow.document.write(docStr)
const styles = document.createElement("style")
styles.setAttribute('type', 'text/css') //media="print"
styles.innerHTML = ''
newWindow.document.getElementsByTagName('head')[0].appendChild(styles)
newWindow.print()
newWindow.close()

以上两种方法可能会造成CSS样式应用无效的问题。

3. 注意点

第二小节的步骤2中的意思是:将页面中所有不需要打印的元素隐藏,特别注意像模态窗Model这些元素,也要为它们加上 'print-hide'className属性。

如果需要在特定位置强制分页打印,可以尝试在对应元素上设置page-break-before:always !importantpage-break-after:always !importantCSS属性,该属性只对块级元素有效。

进入打印预览后,我们无法获知用户最终是选择了打印,还是选择了取消。这里若有人知道解决方法的话,欢迎留言。

React如何实现浏览器打印部分内容详析

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery checkbox全选、取消全选实现代码
Mar 05 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
Apr 27 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
May 08 Javascript
Javascript技术栈中的四种依赖注入小结
Feb 27 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
Aug 11 Javascript
jquery在启动页面时,自动加载数据的实例
Jan 22 jQuery
JavaScript使用表单元素验证表单的示例代码
Aug 20 Javascript
layui form.render('select', 'test2') 更新渲染的方法
Sep 27 Javascript
json字符串对象转换代码实例
Sep 28 Javascript
vue中的v-model原理,与组件自定义v-model详解
Aug 04 Javascript
如何在vue 中引入使用jquery
Nov 10 jQuery
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
Jan 29 Javascript
koa-router路由参数和前端路由的结合详解
May 19 #Javascript
Vue.js中该如何自己维护路由跳转记录
May 19 #Javascript
利用Vue实现一个markdown编辑器实例代码
May 19 #Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
May 18 #Javascript
微信小程序实现搜索指定景点周边美食、酒店
May 18 #Javascript
vue+高德地图写地图选址组件的方法
May 18 #Javascript
微信小程序实现搜索功能并跳转搜索结果页面
May 18 #Javascript
You might like
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
2018/05/28 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
2019/12/13 PHP
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
vue的keep-alive中使用EventBus的方法
2019/04/23 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
2020/11/07 Javascript
在Python中使用列表生成式的教程
2015/04/27 Python
处理Python中的URLError异常的方法
2015/04/30 Python
详细解读Python中的__init__()方法
2015/05/02 Python
python迭代器与生成器详解
2016/03/10 Python
Python 多线程实例详解
2017/03/25 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
外贸采购员岗位职责
2014/03/08 职场文书
忠诚教育心得体会
2014/09/03 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
员工工作表现自我评价
2015/03/06 职场文书
招商银行工作证明
2015/06/17 职场文书
python代码实现备忘录案例讲解
2021/07/26 Python
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS
实例详解Python的进程,线程和协程
2022/03/13 Python
SpringBoot 集成短信和邮件 以阿里云短信服务为例
2022/04/22 Java/Android