翼度科技»论坛 编程开发 JavaScript 查看内容

使用window.print()前端实现网页打印超详细教程(含代码示例)

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
前言

在前端开发中,有时我们需要提供打印网页内容的功能,让最终用户能够将网页上的特定部分打印成纸质文档。
虽然浏览器提供了自己的打印预览和打印功能,但使用 JavaScript 的 window.print() 方法可以更灵活地控制打印内容和样式。
本文洲洲将详细介绍如何使用 window.print() 方法实现网页打印,并提供代码示例。

一、打印基础知识

在开始之前,我们需要了解基本的打印流程:
1、用户触发打印操作,这可以是一个按钮点击事件。
2、JavaScript 捕获事件并调用 window.print() 方法。
3、浏览器显示打印预览窗口,用户可以设置打印选项并打印。
print() 方法用于打印当前窗口的内容。
调用 print() 方法会产生一个打印预览弹框,让用户可以设置打印请求。
最简单的打印就是直接调用window.print(),当然用 document.execCommand(‘print’) 也可以达到同样的效果。
默认打印页面中body里的所有内容。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <title>打印-洲洲</title>
  6. </head>
  7. <body>
  8.   <input type="button" value="打印此页面" onclick="printpage()" />
  9.   <div>内容</div>
  10.   <script>
  11.     function printpage() {
  12.       window.print()
  13.     }
  14.   </script>
  15. </body>
  16. </html>
复制代码
比方说我们用上面的代码,进行一个简单的尝试:

但是这样会存在一定的问题,那就是直接调用print()方法去打印网页内容,事先调整好的布局和样式都没法实现,所以有哪些方法可以帮助我们改善打印的用户体验呢?

二、打印控制


2.1 使用打印样式表

配置一份打印样式表print.css,引入到HTML文档,在 上加上一个 media=“print” 来标识这是打印机才会应用的样式表,这样打印就会默认将该样式表应用到文档中。
  1. <link href="/path/print.css" rel="external nofollow"  media="print" rel="stylesheet" />
复制代码
2.2 使用媒介查询

要修改的样式没有很多的时候,其实完全不需要重新写个样式表,写上一个媒介查询也可以达到同样的效果,如:
  1. @media print {
  2.   h1 {
  3.     font-size: 20px;
  4.     color: red;
  5.   }
  6. }
复制代码
2.3 内联样式使用media属性
  1. <style type="text/css" media="print">
  2.    // 打印样式
  3. </style>
复制代码
2.4 css中使用@import引入打印样式表
  1. @import url("/path/print.css") print;
复制代码
2.5 打印指定区域

在需要打印的正文内容所对应的html开始处加上标识,结尾处加上标识,截取打印标识之间的内容替换body的内容,调用打印print()方法。
  1. <body>
  2.   <input type="button" value="打印此页面" onclick="printpage()" />

  3.   <!--startprint-->
  4.   <div id="printContent">打印内容</div>
  5.   <!--endprint-->

  6.   <script>
  7.     function printpage() {
  8.       let oldStr = window.document.body.innerHTML; // 获取body的内容
  9.       let start = "<!--startprint-->"; // 开始打印标识, 17个字符
  10.       let end = "<!--endprint-->"; // 结束打印标识
  11.       let newStr = oldStr.substr(oldStr.indexOf(start) + 17); // 截取开始打印标识之后的内容
  12.       newStr = newStr.substring(0, newStr.indexOf(end)); // 截取开始打印标识和结束打印标识之间的内容
  13.       window.document.body.innerHTML = newStr; // 把需要打印的指定内容赋给body
  14.       window.print(); // 调用浏览器的打印功能打印指定区域
  15.       window.document.body.innerHTML = oldStr; // body替换为原来的内容
  16.     }
  17.   </script>
  18. </body>
复制代码
或者也可以将需要打印的内容用一个大的div包裹,打印时将body的内容替换为该div的内容,调用打印print()方法。
  1. <body>
  2.   
  3.   <input type="button" value="打印此页面" onclick="printpage()" />
  4.   <div id="printContent">打印内容</div>

  5.   <script>
  6.     function printpage() {
  7.       let newstr = document.getElementById("printContent").innerHTML;
  8.       let oldstr = document.body.innerHTML;
  9.       document.body.innerHTML = newstr;
  10.       window.print();
  11.       document.body.innerHTML = oldstr;
  12.       return false;
  13.     }
  14.   </script>
  15. </body>
复制代码
也可以在打印之前,我们可以使用 JavaScript 来隐藏那些不需要打印的元素。
  1. function printContent() {
  2.     // 隐藏不需要打印的元素
  3.     document.body.style.display = 'none';
  4.    
  5.     // 调用打印
  6.     window.print();
  7.    
  8.     // 打印完成后恢复显示
  9.     window.onfocus = function() {
  10.         document.body.style.display = '';
  11.         window.onfocus = null; // 清除事件监听
  12.     };
  13. }
复制代码
2.6 插入分页
  1. /* 在h1元素前始终插入分页符 */
  2. @media print {
  3.     h1 {page-break-before: always;}
  4. }
复制代码
  1. /* 在 .footer 元素后始终插入分页符 */
  2. @media print {
  3.     .footer {page-break-after: always;}
  4. }
复制代码
  1. /* 避免在 <pre> 与 <blockquote> 元素中插入分页符 */
  2. @media print {
  3.     pre, blockquote {page-break-inside: avoid;}
  4. }
复制代码
2.7 设置打印布局
  1. @media print {
  2.     @page {
  3.       /* 纵向 */
  4.       size: portrait;

  5.       /* 横向 */
  6.       size: landscape;

  7.       /* 边距 上右下左 */
  8.       margin: 1cm 2cm 1cm 2cm;
  9.     }
  10.   }
复制代码
2.8 去除页眉页脚

当页眉打印默认有页眉页脚信息,展现到页面外边距范围,我们可以通过去除页面模型page的外边距,使得内容不会延伸到页面的边缘,再通过设置 body 元素的 margin 来保证 A4 纸打印出来的页面带有外边距。
  1. @media print {
  2.   @page {
  3.     margin: 0;
  4.   }
  5.   body {
  6.     margin: 1cm;
  7.   }
  8. }
复制代码
三、示例代码打印方法

在utils下新建print.js文件:
  1. export default function printHtml(html) {
  2.   let style = getStyle();
  3.   let container = getContainer(html);

  4.   document.body.appendChild(style);
  5.   document.body.appendChild(container);

  6.   getLoadPromise(container).then(() => {
  7.     window.print();
  8.     document.body.removeChild(style);
  9.     document.body.removeChild(container);
  10.   });
  11. }

  12. // 设置打印样式
  13. function getStyle() {
  14. let styleContent = `#print-container {
  15.     display: none;
  16. }
  17. @media print {
  18.     body > :not(.print-container) {
  19.         display: none;
  20.     }
  21.     html,
  22.     body {
  23.         display: block !important;
  24.     }
  25.     #print-container {
  26.         display: block;
  27.     }
  28. }`;
  29.   let style = document.createElement("style");
  30.   style.innerHTML = styleContent;
  31.   return style;
  32. }

  33. // 清空打印内容
  34. function cleanPrint() {
  35.   let div = document.getElementById('print-container')
  36.   if (!!div) {
  37.     document.querySelector('body').removeChild(div)
  38.   }
  39. }

  40. // 新建DOM,将需要打印的内容填充到DOM
  41. function getContainer(html) {
  42.   cleanPrint()
  43.   let container = document.createElement("div");
  44.   container.setAttribute("id", "print-container");
  45.   container.innerHTML = html;
  46.   return container;
  47. }

  48. // 图片完全加载后再调用打印方法
  49. function getLoadPromise(dom) {
  50.   let imgs = dom.querySelectorAll("img");
  51.   imgs = [].slice.call(imgs);

  52.   if (imgs.length === 0) {
  53.     return Promise.resolve();
  54.   }

  55.   let finishedCount = 0;
  56.   return new Promise(resolve => {
  57.     function check() {
  58.       finishedCount++;
  59.       if (finishedCount === imgs.length) {
  60.         resolve();
  61.       }
  62.     }
  63.     imgs.forEach(img => {
  64.       img.addEventListener("load", check);
  65.       img.addEventListener("error", check);
  66.     })
  67.   });
  68. }
复制代码
引入print文件,传入需要打印的DOM元素即可:
  1. import printHtml from "@/utils/print.js"

  2. export default {
  3.   methods: {
  4.     print() {
  5.       let printData = `<div>打印内容</div>`
  6.       printHtml(printData)
  7.     }
  8.   },
  9. }
复制代码
总结

到此这篇关于使用window.print()前端实现网页打印的文章就介绍到这了,更多相关window.print()前端网页打印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/javascript/323399h7h.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具