打印对话框关闭后自动关闭窗口

IT技术 javascript printing
2021-02-10 22:21:35

当用户单击按钮时,我打开了一个选项卡。onload我把它调出打印对话框,但用户问我它是否是可能的,它发送到打印机后打印,如果标签可以关闭本身。我不确定这是否可以完成。我曾尝试使用setTimeout();,但它不是一个定义的时间段,因为用户可能会分心并不得不重新打开选项卡。有什么办法可以做到这一点吗?

6个回答

如果您尝试在 print() 调用后立即关闭窗口,它可能会立即关闭窗口并且 print() 将不起作用。这是你不应该做的

window.open();
...
window.print();
window.close();

此解决方案适用于 Firefox,因为在调用 print() 时,它会等待打印完成,然后继续处理 javascript 并关闭窗口。IE 将因此失败,因为它调用 close() 函数而不等待 print() 调用完成。弹出窗口将在打印完成前关闭。

解决它的一种方法是使用“onafterprint”事件,但我不向您推荐它,因为这些事件仅适用于 IE。

最好的方法是在打印对话框关闭(打印完成或取消)后关闭弹出窗口。此时,弹出窗口将被聚焦,您可以使用“onfocus”事件关闭弹出窗口。

为此,只需在弹出窗口中插入此 javascript 嵌入代码:

<script type="text/javascript">
window.print();
window.onfocus=function(){ window.close();}
</script>

希望这有助于 ;-)

更新:

对于新的 chrome 浏览器,它可能仍然过早关闭,请参见此处我已经实现了这个更改,它适用于所有当前的浏览器:2/29/16

        setTimeout(function () { window.print(); }, 500);
        window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
上述解决方案不再有效,请添加事件监听器onafterprint关闭窗口 window.onafterprint = function(){ window.close()};
2021-03-14 22:21:35
这在这一点上似乎不适用于 chrome,因为 chrome 在内部处理打印,当打印对话框加载时窗口不会失去焦点,因此在打印完成时不会重新获得焦点。有什么办法可以使这项工作适用于 Chrome?
2021-03-19 22:21:35
我认为最新版本的 Chrome 在页面上的图像加载之前不会显示打印对话框,但它之前执行关闭,因此页面在加载之前关闭(打印对话框从不显示)。修理window.onload = function () { window.print(); setTimeout(window.close, 500); };
2021-03-23 22:21:35
截至 2016 年 2 月,这个和其他基于 focus() 的答案都不再适用于 Chrome。唯一可行的解​​决方案是@noamtcohen(遗憾的是票数非常低)。
2021-03-29 22:21:35
就其value而言,这在 IE8 中似乎失败了。该窗口在打印对话框显示之前立即关闭。
2021-04-05 22:21:35

这是我想出来的,不知道为什么关闭前会有一点延迟。

 window.print();
 setTimeout(window.close, 0);
为了扩展这一点,〜似乎〜一旦打印窗口完全呈现(无论如何在macbook上的chrome中)超时就会暂停,并且在窗口关闭后计算剩余部分。
2021-03-15 22:21:35
你不需要 0,它是默认的
2021-03-15 22:21:35
截至 3 月 17 日,这对我来说并不完全像在 Chrome (56) 中那样有效,但增加了一些超时时间。窗口。打印();setTimeout(window.close, 500);
2021-03-24 22:21:35
有趣的是,这个评分较低的答案目前是正确的。截至 2016 年 2 月,基于 focus() 的答案都不再适用于 Chrome。此解决方案适用于 Windows 和 OS X、IE9+、Android Chrome 和 IOS Safari 上的 FF、Chrome 和 Safari。我们只在旧 IE 中体验过确认对话框。所有其他无缝关闭。
2021-03-28 22:21:35
正如 jAC 所提到的,这需要更多时间才能发挥作用。在我的情况下,10 毫秒还不够,但 100 毫秒足够了。这似乎是渲染打印预览需要多长时间的问题。我的设置为 10 毫秒,它只打印页面的部分渲染版本。100我得到了整个事情。
2021-04-03 22:21:35

当然,通过这样做很容易解决这个问题:

      <script type="text/javascript">
         window.onafterprint = window.close;
         window.print();
      </script>

或者,如果您想做类似的事情,请转到上一页。

    <script type="text/javascript">
        window.print();
        window.onafterprint = back;

        function back() {
            window.history.back();
        }
    </script>
注:window.onafterprint = window.close();应该是window.onafterprint = window.close;前者分配结果window.close()onafterprint这将导致window.close()在设置处理程序时立即运行,而在onafterprint引发事件时不运行后者分配window.close为事件处理程序,这正是我们想要的。
2021-03-25 22:21:35
window.close();
2021-03-29 22:21:35
此外,在某些浏览器中,代码执行会window.print();在打印对话框关闭之前暂停发生这种情况时,有可能onafterprintonafterprint分配之前引发事件因此,这将是更好地为window.onafterprint = window.close;来之前window.print();否则,此答案中使用的方法比其他答案建议的基于 onfocus 或 setTimeout 的方法效果更好。
2021-03-31 22:21:35
注意:现在所有现代浏览器都支持此功能,请参阅developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/... 上的兼容性图表
2021-04-02 22:21:35

只是:

window.print();
window.close();

有用。

不要忘记:Scripts may close only the windows that were opened by it.警告。
2021-03-20 22:21:35
上述解决方案不再有效,请在afterprint添加事件侦听以关闭窗口。window.onafterprint = function(){ window.close()};
2021-03-20 22:21:35
这对我来说在 chrome 上不能可靠地工作。有时它有效,但有时窗口会在打印对话框出现之前立即关闭。我可以通过将超时增加到 5000 来防止这种情况发生,但有时在打印后窗口关闭最多需要 5 秒。我不确定这里发生了什么,但它似乎不太可能在不同的浏览器中保持稳健。
2021-03-27 22:21:35
如下所述,完整的跨浏览器解决方案更加复杂。
2021-04-07 22:21:35

我只想写下我所做的和对我有用的(因为我尝试过的其他方法都没有奏效)。

我遇到的问题是 IE 会在打印对话框出现之前关闭窗口。

经过大量的反复试验 og 测试后,这就是我的工作:

var w = window.open();
w.document.write($('#data').html()); //only part of the page to print, using jquery
w.document.close(); //this seems to be the thing doing the trick
w.focus();
w.print();
w.close();

这似乎适用于所有浏览器。

似乎工作。它不再存在,我将在下面发布我的代码。
2021-03-24 22:21:35