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

Tsu*_*oku 77 javascript printing

当用户单击按钮时,我打开了一个标签.在onload我有它打开打印对话框,但用户问我是否有可能在它发送到打印机打印之后,如果标签可以自行关闭.我不确定是否可以这样做.我尝试过使用setTimeout();,但这不是一个定义的时间段,因为用户可能会分心,不得不重新打开选项卡.有没有办法实现这个目标?

ser*_*er2 107

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

window.open();
...
window.print();
window.close();
Run Code Online (Sandbox Code Playgroud)

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

解决这个问题的一种方法是使用"onafterprint"事件,但我不建议你这样做,因为这些事件只适用于IE.

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

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

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

希望这个肝脏;-)

更新:

对于新的Chrome浏览器,它可能仍然关闭太早在这里看到.我已实现此更改,它适用于所有当前浏览器:2/29/16

        setTimeout(function () { window.print(); }, 500);
        window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
Run Code Online (Sandbox Code Playgroud)

  • 此时这似乎不适用于chrome,因为chrome在内部处理打印,在打印对话框加载时窗口不会失去焦点,因此在打印完成后不会重新获得焦点.有什么方法可以让这个适用于Chrome? (15认同)
  • 上述解决方案不再适用,请添加事件监听**onafterprint**来关闭窗口 window.onafterprint = function(){ window.close()}; (7认同)
  • 截至2016年2月,这个和其他基于焦点()的答案中的任何一个都不再适用于Chrome.唯一可行的解​​决方案是@noamtcohen(遗憾的是投票数非常低). (6认同)
  • 今年是 2022 年,onafterprint 现在[所有主要浏览器都支持](https://caniuse.com/?search=onafterprint),并且是最简单的解决方案。 (3认同)
  • 我认为最新版的Chrome浏览器在页面上的图像加载之前不会显示打印对话框,但是它是在关闭之前执行关闭操作,因此页面在加载之前就关闭了(打印对话框永远不会显示)。要修复`window.onload = function(){window.print(); setTimeout(window.close,500); };` (2认同)

noa*_*hen 79

这就是我想出来的,我不知道为什么在关闭之前有一点延迟.

 window.print();
 setTimeout(window.close, 0);
Run Code Online (Sandbox Code Playgroud)

  • 截至3月17日,这对我来说并不像Chrome(56)那样有效,但是增加了一些时间来完成工作.window.print(); setTimeout(window.close,500); (6认同)
  • 扩展一下,一旦打印窗口完全渲染(无论如何在 MacBook 上的 Chrome 中),超时似乎就会暂停,并且在窗口关闭后计算剩余时间。 (2认同)

Sam*_*Bié 23

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

      <script type="text/javascript">
         window.onafterprint = window.close;
         window.print();
      </script>
Run Code Online (Sandbox Code Playgroud)

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

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

        function back() {
            window.history.back();
        }
    </script>
Run Code Online (Sandbox Code Playgroud)

  • 此外,在某些浏览器中,代码执行会在“window.print();”之后暂停,直到打印对话框消失。发生这种情况时,可能会在分配“onafterprint”之前引发“onafterprint”事件。因此,最好将 `window.onafterprint = window.close;` 放在 `window.print();` 之前。否则,此答案中使用的方法比其他答案建议的 onfocus 或基于 setTimeout 的方法效果更好。 (2认同)

Yin*_*yle 14

只是:

window.print();
window.close();
Run Code Online (Sandbox Code Playgroud)

有用.

  • 这对我来说在chrome上不可靠.有时它可以工作,但有时窗口会在打印对话框出现之前立即关闭.我可以通过将超时增加到5000来防止这种情况发生,但是打印后窗口关闭有时需要5秒钟.我不确定这里发生了什么,但它似乎不太适合不同的浏览器. (2认同)

Hol*_*ger 12

我只想写我已经做过的事情以及对我有用的事情(因为我尝试过的其他事情都没有).

我遇到的问题是IE会在打印对话框启动之前关闭窗口.

经过大量的试验和错误测试,这就是我的工作:

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();
Run Code Online (Sandbox Code Playgroud)

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


小智 10

这段代码非常适合我:

<body onload="window.print()" onfocus="window.close()">
Run Code Online (Sandbox Code Playgroud)

当页面打开时,它会自动打开打印对话框,打印或取消后会关闭窗口.

希望能帮助到你,

  • 这在IE中运行得很好,但Chrome没有.不管怎么说,还是要谢谢你 (4认同)

Her*_*him 8

这是一款在2016/05年度在Chrome,Firefox,Opera上测试过的跨浏览器解决方案.

请记住,Microsoft Edge有一个错误,如果打印被取消,它将无法关闭窗口.相关链接

var url = 'http://...';
var printWindow = window.open(url, '_blank');
printWindow.onload = function() {
    var isIE = /(MSIE|Trident\/|Edge\/)/i.test(navigator.userAgent);
    if (isIE) {

        printWindow.print();
        setTimeout(function () { printWindow.close(); }, 100);

    } else {

        setTimeout(function () {
            printWindow.print();
            var ival = setInterval(function() {
                printWindow.close();
                clearInterval(ival);
            }, 200);
        }, 500);
    }
}
Run Code Online (Sandbox Code Playgroud)


Rub*_*uíz 8

REF来源参考

<script type="text/javascript">
  window.print();
  window.onafterprint = window.close;   
</script>
Run Code Online (Sandbox Code Playgroud)


Nad*_*o11 7

使用Chrome我尝试了一段时间,以获得window.onfocus=function() { window.close(); }<body ... onfocus="window.close()"> 工作.我的结果:

  1. 我关闭了我的打印对话,没有任何反应.
  2. 我在浏览器中更改了窗口/标签,但仍然没有.
  3. 更改回我的第一个窗口/选项卡,然后关闭窗口触发window.onfocus事件.

我也尝试过<body onload="window.print(); window.close()" >,在我甚至可以点击打印对话框中的任何内容之前窗口关闭.

我无法使用其中任何一个.所以我使用了一个小Jquery来监视文档状态,这段代码对我有用.

<script type="text/javascript">
    var document_focus = false; // var we use to monitor document focused status.
    // Now our event handlers.
    $(document).focus(function() { document_focus = true; });
    $(document).ready(function() { window.print(); });
    setInterval(function() { if (document_focus === true) { window.close(); }  }, 500);
</script>
Run Code Online (Sandbox Code Playgroud)

只需确保包含jquery,然后将其复制/粘贴到您正在打印的html中.如果用户已打印,保存为PDF或取消了打印作业,则窗口/选项卡将自动自毁.注意:我只在chrome中测试过这个.

编辑

正如Jypsy在评论中指出的那样,不需要文档焦点状态.您可以简单地使用noamtcohen的答案,我将我的代码更改为该代码并且它可以正常工作.


小智 7

只需通过 onafterprint 事件处理程序包装window.close,它对我有用

printWindow.print();
printWindow.onafterprint = () => printWindow.close();
Run Code Online (Sandbox Code Playgroud)


小智 5

这个对我有用:

<script>window.onload= function () { window.print();window.close();   }  </script>
Run Code Online (Sandbox Code Playgroud)


Jua*_*rez 5

以下解决方案适用于截至 2014 年 3 月 10 日的 IE9、IE8、Chrome 和 FF 较新版本。场景是这样的:您在窗口(A)中,单击按钮/链接启动打印过程,然后打开一个包含要打印内容的新窗口(B),立即显示打印对话框,您可以取消或打印,然后新窗口 (B) 将自动关闭。

以下代码允许这样做。此 JavaScript 代码将放置在窗口 A 的 html 中(不适用于窗口 B):

/**
 * Opens a new window for the given URL, to print its contents. Then closes the window.
 */
function openPrintWindow(url, name, specs) {
  var printWindow = window.open(url, name, specs);
    var printAndClose = function() {
        if (printWindow.document.readyState == 'complete') {
            clearInterval(sched);
            printWindow.print();
            printWindow.close();
        }
    }
    var sched = setInterval(printAndClose, 200);
};
Run Code Online (Sandbox Code Playgroud)

启动进程的按钮/链接只需调用此函数,如下所示:

openPrintWindow('http://www.google.com', 'windowTitle', 'width=820,height=600');
Run Code Online (Sandbox Code Playgroud)


小智 5

以下为我工作:

function print_link(link) {
    var mywindow = window.open(link, 'title', 'height=500,width=500');   
    mywindow.onload = function() { mywindow.print(); mywindow.close(); }
}
Run Code Online (Sandbox Code Playgroud)


max*_*hud 5

这在 Chrome 59 中运行良好:

window.print();
window.onmousemove = function() {
  window.close();
}
Run Code Online (Sandbox Code Playgroud)


小智 5

这对我有用 11/2020 <body onafterprint="window.close()">... 简单。


Fem*_*emi 0

IE 有(有?)onbeforeprintonafterprint事件:你可以等待,但它只能在 IE 上运行(这可能会也可能不会)。

或者,您可以尝试等待焦点从打印对话框返回到窗口并将其关闭。Amazon Web Services 在其发票打印对话框中执行此操作:您点击打印按钮,它会打开打印友好的视图并立即打开打印机对话框。如果您点击打印或取消,打印对话框将关闭,然后打印友好的视图会立即关闭。