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();
}
印刷许可证
...
当我检查按钮时


问题出在
窗口中。关闭()
,要再次打印窗口,必须打开一个窗口

可能的解决办法:

  • 拆下关闭窗口的线

使用此代码直接修改DOM时:

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我已按照以下建议实现,但在导航到“打印详细信息”组件时,要打印的页面是空白的。