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 JSON的反序列化类 using问题的解决方法
Dec 19 Javascript
jQuery.trim() 函数及trim()用法详解
Oct 26 Javascript
js实现模拟银行卡账号输入显示效果
Nov 18 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
Aug 02 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
Aug 16 Javascript
遍历json 对象的属性并且动态添加属性的实现
Dec 02 Javascript
Vue.Js中的$watch()方法总结
Mar 23 Javascript
JQuery实现图片轮播效果
May 08 jQuery
Angular项目从新建、打包到nginx部署全过程记录
Dec 09 Javascript
jQuery中实现text()的方法
Apr 04 jQuery
countup.js实现数字动态叠加效果
Oct 17 Javascript
js 实现Material UI点击涟漪效果示例
Sep 23 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
当海贼王变成JOJO风
2020/03/02 日漫
PHP实现一维数组转二维数组的方法
2015/02/25 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
jQuery 位置插件
2008/12/25 Javascript
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
node.js入门教程
2014/06/01 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
vue实现简单图片上传
2020/06/30 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
Python列表list数组array用法实例解析
2014/10/28 Python
python批量赋值操作实例
2018/10/22 Python
24式加速你的Python(小结)
2019/06/13 Python
10款最好的Python开发编辑器
2019/07/03 Python
Python作用域与名字空间原理详解
2020/03/21 Python
Python如何在bool函数中取值
2020/09/21 Python
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
德尔福集团DELPHI的笔试题
2012/02/22 面试题
医院护士见习期自我鉴定
2014/04/10 职场文书
团日活动总结书格式
2014/05/08 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
小学生班干部竞选稿
2015/11/20 职场文书