前端打印(不使用插件,没有副作用)

今天要写一个打印,以前写过是直接调用window.print() ,因为之间是点击预览,跳转页面,打印,所以也没发现有什么副作用,今天,打印是在当前页打印局部,网上部分方法说,打印前把body赋值成局部元素,打印后复原,我发现这样会让打印之后,页面点击事件失效

但是我找到一个无副作用的,是在取到全局dom,后把自己不需要的元素给隐藏掉,然后打印,因为拿到dom后赋值给了变量,直接操作变量,所以也不会影响原页面, 还可以自定义打印时候,打印样式,代码如下

把下面的代码是封装的,你只需要,新建一个文件,命名为print.ts/print.js(当然了名字你可以随便起),然后把下面代码赋值进去

export default function printHtml(html) {
  let style = getStyle();
  let container = getContainer(html);
 
  document.body.appendChild(style);
  document.body.appendChild(container);
 
  getLoadPromise(container).then(() => {
    window.print();
    document.body.removeChild(style);
    document.body.removeChild(container);
  });
}
 
// 设置打印样式
function getStyle() {
let styleContent = `
#print-container {
    display: none;
}
@media print {
    body > :not(.print-container) {
        display: none;
    }
    html,
    body {
        display: block !important;
    }
    #print-container {
        display: block;
    }


//DetialContentCss 到  .contentTitle2都是我自己的样式,所以你也可以在这里写你打印的元素的样式
    .DetialContentCss {
      border: 1px solid #333;
      padding: 20px;
      margin: 0 20px;
      .contentTitle {
        font-size: 22px;
        text-align: center;
      }
      .formCss{
      display: flex;
      align-items: center;
      justify-content: space-around;
      margin: 40px 80px;
      }
    }
    .contentTitle2 {
      font-size: 14px;
      margin: 10px 0px;
      padding: 0 4px;
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
    
}


`;
  let style = document.createElement("style");
  style.innerHTML = styleContent;
  return style;
}
 
// 清空打印内容
function cleanPrint() {
  let div = document.getElementById('print-container')
  if (!!div) {
    document.querySelector('body').removeChild(div)
  }
}
 
// 新建DOM,将需要打印的内容填充到DOM
function getContainer(html) {
  cleanPrint()
  let container = document.createElement("div");
  container.setAttribute("id", "print-container");
  container.innerHTML = html;
  return container;
}
 
// 图片完全加载后再调用打印方法
function getLoadPromise(dom) {
  let imgs = dom.querySelectorAll("img");
  imgs = [].slice.call(imgs);
 
  if (imgs.length === 0) {
    return Promise.resolve();
  }
 
  let finishedCount = 0;
  return new Promise(resolve => {
    function check() {
      finishedCount++;
      if (finishedCount === imgs.length) {
        resolve();
      }
    }
    imgs.forEach(img => {
      img.addEventListener("load", check);
      img.addEventListener("error", check);
    })
  });
}

然后打印页面引入使用一下,下面是你的打印页面的代码

//引入
import printHtml from "./helper/print"




//使用
function  clickPrint(){
//获取要打印的元素,你可以用id,然后用原生方法通过id去拿元素,我是vue3,直接使用了ref
  let print = tsPrint.value.innerHTML;
      printHtml(print)
}

参考大佬地址

window.print() 前端实现网页打印详解_window.print();-CSDN博客

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值