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 风格的HTML文本转义
Jul 01 Javascript
Javascript base64编码实现代码
Dec 02 Javascript
javascript实时显示北京时间的方法
Mar 12 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
May 09 Javascript
js实现Select列表内容自动滚动效果代码
Aug 20 Javascript
jQuery拖动元素并对元素进行重新排序
Dec 30 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
Bootstrap多级菜单的实现代码
May 23 Javascript
详解Angular 4.x NgTemplateOutlet
May 24 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
Dec 18 Javascript
vue生成token并保存到本地存储中
Jul 17 Javascript
vue路由结构可设一层方便动态添加路由操作
Aug 31 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安装xdebug/php安装pear/phpunit详解步骤(图)
2013/12/22 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
jQuery 版本的文本输入框检查器Input Check
2009/07/09 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
2017/09/11 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
python显示生日是星期几的方法
2015/05/27 Python
举例区分Python中的浅复制与深复制
2015/07/02 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
python内置数据类型之列表操作
2018/11/12 Python
在Django中实现添加user到group并查看
2019/11/18 Python
几款好用的python工具库(小结)
2020/10/20 Python
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
土木工程毕业生推荐信
2013/10/28 职场文书
本科应届生自荐信
2014/06/29 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
导游词之大雁塔景区
2019/09/17 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
2022/04/13 Java/Android
MySQL查询日期时间
2022/05/15 MySQL