打印对话框closures后自动closures窗口
当用户点击一个button时,我有一个选项卡打开。 在onload
我有它onload
对话框,但用户问我是否有可能后,它发送到打印机打印,如果选项卡可以closures自己。 我不确定这是否可以做到。 我曾尝试使用setTimeout();
,但是由于用户可能会分心并且不得不重新打开标签,所以这不是一段定义的时间。 有什么办法可以做到这一点?
如果试图在print()调用之后closures窗口,可能会立即closures窗口,而print()将不起作用。 这是你不应该做的 :
window.open(); ... window.print(); window.close();
此解决scheme将在Firefox中工作,因为在print()调用中,它将等待打印完成,然后继续处理javascript并closures窗口。 IE会失败,因为它调用close()函数而不等待print()调用完成。 打印完成之前,popup窗口将被closures。
解决这个问题的一个方法是使用“onafterprint”事件,但是我不推荐给你,因为这些事件只能在IE中使用。
最好的方法是closures打印对话框后closurespopup窗口(打印完成或取消)。 此时,popup窗口将被聚焦,您可以使用“onfocus”事件来closurespopup窗口。
要做到这一点,只需在您的popup窗口中插入此JavaScriptembedded代码:
<script type="text/javascript"> window.print(); window.onfocus=function(){ window.close();} </script>
希望这hepls 😉
更新:
对于新的Chrome浏览器,它可能会很快closures, 请看这里 。 我已经实现了这个改变,它适用于所有当前的浏览器:2/29/16
setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
这是我想到的,我不知道为什么在closures之前有一个小的延迟。
window.print(); setTimeout(window.close, 0);
只是:
window.print(); window.close();
有用。
这段代码对我来说非常合适:
<body onload="window.print()" onfocus="window.close()">
当页面打开时,会自动打开打印对话框,并在打印后取消或closures窗口。
希望它有帮助,
我只想写我已经做了什么,为我工作了什么(因为我没有尝试过)。
我有问题,在打印对话框起来之前IE会closures窗口。
经过大量的试验和错误testing,这是我得到的工作:
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();
这似乎适用于所有浏览器。
使用Chrome我尝试了一段时间来获取window.onfocus=function() { window.close(); }
window.onfocus=function() { window.close(); }
和<body ... onfocus="window.close()">
工作。 我的结果:
- 我已经closures了我的印刷对话,什么也没发生。
- 我在浏览器中改变了窗口/标签,仍然没有。
- 改回到我的第一个窗口/选项卡,然后window.onfocus事件触发closures窗口。
我也尝试了<body onload="window.print(); window.close()" >
这个窗口closures之前,我甚至可以在打印对话框中点击任何东西。
我不能使用其中的任何一个。 所以我用一个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>
只要确保你已经包含jquery,然后复制/粘贴到你正在打印的HTML。 如果用户已经打印,保存为PDF或取消打印作业,窗口/选项卡将自动自毁。 注:我只testing了铬。
编辑
正如Jypsy在评论中指出的那样,文档焦点状态是不需要的。 你可以简单地使用noamtcohen的答案,我改变了我的代码,它的工作原理。
这是一个跨浏览器的解决scheme, 已于 2016/05年在Chrome,Firefox,Opera上testing。
请记住, Microsoft Edge有一个错误 ,如果打印被取消,将不会closures窗口。 相关链接
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); } }
这个为我工作:
<script>window.onload= function () { window.print();window.close(); } </script>
以下解决scheme适用于截至2014年3月10日的IE9,IE8,Chrome和FF较新版本。 情况是这样的:你在一个窗口(A),点击一个button/链接来启动打印过程,然后打开一个带有要打印内容的新窗口(B),立即显示打印对话框,您可以取消或打印,然后新窗口(B)自动closures。
下面的代码允许这个。 这个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); };
启动进程的button/链接只需调用此函数,如下所示:
openPrintWindow('http://www.google.com', 'windowTitle', 'width=820,height=600');
以下为我工作:
function print_link(link) { var mywindow = window.open(link, 'title', 'height=500,width=500'); mywindow.onload = function() { mywindow.print(); mywindow.close(); } }
这是我做的….
启用窗口根据查询参数进行打印和closures。
需要jQuery。 可以在_Layout或母版页完成所有页面的工作。
这个想法是在URL中传递一个参数告诉页面打印和closures,如果设置了参数,那么jQuery“ready”事件打印窗口,然后当页面完全加载(打印后)“onload”被称为closures窗口。 所有这些看似额外的步骤都是在closures之前等待窗口打印。
在调用printAndCloseOnLoad()的html body和onload事件中。 在这个例子中,我们使用的是cshtm,你也可以使用javascript来获取参数。
<body onload="sccPrintAndCloseOnLoad('@Request.QueryString["PrintAndClose"]');">
在javascript中添加函数。
function printAndCloseOnLoad(printAndClose) { if (printAndClose) { // close self without prompting window.open('', '_self', ''); window.close(); } }
和jQuery准备好的事件。
$(document).ready(function () { if (window.location.search.indexOf("PrintAndClose=") > 0) print(); });
现在,当打开任何URL时,只需附加查询string参数“PrintAndClose = true”,它将打印和closures。
IE已经(有?)的onbeforeprint
和onafterprint
事件:你可以等待,但它只能在IE浏览器(这可能会或可能不会)。
或者,您可以尝试等待焦点从打印对话框返回到窗口并closures它。 amazon web services在发票打印对话框中执行此操作:您点击打印button,打开易于打印的视图并立即打开打印机对话框。 如果您点击打印或取消打印对话框closures,则打印友好的视图立即closures。
有很多这样的东西在浏览器上工作。
我最初是想做同样的事情 – 打开一个新的页面打印样式,使用JS打印,然后再closures它。 这是一场噩梦。
最后,我select了简单的点击到可打印页面,然后使用下面的JS来启动一个打印,然后将自己redirect到完成后的位置(在这个例子中用PHP设置的variables)。
我已经在OSX和Windows上的Chrome和Firefox以及IE11-8上testing了这个function,它可以在所有的环境下工作(尽pipe如果你实际上没有安装打印机,IE8会冻结一下)。
快乐狩猎(打印)
<script type="text/javascript"> window.print(); //this triggers the print setTimeout("closePrintView()", 3000); //delay required for IE to realise what's going on window.onafterprint = closePrintView(); //this is the thing that makes it work i function closePrintView() { //this function simply runs something you want it to do document.location.href = "'.$referralurl.'"; //in this instance, I'm doing a re-direct } </script>
这对我来说是最好的注入到popup窗口,如<body onload="window.print()"...
上述工程适用于IE,Chrome和FF(在Mac上),但Windows上没有FF。
https://stackoverflow.com/a/11782214/1322092
var html = '<html><head><title></title>'+ '<link rel="stylesheet" href="css/mycss.css" type="text/css" />'+ '</head><body onload="window.focus(); window.print(); window.close()">'+ data+ '</body></html>';
只需使用这个Java脚本
function PrintDiv() { var divContents = document.getElementById("ReportDiv").innerHTML; var printWindow = window.open('', '', 'height=200,width=400'); printWindow.document.write('</head><body >'); printWindow.document.write(divContents); printWindow.document.write('</body></html>'); printWindow.document.close(); printWindow.print(); printWindow.close(); }
提交或取消button点击后会closures窗口
在IE11上,onfocus事件被调用两次,因此用户被提示两次closures窗口。 这可以通过稍微改变来防止:
<script type="text/javascript"> var isClosed = false; window.print(); window.onfocus = function() { if(isClosed) { // Work around IE11 calling window.close twice return; } window.close(); isClosed = true; } </script>
这在FF 36,Chrome 41和IE 11中对我很有效。即使您取消打印,即使您用右上方的“X”closures了打印对话框。
var newWindow=window.open(); newWindow.document.open(); newWindow.document.write('<HTML><BODY>Hi!</BODY></HTML>'); //add your content newWindow.document.close(); newWindow.print(); newWindow.onload = function(e){ newWindow.close(); }; //works in IE & FF but not chrome //adding script to new document below makes it work in chrome //but alone it sometimes failed in FF //using both methods together works in all 3 browsers var script = newWindow.document.createElement("script"); script.type = "text/javascript"; script.text = "window.close();"; newWindow.document.body.appendChild(script);
对我来说,我的最终解决scheme是几个答案的组合:
var newWindow = window.open(); newWindow.document.open(); newWindow.document.write('<html><link rel="stylesheet" href="css/normalize-3.0.2.css" type="text/css" />' + '<link rel="stylesheet" href="css/default.css" type="text/css" />' + '<link rel="stylesheet" media="print" href="css/print.css" type="text/css" />'); newWindow.document.write('<body onload="window.print();" onfocus="window.setTimeout(function() { window.close(); }, 100);">'); newWindow.document.write(document.getElementById(<ID>).innerHTML); newWindow.document.write('</body></html>'); newWindow.document.close(); newWindow.focus();
setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
这对我来说是完美的。 希望它有帮助
这在Chrome上适用于我(还没有尝试过其他)
$(function(){ window.print(); $("body").hover(function(){ window.close(); }); });
这在Chrome 59中运行良好:
window.print(); window.onmousemove = function() { window.close(); }
我试过这个,它的工作原理
var popupWin = window.open('', 'PrintWindow', 'width=650,height=650,location=no,left=200px'); popupWin.document.write(data[0].xmldata); popupWin.print(); popupWin.close();