页面通过element 的 el-dialog 实现效果如下:
因为组件是独立弹窗,点击打印按钮会只打印弹窗部分,刚好和需求相符,就不用再写代码决定要打印的元素了
(ps:弹窗里右下角的打印按钮在调用window.print() 前隐藏了):
但问题是,预览中出现了两张纸,而且两张纸内容是一样的:
这我就很奇怪,如果第二张是空白页,可能是因为样式或内容导致一张纸放不下造成的,但现在两张纸是相同的内容,是什么原因引起的?
页面通过element 的 el-dialog 实现效果如下:
因为组件是独立弹窗,点击打印按钮会只打印弹窗部分,刚好和需求相符,就不用再写代码决定要打印的元素了
(ps:弹窗里右下角的打印按钮在调用window.print() 前隐藏了):
但问题是,预览中出现了两张纸,而且两张纸内容是一样的:
这我就很奇怪,如果第二张是空白页,可能是因为样式或内容导致一张纸放不下造成的,但现在两张纸是相同的内容,是什么原因引起的?
可能的原因及解决方案:
在打印方法前添加 e.stopPropagation()
handlePrint(e) {
e.stopPropagation();
this.hideButton();
window.print();
}
强制重置打印样式表
@media print {
@page { size: auto; margin: 0; }
body * {
visibility: hidden;
}
.el-dialog__wrapper { /* 弹窗容器选择器 */
position: absolute !important;
left: 0 !important;
top: 0 !important;
width: 100% !important;
height: auto !important;
overflow: visible !important;
}
.el-dialog, .el-dialog * { /* 弹窗本体选择器 */
visibility: visible !important;
}
}
确保隐藏操作完成后再执行打印
async handlePrint() {
await this.hideButton(); // 假设返回Promise
setTimeout(() => { window.print(); }, 50); // 增加渲染间隙
}
强制单页打印(适用于固定高度的内容)
@media print {
.el-dialog {
page-break-after: avoid !important;
page-break-inside: avoid !important;
}
}
验证步骤:
debugger
语句拦截打印操作备选方案:
改用iframe打印更稳定:
const printContent = document.querySelector('.dialog-content').cloneNode(true);
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.contentDocument.body.appendChild(printContent);
iframe.contentWindow.print();
setTimeout(() => iframe.remove(), 1000);
10 回答11k 阅读
6 回答2.9k 阅读
5 回答4.7k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决