Javascript window.print()方法只工作一次
我在其中一个组件的某个角度项目上实现了以下代码片段。我可以成功打印,但第二次尝试时,不会触发Javascript window.print()方法只工作一次,javascript,angular,Javascript,Angular,我在其中一个组件的某个角度项目上实现了以下代码片段。我可以成功打印,但第二次尝试时,不会触发onClickPrint()方法。我错过了什么 onClickPrint() { const printContents = document.getElementById('permit').innerHTML; const originalContents = document.body.innerHTML; document.body.innerHTML = printC
onClickPrint()
方法。我错过了什么
onClickPrint() {
const printContents = document.getElementById('permit').innerHTML;
const originalContents = document.body.innerHTML;
document.body.innerHTML = printContents;
window.print();
// document.body.innerHTML = originalContents;
window.close();
}
<button mat-button (click)="onClickPrint()" class="my-btn">Print licence</button>
<mat-card size="B4" class=" container w-100 bg" id="permit">
...
</mat-card>
onClickPrint(){
const printContents=document.getElementById('permit').innerHTML;
const originalContents=document.body.innerHTML;
document.body.innerHTML=打印内容;
window.print();
//document.body.innerHTML=原始内容;
window.close();
}
印刷许可证
...
当我检查按钮时
问题出在
窗口中。关闭()
,要再次打印窗口,必须打开一个窗口
可能的解决办法:
- 拆下关闭窗口的线
const printContents = document.getElementById('permit').innerHTML;
const originalContents = document.body.innerHTML;
document.body.innerHTML = printContents;
这样做打破了所有我无法理解的参考和事物
为什么不创建一个单独的组件和路由,其中包含要打印的内容,然后在该组件加载后运行“打印”
例如:
onClickPrint() {
this.router.navigate(['/print-details']);
}
在小型服务中,维护需要打印的详细信息:
class DetailService {
public details;
}
在打印组件中
class PrintComponent implements AfterViewInit {
ngAfterViewInit() {
this.detailService.details;
// Finish out your component template view or whatever you need to do
window.print();
}
}
在Angular中工作时,尝试让Angular使用DOM完成所有繁重的提升。如果您必须修改它,那么有一个类Render2可以提供帮助,但这是最后的手段 我以前有过这个问题 我发现打开一个新窗口打印可以解决你的问题,你可以通过链接或样式标签传递你的样式(注意:如果你使用的是有角度的材质,你会有错误,所以样式是纯css的,但是你不应该对mat卡有问题,因为id标签在上面) 您还会注意到我使用的是jquery,因为Mac和IOS可能会出现漏洞,而不会完全显示打印窗口
onClickPrint() {
let popupWinindow
let innerContents = document.getElementById('permit').innerHTML;
popupWinindow = window.open('', '_blank', 'width=800px,height=600px,scrollbars=no,menubar=no,toolbar=no,location=no,status=no,titlebar=no');
popupWinindow.document.open();
popupWinindow.document.write(`
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="styles.css" />
<title>File Name</title>
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
<script>
window.onload = function() {
setTimeout(() => {
window.print();
}, 1000);
};
</script>
</head>
<body>
${innerContents}
</body>
</html>
`);
popupWinindow.document.close();
}
onClickPrint(){
让Popupindow进来
让innerContents=document.getElementById('permit').innerHTML;
popupWinindow=window.open(“,”空白“,”宽度=800px,高度=600px,滚动条=no,菜单栏=no,工具栏=no,位置=no,状态=no,标题栏=no”);
popupwindow.document.open();
popupwindow.document.write(`
文件名
window.onload=函数(){
设置超时(()=>{
window.print();
}, 1000);
};
${innerContents}
`);
popupwindow.document.close();
}
看起来您正在关闭您试图激活的元素所在的窗口。删除window.close()
应该可以。您需要从DOM中删除print元素才能再次使用print()。@Rager我最初删除了它,但当我尝试单击侧边栏菜单上的其他位置时没有效果。您正在直接修改DOM。这会使angular关闭并破坏您的整个应用程序。@shadowfox476我已按照以下建议实现,但在导航到“打印详细信息”组件时,要打印的页面是空白的。