经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » 浏览器 » 查看文章
React如何实现浏览器打印部分内容详析
来源:jb51  时间:2019/5/20 8:34:48  对本文有异议

前言

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

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

1. 构建待打印元素

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

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

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

处理流程:

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

对应的CSS设置:

  1. @page {
  2. size: A4;
  3. margin: 0;
  4. }
  5. @media print {
  6. html, body {
  7. min-width: 0;
  8. width: 210mm;
  9. height: 297mm;
  10. }
  11. .print-hide {
  12. visibility: hidden!important;
  13. display: none!important;
  14. }
  15. }

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

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

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

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

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

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

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

3. 注意点

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

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

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

总结

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号