如何检测window.print()完成

在我的应用程序中,我试图为用户打印一个优惠券页面,我使用:

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

' divprint '是我的页面上存储有关优惠券的信息。

它工作,并popup打印页面。 但是,一旦用户点击“ print ”或“ close ”popup窗口,我想进一步进行应用程序。

例如,我想在popup窗口closures后将用户redirect到另一个页面:

 window.application.directtoantherpage();//a function which direct user to other page 

如何确定popup的打印窗口是closures还是打印完成?

在FireFox和Internet Explorer中,您可以监听打印后事件。

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

 window.onafterprint = function(){ console.log("Printing completed..."); } 

有可能使用window.matchMedia在其他浏览器中获得这种function。

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

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

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

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

对我很好。 用户完成打印对话框后,将closures窗口。

兼容铬,火狐,歌剧,Internet Explorer
注意:需要jQuery。

 <script> window.onafterprint = function(e){ $(window).off('mousemove', window.onafterprint); console.log('Print Dialog Closed..'); }; window.print(); setTimeout(function(){ $(window).one('mousemove', window.onafterprint); }, 1); </script> 

请参阅https://stackoverflow.com/a/15662720/687315 。 作为一种解决方法,您可以在窗口(Firefox和IE)上侦听afterPrint事件,并在window.mediaMatch API指示之后侦听文档上的鼠标移动(表示用户已closures打印对话框并返回到页面)媒体不再匹配“打印”(Firefox和Chrome)。

请记住,用户可能或可能没有真正打印文档。 另外,如果您在Chrome中经常调用window.print() ,用户可能甚至不会被提示打印。

您可以简单地通过将window.print()放入另一个函数来检测window.print()是否完成

 //function to call if you want to print var onPrintFinished=function(printed){console.log("do something...");} //print command onPrintFinished(window.print()); 

在Firefox,Google chrome,IE中testing

在新的窗口中打印w = window.open(url,'_blank')并尝试w.focus(); w.close(); 并检测页面何时closures。 适用于所有浏览器。

 w = window.open(url, '_blank'); w.onunload = function(){ console.log('closed!'); } w.focus(); w.print(); w.close(); 

完成打印后窗口closures。

这实际上在铬中为我工作。 我很惊讶。

 jQuery(document).bind("keyup keydown", function(e){ if(e.ctrlKey && e.keyCode == 80){ Print(); e.preventDefault(); } }); 

凡打印是一个函数,我写了调用window.print(); 如果禁用Print(),它也可以作为一个纯粹的拦截器。

正如这里user3017502所述

window.print()会暂停,所以你可以像这样添加一个onPrintFinish或onPrintBegin

 function Print(){ onPrintBegin window.print(); onPrintFinish(); } 

经过testing的IE,FF,Chrome和所有工作。

  setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); } 

鉴于你希望等待打印对话框消失,我会在窗口上使用焦点绑定。

 print(); var handler = function(){ //unbind task(); $(window).unbind("focus",handler); } $(window).bind("focus",handler); 

通过在处理函数中放置解除绑定,我们可以防止焦点事件粘在窗口上。

在Chrome 41.0 ..我必须把这个

我在加载页面上自动打印:

 <body style="background-color:white;" onload="print_window();"> 

JS:

 function print_window(){ window.print(); setTimeout(function () { window.open('', '_self', ''); window.close(); }, 100); } 

它也适用于IE 10

我认为窗口焦点方法是正确的。 这里是一个例子,我想打开一个隐藏的iframe的PDFurlblob并打印出来。 打印或取消后,我想删除iframe。

 /** * printBlob will create if not exists an iframe to load * the pdf. Once the window is loaded, the PDF is printed. * It then creates a one-time event to remove the iframe from * the window. * @param {string} src Blob or any printable url. */ export const printBlob = (src) => { if (typeof window === 'undefined') { throw new Error('You cannot print url without defined window.'); } const iframeId = 'pdf-print-iframe'; let iframe = document.getElementById(iframeId); if (!iframe) { iframe = document.createElement('iframe'); iframe.setAttribute('id', iframeId); iframe.setAttribute('style', 'position:absolute;left:-9999px'); document.body.append(iframe); } iframe.setAttribute('src', src); iframe.addEventListener('load', () => { iframe.contentWindow.focus(); iframe.contentWindow.print(); const infanticide = () => { iframe.parentElement.removeChild(iframe); window.removeEventListener('focus', infanticide); } window.addEventListener('focus', infanticide); }); };