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 相关文章推荐
代码精简的可以实现元素圆角的js函数
Jul 21 Javascript
jQuery.each()用法分享
Jul 31 Javascript
JavaScript prototype 使用介绍
Aug 29 Javascript
JS弹出层单纯的绝对定位居中示例代码
Feb 18 Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 Javascript
jQuery+AJAX实现无刷新下拉加载更多
Jul 03 Javascript
jQuery使用animate创建动画用法实例
Aug 07 Javascript
jQuery实现内容定时切换效果完整实例
Apr 06 Javascript
Vue数据驱动模拟实现4
Jan 12 Javascript
JS动态生成年份和月份实例代码
Feb 04 Javascript
node简单实现一个更改头像功能的示例
Dec 29 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
Apr 07 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获取数组中重复最多的元素的实现方法
2014/11/11 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
详解php实现页面静态化原理
2017/06/21 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
用python进行视频剪辑
2020/11/02 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
骆驼官方商城:CAMEL
2016/11/22 全球购物
客户表扬信范文
2014/01/10 职场文书
租房协议书范文
2014/08/20 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
任命书格式范文
2015/09/22 职场文书
mysql中整数数据类型tinyint详解
2021/12/06 MySQL
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers