Javascript after window.print()有时在打印对话框之前执行,有时在之后执行

Javascript after window.print()有时在打印对话框之前执行,有时在之后执行,javascript,printing,Javascript,Printing,我有一个带有“打印”按钮的网页。我想要的效果是,在打印对话框通过打印或取消完成后,页面感谢用户使用我们的网站 打印功能大致如下所示: function printThenThank() { window.print(); $('.thankYou').removeClass('hidden'); // alert('debug message'); } 我发现的问题是,有时“隐藏的”感谢信息会显示在打印输出中,有时则不会。我已经运行过多次,有时在打印模式之前会出现调试消息警报,有时

我有一个带有“打印”按钮的网页。我想要的效果是,在打印对话框通过打印或取消完成后,页面感谢用户使用我们的网站

打印功能大致如下所示:

function printThenThank() {
  window.print();
  $('.thankYou').removeClass('hidden');
  // alert('debug message');
}
我发现的问题是,有时“隐藏的”感谢信息会显示在打印输出中,有时则不会。我已经运行过多次,有时在打印模式之前会出现调试消息警报,有时只有在取消打印请求后才会发出警报

我最初认为
window.print()
是一个同步调用,但它的行为更像是带有模式对话框的进程的异步触发器


有没有可靠的跨平台方法可以确保我要执行的内容重写在用户选择从窗口打印或取消后才启动。打印()对话框?

为了应对竞争条件,您可以尝试通过设置超时触发感谢,但这确实只有在调用是同步的情况下才能起作用。我不会对所有的浏览器都依赖它

相反,您要做的是将“谢谢”隐藏在印刷品中,即使它在印刷品中:

HTML:


为什么不在这种情况下使用settimeout呢?我不关心比赛条件下的settimeout。如果我将其设置得太短,它仍然可以在呈现打印之前重新绘制页面元素。如果太长,我的页面会挂起,等待快速用户立即取消。是的,这很有意义。虽然我没有说明,但我希望在打印后隐藏其他页面元素,因此“谢谢”消息将替换其他内容。我可以使用与您描述的相同的技术,仅为
@media screen
隐藏它们,但使它们对
@media print
可见。
<div class="thankYou no-print">Thanks for printing</div>
@media print {    
  .no-print, .no-print *
  {
    display: none !important;
  }
}