代码之家  ›  专栏  ›  技术社区  ›  crowhill

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

  •  2
  • crowhill  · 技术社区  · 6 年前

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

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

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

    问题似乎是“确定”对话框延迟了打开 window.print() 允许javascript继续。 也就是说, showStuff()

    当“你确定”框打开时,我能做些什么来停止执行?

    谢谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Fedor the_drow    5 年前

    我也遇到过同样的问题,我的调查显示 onfocus (或 电子稳定控制系统 按钮)关闭确认对话框。 聚焦事件

    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();
    }