window.print();在 Safari 中不起作用

window.print(); does not work in Safari

当使用 onclick link Safari 时,打印方法在 window 上不起作用。通过放置在按钮上的 onclick 代码在 safari 中打印网页的替代方法是什么?发生的另一个奇怪行为是,当我尝试关闭 window 时,浏览器本机打印对话框就会出现。

使用 window.print()Safari 没问题。抱歉,我无法尝试 Windows OS,但遵循适用于 MacOS:

的代码
<!DOCTYPE html>
<html>
<body>
  <button onclick="myFunction()">Click me</button>
  <a href="#" onclick="myFunction()">Click link</a>

  <script>
    function myFunction() {
      window.print();
    }
  </script>

</body>
</html>

我在使用 Safari 浏览器(而不是其他任何浏览器)时遇到了类似的问题。 就我而言,中止当前正在进行的所有 API 调用会立即显示本机打印对话框。

我猜想关闭 tab/page 时出现对话框的原因是所有网络请求都被取消了。

以下是如何创建 ajax 请求池的示例(使用 jQuery 时): Stop all active ajax requests in jQuery

此外,为了使其始终如一地工作,我必须在短超时(100 毫秒)内包装 $.xhrPool.abortAll 函数。

我的点击处理函数(简化)看起来像这样:

function myFunction() {
    window.print();
    window.setTimeout(function () {
        $.xhrPool.abortAll()
    }, 100);
}

试试这个解决方案:

try {
  // Print for Safari browser
  document.execCommand('print', false, null)
} catch {
  window.print()
}

如果您 return 将 window.print() 的结果传递给 onclick 处理程序,Safari 将不会显示打印 window。我使用 React 并且必须进行以下更改:

//code that does not work:
<button type="button" onClick={() => window.print()}>Print!</button>

//code that does work:
<button type="button" onClick={() => { window.print(); }}>Print!</button>

我测试的所有其他浏览器(iOS 上的 Safari 除外)都可以正常工作,例如 iOS 上的 Chrome 或桌面上的 Chrome。

我最好的猜测是,由于 window.print 在 Safari 中已知是异步的,所以可能 window.print() return 对 onclick 处理程序来说是假的,它取消了任何“弹出窗口”显示。这可能就是为什么上面带有 myFunction() 代码的示例在 onclick="window.print()" 可能不起作用时可能起作用的原因。