前端在項目開發(fā)的過程中,可能會遇到需要打印的需求,那么如何用js實現(xiàn)調(diào)用打印機進行正確的打印呢?
直接上代碼:(新建一個js文件椎椰,便于復用)
// 新建DOM,將需要打印的內(nèi)容填充到DOM
function getContainer(html) {
// 清除打印沾鳄,具體方法往下拉
cleanPrint();
let container = document.createElement("div");
container.setAttribute("id", "print-container");
container.innerHTML = html;
return container;
}
// 設置打印樣式
function getStyle(myHeight) {
// 新建的dom不需要在頁面展示
let styleContent = `#print-container {
display: none;
}
@media print {
body > :not(.print-container) {
display: none;
}
html,
body {
display: block !important;
// 這個地方傳入咱們自己需要打印內(nèi)容設置的高度慨飘,就可以打印對應的張數(shù)
height: ${myHeight};
}
#print-container {
display: block;
}
// 我這里打印的是表格,所以設置了邊框
.el-table {
border: 1px solid #666666;
}
th {
border: 1px solid #666666;
}
td {
border: 1px solid #666666;
}
}`;
let style = document.createElement("style");
style.innerHTML = styleContent;
return style;
}
// 清空打印內(nèi)容及DOM
function cleanPrint() {
let div = document.getElementById('print-container')
if (!!div) {
document.querySelector('body').removeChild(div)
}
}
// 打印機喚起及圖片完全加載后再調(diào)用打印方法
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);
})
});
}
// 拋出打印方法译荞,進行調(diào)用瓤的,接收兩個參數(shù),一個是需要打印的內(nèi)容吞歼,一個是打印內(nèi)容的高度(傳高度就可以避免只打印一頁的問題)
export default function printHtml(html, myHeight) {
let style = getStyle(myHeight);
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);
});
}
使用方法:
在需要打印的頁面調(diào)用可復用打印js文件
-
可觸發(fā)的事件圈膏,看個人需求,是點擊還是獲取焦點去調(diào)用下邊就好了
doPrint() { // 取自己頁面需要打印內(nèi)容的標簽 let printDocument = document.getElementById("printDocument"); // 取出需要打印的內(nèi)容 let printData = printDocument.innerHTML; // 調(diào)用打印方法篙骡,傳入打印內(nèi)容及需要打印內(nèi)容的高度稽坤,可自行調(diào)整最佳高度 printHtml(printData, this.printTable.length * 50 + 250 + "px"); }
經(jīng)試驗丈甸,目前未發(fā)現(xiàn)瀏覽器兼容問題,個人認為還是比較完美的尿褪,看到這篇文章的朋友覺得好的話給個贊睦擂,也可以提出你們的見解,實現(xiàn)更好的打印方法