1、window.print()
趋向于打印整个界面,且界面打印后需要重载原界面,否则原界面的所有事件将不再生效,打印方式简单
2、使用iframe进行截图打印
可以满足更加复杂的打印需求,且兼容IE9及以上浏览器及各大主流浏览器,打印完后不用刷新原浏览器界面
(1)安装html2canvas:npm i html2canvas --save
使用html2canvas插件将需要打印的html转化成canvas,再将canvas转为base64图片;
(2)动态创建iframe,将图片放入iframe中,打印iframe即可
此种方法既打印了我们所需要的html元素,保留了其样式,也无需刷新原浏览器界面。
/**
* @function: 使用iframe打印指定html
* @pramas: printDom: 打印的dom区域
**/
import html2canvas from 'html2canvas'
export function printHtml (printDom) {
// html2canvas将当页面渲染成一个Canvas图片,通过读取DOM并将不同的样式应用到这些元素上实现
html2canvas(printDom).then((canvas) => {
const imgSrc = canvas.toDataURL('image/png') // 把canvas转为base64图片
const iframe = document.createElement('IFRAME')
iframe.setAttribute('style', 'width:0px;height:0px;') // 设置iframe不可见
document.body.appendChild(iframe)
const printObj = iframe.contentWindow
const doc = printObj.document
doc.open()
// 将目标区域的html写入iframe
doc.write(`<img id="imgDom" src="${imgSrc}" alt="">`)
// 必须加上,不然ie没发调出打印的弹框,关闭iframe,释放内存,防止内存泄漏
doc.close()
// 样式插入进去
const style = doc.createElement('style')
style.innerText = '@media print{@page{size: auto A4 landscape;margin: 10pt 0;}}'
doc.getElementsByTagName('head')[0].appendChild(style)
setTimeout(() => {
printObj.print()
const iframeDom = document.body.getElementsByTagName('iframe')
iframeDom.length > 0 && document.body.removeChild(iframeDom[0])
}, 500)
})
}