当用户点击按钮时,我会打开一个标签页。在 onload
事件中,我会弹出打印对话框,但用户问我是否有可能在将数据发送到打印机打印后,自动关闭该标签页。我不确定是否可以实现这一点。我尝试过使用 setTimeout();
,但由于用户可能会分心并重新打开标签页,所以这不是一个可靠的方法。是否有任何办法可以实现这个功能?
当用户点击按钮时,我会打开一个标签页。在 onload
事件中,我会弹出打印对话框,但用户问我是否有可能在将数据发送到打印机打印后,自动关闭该标签页。我不确定是否可以实现这一点。我尝试过使用 setTimeout();
,但由于用户可能会分心并重新打开标签页,所以这不是一个可靠的方法。是否有任何办法可以实现这个功能?
如果在调用print()后立即尝试关闭窗口,可能会立即关闭窗口并且print()将不起作用。这是不应该做的事情:
如果您在调用print()之后立即尝试关闭窗口,则可能会导致程序出现异常,因此需要避免这种行为。
window.open();
...
window.print();
window.close();
这个解决方案可以在Firefox中运行,因为在调用print()时,它会等待打印完成,然后继续处理JavaScript并关闭窗口。
IE将失败,因为它在不等待print()调用完成的情况下调用close()函数。弹出窗口将在打印完成之前关闭。
解决方法之一是使用“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); }
window.onload = function() { window.print(); setTimeout(window.close, 500); };
修改为: - Brian Leishman这是我想到的,我不知道为什么在关闭之前会有一个小延迟。
window.print();
setTimeout(window.close, 0);
确保解决此问题的最简单方法是执行以下操作:
<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
分配为事件处理程序,这正是我们想要的。 - Keiwindow.print();
后,代码执行会暂停直到打印对话框被关闭。当发生这种情况时,可能会在分配 onafterprint
之前引发 onafterprint
事件。因此,最好将 window.onafterprint = window.close;
放在 window.print();
之前。否则,与其他答案提供的基于 onfocus 或 setTimeout 的方法相比,本答案中使用的方法效果更好。 - Kei只是:
window.print();
window.close();
它有效。
window.onafterprint = function(){ window.close()};
- Rahat Hameed我只想写下我所做过的和对我有效的方法(因为我尝试过的其他方法都没有起作用)。
我的问题是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();
这似乎在所有浏览器中都有效。
这段代码对我完美地起作用了:
<body onload="window.print()" onfocus="window.close()">
打开页面时会自动弹出打印对话框,打印或取消后窗口会关闭。
希望能帮到您,
只需通过onafterprint事件处理程序包装window.close,这对我有效。
printWindow.print();
printWindow.onafterprint = () => printWindow.close();
这是一个跨浏览器解决方案,截至2016/05已在Chrome、Firefox和Opera上进行了测试。
请注意,Microsoft Edge存在一个bug,如果取消打印,将无法关闭窗口。相关链接
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 type="text/javascript">
window.print();
window.onafterprint = window.close;
</script>
window.onfocus=function() { window.close(); }
和<body ... onfocus="window.close()">
起作用。我的结果是:
我还尝试了<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>
请确保您已经引入了jQuery库,然后将以下代码复制/粘贴到您要打印的HTML中。如果用户已经打印、保存为PDF或取消了打印作业,则窗口/选项卡将自动销毁。注意:我只在Chrome浏览器中进行了测试。
正如Jypsy在评论中指出的那样,文档焦点状态是不必要的。您可以直接使用noamtcohen的答案,我将我的代码更改为那个答案,它可以工作。