前端直接打印html页面vue版(封装调用window.print()实现打印)

一.建立print.js,代码封装如下:

export default function printHtml(html) {
  const style = getStyle()
  const 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() {
  const styleContent = `#print-container {
    display: none
}
@media print {
    body > :not(.print-container) {
        display: none
    }
    html,
    body {
        display: block !important;
    }
    #print-container {
        display: block
    }
    @page {
      margin: 0mm;
    }
}`
  const style = document.createElement('style')
  style.innerHTML = styleContent
  return style
}

// 清空打印内容
function cleanPrint() {
  const div = document.getElementById('print-container')
  if (div) {
    document.querySelector('body').removeChild(div)
  }
}

// 新建DOM,将需要打印的内容填充到DOM
function getContainer(html) {
  cleanPrint()
  const 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)
    })
  })
}

二.在需要的页面上调用print.js

import printHtml from '@/utils/print.js'

三.在按钮点击事件中调用打印即可

onPrint() {
      const printData = document.getElementById('printcontent').innerHTML
      printHtml(printData)
},

 

posted @ 2022-03-22 14:39  雨季的泪  阅读(1825)  评论(0编辑  收藏  举报