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 相关文章推荐
cnblogs 代码高亮显示后的代码复制问题解决实现代码
Dec 14 Javascript
jquery js 获取时间差、时间格式具体代码
Jun 05 Javascript
js操作label给label赋值及取label的值示例
Nov 07 Javascript
jquery submit ie6下失效的原因分析及解决方法
Nov 15 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
May 25 Javascript
jquery.serialize() 函数语法及简单实例
Jul 08 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
Aug 10 Javascript
微信小程序(应用号)简单实例应用及实例详解
Sep 26 Javascript
jQuery实现html双向绑定功能示例
Oct 09 jQuery
关于HTML5的data-*自定义属性的总结
May 05 Javascript
vue-cli 3.x配置跨域代理的实现方法
Apr 12 Javascript
vue中添加与删除关键字搜索功能
Oct 12 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
如何分别全角和半角以避免乱码
2006/10/09 PHP
一篇不错的PHP基础学习笔记
2007/03/18 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
2012/11/01 PHP
php检查字符串中是否有外链的方法
2015/07/29 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
2016/01/13 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
vue组件初学_弹射小球(实例讲解)
2017/09/06 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
python遍历类中所有成员的方法
2015/03/18 Python
详解使用Python处理文件目录的相关方法
2015/10/16 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
python 绘制国旗的示例
2020/09/27 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
应届毕业生就业自荐信
2013/10/26 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
募捐感谢信
2015/01/22 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers