如何检测window.print()完成

Jav*_*ter 53 javascript jquery

在我的应用程序中,我尝试打印出用户的凭证页面,我用过:

  var htm ="<div>Voucher Details</div>";
  $('#divprint').html(htm);
  window.setTimeout('window.print()',2000);
Run Code Online (Sandbox Code Playgroud)

' divprint' div在我的页面中存储有关凭证的信息.

它工作正常,弹出打印页面.但是一旦用户点击' print'或' close'弹出窗口,我想进一步继续申请.

例如,我想在弹出窗口关闭后将用户重定向到另一个页面:

window.application.directtoantherpage();//a function which direct user to other page
Run Code Online (Sandbox Code Playgroud)

如何确定弹出打印窗口是关闭还是打印完成?

Ada*_*dam 89

在FireFox和Internet Explorer中,您可以侦听后期打印事件.

https://developer.mozilla.org/en-US/docs/Web/API/window.onafterprint

window.onafterprint = function(){
   console.log("Printing completed...");
}
Run Code Online (Sandbox Code Playgroud)

可以使用window.matchMedia在其他浏览器中获得此功能.

(function() {

    var beforePrint = function() {
        console.log('Functionality to run before printing.');
    };

    var afterPrint = function() {
        console.log('Functionality to run after printing');
    };

    if (window.matchMedia) {
        var mediaQueryList = window.matchMedia('print');
        mediaQueryList.addListener(function(mql) {
            if (mql.matches) {
                beforePrint();
            } else {
                afterPrint();
            }
        });
    }

    window.onbeforeprint = beforePrint;
    window.onafterprint = afterPrint;

}());
Run Code Online (Sandbox Code Playgroud)

资料来源:http://tjvantoll.com/2012/06/15/detecting-print-requests-with-javascript/

  • 在打印对话即将出现之前,IE 11 onafterprint会发生火灾(显然,没有打印) (8认同)
  • 无论用户是否确认打印,都会调用 onafterprint。如何判断用户是否确认打印? (4认同)
  • 请记住,媒体查询侦听器将立即触发 `afterPrint()`。它不会等到打印对话框关闭,这就是为什么我的答案在使用媒体查询解决方案时会侦听“鼠标悬停”... (3认同)
  • IE 7不会(无法等待它消失)。在打印对话框打开后立即启动“ onafterprint”。至少那是我的经验。 (2认同)
  • 在IE 11上存在matchMedia但侦听器从不触发 (2认同)

小智 53

在铬(V.35.0.1916.153米)试试这个:

function loadPrint() {
    window.print();
    setTimeout(function () { window.close(); }, 100);
}
Run Code Online (Sandbox Code Playgroud)

对我来说很棒.用户完成打印对话框后,它将关闭窗口.

  • 接受的答案适用于极少数浏览器.在打印后直接放置window.close会导致窗口在打印对话框之前消失.但是,使用setTimeout导致close在事件队列中排队,100ms超时实际上不是计时,计时器将被阻塞,直到打印对话框关闭,此时100ms计时器启动.一个更好的解决方案. (10认同)
  • 在Android上的Chrome v68之后,该功能不再起作用。您需要将超时时间延长到500毫秒,以显示打印对话框,然后,如果您更换打印机,则该窗口已经关闭,浏览器将无法刷新。 (3认同)
  • 优秀!适用于Firefox 51.0.1和Chrome 54.0.2840.90 (2认同)

小智 9

兼容chrome,firefox,opera,Internet Explorer
注意:需要jQuery.

<script>

    window.onafterprint = function(e){
        $(window).off('mousemove', window.onafterprint);
        console.log('Print Dialog Closed..');
    };

    window.print();

    setTimeout(function(){
        $(window).on('mousemove', window.onafterprint);
    }, 1);

</script>
Run Code Online (Sandbox Code Playgroud)

  • @JayDadhania 那是[不是拼写错误](https://api.jquery.com/one/)。 (4认同)
  • 此处略有错字,** $(window).one()**应该是** $(window).on()**。无论如何,很好的解决方案! (2认同)

Rah*_*mad 6

window.print 在 chrome 上同步运行。在你的控制台中尝试一下

window.print();
console.log("printed");
Run Code Online (Sandbox Code Playgroud)

除非用户关闭(取消/保存/打印)打印对话框,否则不会显示“已打印”。

这是关于这个问题的更详细的解释。

我不确定 IE 或 Firefox 稍后会检查并更新

  • 是的,这是 Chrome 中的一个错误,现已修复。在最新的 chrome 中这不起作用。感谢您的评论,我必须修复产品中的问题:) (4认同)