Safari,javascript:等待打印确认窗口

问题描述 投票:2回答:1

我有这样的代码:

hideStuff();
window.print();
showStuff();

因此,hideStuff()会隐藏页面上的某些元素,以便它们不会打印,而showStuff()会在打印对话框关闭后恢复这些隐藏的元素。

这在我第一次单击打印按钮时适用于Safari,但是如果我然后取消打印对话框,返回页面并再次单击打印按钮,Safari会弹出一条消息,显示“此网页正在尝试打印。你想打印这个网页吗?“然后,如果我继续,结果打印预览包含页面的所有元素,甚至是那些应该被隐藏的元素。

问题似乎是“你确定”对话框延迟打开window.print(),但它确实允许javascript继续。也就是说,showStuff()立即运行,而不是在打印对话框关闭后运行。

当“你确定”框打开时,我该怎么做才能停止执行?

谢谢!

javascript safari
1个回答
0
投票

我遇到了同样的问题并开始思考 - 当用户在确认对话框中点击取消时可能会触发什么事件? 事实证明,我们的超级英雄事件是小onfocus。只要用户直接单击“取消”或按键盘上的Esc,就会触发它。

因此,基于此发现的解决方法可能大致如下:

function safariPrint() {
  // Safari 12, macOS
  if (!window.onafterprint) {
    const onAfterPrint = mql => {
      if (!mql.matches) {
        showStuff();

        // printing is finished => unsubscribe to avoid leaks
        if (mediaQueryList.removeEventListener) {
          mediaQueryList.removeEventListener('change', onAfterPrint);
        } else {
          mediaQueryList.removeListener(onAfterPrint);
        }
      }
      window.onfocus = null;
    };

    // a tiny polyfill for a plain onafterprint
    // to handle standard window.print() dialog events
    const mediaQueryList = window.matchMedia('print');
    if (mediaQueryList.addEventListener) {
      mediaQueryList.addEventListener('change', onAfterPrint);
    } else {
      mediaQueryList.addListener(onAfterPrint);
    }

    // if a user cancels printing in Safari's print confirmation dialog
    // then we will trigger a cleanup
    window.focus();
    window.onfocus = () => {
      onAfterPrint(mediaQueryList);
    };
  }

  hideStuff();    
  window.print();
}
© www.soinside.com 2019 - 2024. All rights reserved.