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


86

用户单击按钮时,我会打开一个选项卡。在“onload我”上,它显示了“打印”对话框,但是用户问我,是否有可能在将选项卡关闭后将其发送到打印机进行打印。我不确定是否可以做到。我尝试使用setTimeout();,但是由于用户可能会分心并不得不重新打开该选项卡,因此未定义时间段。有什么办法可以做到这一点?


看到这个答案
2011年

Answers:


113

如果您尝试在调用print()之后立即关闭窗口,则可能会立即关闭该窗口,而print()将不起作用。这是您不应该做的

window.open();
...
window.print();
window.close();

此解决方案将在Firefox中运行,因为在调用print()时,它将等待直到完成打印,然后继续处理javascript并关闭窗口。IE将会失败,因为它调用了close()函数而没有等待print()调用完成。在完成打印之前,弹出窗口将关闭。

解决此问题的一种方法是使用“ onafterprint”事件,但我不建议您这样做,因为这些事件仅在IE中有效。

最好的方法是在关闭打印对话框(打印完成或取消)后关闭弹出窗口。此时,弹出窗口将处于焦点状态,您可以使用“ onfocus”事件关闭弹出窗口。

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

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

希望这个帮助;-)

更新:

对于新的Chrome浏览器,它可能仍然关闭得太早了,请参阅此处。我已经实现了此更改,它适用于所有当前浏览器:16/2/29 /

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

就其价值而言,这似乎在IE8中失败了。窗口将在显示打印对话框之前立即关闭。
Heath 2013年

15
这一点对于chrome似乎不起作用,因为chrome在内部处理打印,因此加载打印对话框时窗口不会失去焦点,因此在完成打印后不会重新获得焦点。有什么办法可以在Chrome浏览器上工作吗?
jlbriggs

6
截至2016年2月,此和其他基于focus()的答案都不再适用于Chrome。唯一有效的解决方案是@noamtcohen的解决方案(非常遗憾,投票数非常低)。
Jpsy '16

2
我认为最新版本的Chrome不会在页面上的图像加载之前显示打印对话框,但它会在关闭之前执行关闭操作,因此页面会在加载之前关闭(打印对话框永远不会显示)。要解决window.onload = function () { window.print(); setTimeout(window.close, 500); };
Brian Leishman

4
以上解决方案不再起作用,请添加事件监听器onafterprint以关闭窗口window.onafterprint = function(){window.close()};
拉哈特·哈米德

91

这就是我想出的,我不知道为什么在关闭之前会有一个小的延迟。

 window.print();
 setTimeout(window.close, 0);

1
有趣的是,目前这个低分的答案是正确的。截至2016年2月,所有基于focus()的答案都不再适用于Chrome。该解决方案可在Windows,OS X,IE9 +,Android Chrome和IOS Safari的FF,Chrome和Safari中使用。我们仅在旧版IE中遇到了确认对话框。所有其他无缝关闭。
Jpsy '16

6
截至3月17日,这对我来说并不完全像Chrome(56)中那样有效,但是增加了一些超时时间。window.print(); setTimeout(window.close,500);
jAC

正如jAC所说,这需要更多的时间才能起作用。在我看来,10ms是不够的,但是100ms就足够了。呈现打印预览需要多长时间左右。我的设置为10毫秒时,它仅打印页面的部分渲染版本。有了100,我就得到了整件事。
雅各布·尤因

1
为了对此进行扩展,它似乎就像在完全渲染打印窗口(无论如何在Macbook上为chrome)之后暂停超时,并在关闭窗口后计算剩余时间一样。
雅各布·尤因

1
您不需要0,它是默认值
Brian Leishman

14

只是:

window.print();
window.close();

有用。


2
这对我在chrome上无法正常工作。有时它可以工作,但有时窗口会在出现打印对话框之前立即关闭。我可以通过将超时时间增加到5000来防止这种情况的发生,但是有时在打印后关闭窗口最多可能需要5秒钟。我不确定在这里发生了什么,但是在不同的浏览器中似乎不太可靠。
speedarius

1
如下所述,完整的跨浏览器解决方案更加复杂。
埃里克

1
不要忘记:Scripts may close only the windows that were opened by it.警告。
卡布隆

上面的解决方案不再起作用,请在afterprint上添加事件侦听以关闭窗口。window.onafterprint = function(){ window.close()};
拉哈特·哈米德

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

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


似乎有效。它不再,我将在下面发布我的代码。
雷姆科

10

这段代码非常适合我:

<body onload="window.print()" onfocus="window.close()">

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

希望能帮助到你,


如果您已打开pdf而不打印html或jsp,则此剂量不起作用,那么我可能会将onload放在哪里?
shareef

9

确保这样做很容易解决:

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

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

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

        function back() {
            window.history.back();
        }
    </script>

window.close();
穆斯塔法

注:window.onafterprint = window.close();应该是window.onafterprint = window.close;前者分配结果window.close()onafterprint。这将导致window.close()在设置处理程序时立即运行,而在onafterprint引发事件时则无任何运行。后者将分配给window.close我们想要的事件处理程序。

同样,在某些浏览器中,代码执行在退出window.print();打印对话框后会暂停。发生这种情况时,有可能onafterprintonafterprint分配事件之前引发该事件。因此,最好还是先window.onafterprint = window.close;window.print();。否则,此答案中使用的方法要比其他答案建议的基于onfocus或setTimeout的方法更好。

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

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>

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

编辑

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


如果用户关闭转角处带有“ X”的弹出窗口,而不是选择“取消”或“打印”,此解决方案将导致原始窗口挂起。与Juan的解决方案(@JFK最初指出)的问题相同。
克莱顿

不管是在弹出窗口中打开还是在新标签页中打开,上述javascript均不应该放置在要打印的html中。因此,此javascript对原始窗口没有影响。
Nado11

5

这对我有用:

<script>window.onload= function () { window.print();window.close();   }  </script>

5

以下为我工作:

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

5

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

printWindow.print();
printWindow.onafterprint = () => printWindow.close();

需要Safari v12
Paul Brady

4

这在Chrome 59中效果很好:

window.print();
window.onmousemove = function() {
  window.close();
}


3

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

以下代码允许这样做。此javascript代码将放在窗口A(而不是窗口B)的html中:

/**
 * 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);
};

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

openPrintWindow('http://www.google.com', 'windowTitle', 'width=820,height=600');

只要用户关闭窗口(B),窗口(A)挂起(只要我在Chrome中说过?),只要用户打印或取消操作(但要取消),它就可以在Chrome中工作。测试(在Chrome中)jsfiddle.net/qy6QV/2/show并关闭窗口。然后尝试重新加载它...挂。
肯尼迪国际

2
<!doctype html>
<html>
<script>
 window.print();
 </script>
<?php   
date_default_timezone_set('Asia/Kolkata');
include 'db.php'; 
$tot=0; 
$id=$_GET['id'];
    $sqlinv="SELECT * FROM `sellform` WHERE `id`='$id' ";
    $resinv=mysqli_query($conn,$sqlinv);
    $rowinv=mysqli_fetch_array($resinv);
?>
        <table width="100%">
           <tr>
                <td style='text-align:center;font-sie:1px'>Veg/NonVeg</td>  
            </tr>
            <tr>
                <th style='text-align:center;font-sie:4px'><b>HARYALI<b></th>  
            </tr>   
            <tr>
                <td style='text-align:center;font-sie:1px'>Ac/NonAC</td>  
            </tr>
            <tr>
                <td style='text-align:center;font-sie:1px'>B S Yedurappa Marg,Near Junne Belgaon Naka,P B Road,Belgaum - 590003</td>  
            </tr>
        </table>
        <br>    
        <table width="100%">
           <tr>
                <td style='text-align:center;font-sie:1'>-----------------------------------------------</td>  
            </tr>
        </table>

        <table  width="100%" cellspacing='6' cellpadding='0'>

            <tr>
                <th style='text-align:center;font-sie:1px'>ITEM</th>
                <th style='text-align:center;font-sie:1px'>QTY</th>
                <th style='text-align:center;font-sie:1px'>RATE</th>
                <th style='text-align:center;font-sie:1px'>PRICE</th>
                <th style='text-align:center;font-sie:1px' >TOTAL</th>
            </tr>

            <?php
            $sqlitems="SELECT * FROM `sellitems` WHERE `invoice`='$rowinv[0]'";
            $resitems=mysqli_query($conn,$sqlitems);
            while($rowitems=mysqli_fetch_array($resitems)){
            $sqlitems1="SELECT iname FROM `itemmaster` where icode='$rowitems[2]'";
            $resitems1=mysqli_query($conn,$sqlitems1);
            $rowitems1=mysqli_fetch_array($resitems1);
            echo "<tr>
                <td style='text-align:center;font-sie:3px'  >$rowitems1[0]</td>
                <td style='text-align:center;font-sie:3px' >$rowitems[5]</td>
                <td style='text-align:center;font-sie:3px' >".number_format($rowitems[4],2)."</td>
                <td style='text-align:center;font-sie:3px' >".number_format($rowitems[6],2)."</td>
                <td style='text-align:center;font-sie:3px' >".number_format($rowitems[7],2)."</td>
              </tr>";
                $tot=$tot+$rowitems[7];
            }

            echo "<tr>
                <th style='text-align:right;font-sie:1px' colspan='4'>GRAND TOTAL</th>
                <th style='text-align:center;font-sie:1px' >".number_format($tot,2)."</th>
                </tr>";
            ?>
        </table>
     <table width="100%">
           <tr>
                <td style='text-align:center;font-sie:1px'>-----------------------------------------------</td>  
            </tr>
        </table>
        <br>
        <table width="100%">
            <tr>
                <th style='text-align:center;font-sie:1px'>Thank you Visit Again</th>  
            </tr>
        </table>
<script>
window.close();
</script>
</html>

单击并使用php和javascript打印并关闭新的选项卡窗口


1

这对将HTML注入到弹出窗口中<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>';

1

这是我的工作...

启用窗口以根据查询参数进行打印并自行关闭。

需要jQuery。可以在_Layout或母版页中完成以处理所有页面。

想法是在URL中传递一个参数,告诉页面打印并关闭,如果设置了参数,则jQuery“ ready”事件将打印窗口,然后在页面完全加载(打印后)时“ onload”被称为关闭窗口。所有这些看似多余的步骤都是在关闭窗口之前等待窗口打印。

在html主体中,添加和加载事件调用printAndCloseOnLoad()。在此示例中,我们使用cshtm,也可以使用javascript获取参数。

<body onload="sccPrintAndCloseOnLoad('@Request.QueryString["PrintAndClose"]');">

在javascript中添加函数。

function printAndCloseOnLoad(printAndClose) {
    if (printAndClose) {
        // close self without prompting
        window.open('', '_self', ''); window.close();
    }
}

和jQuery ready事件。

$(document).ready(function () {
    if (window.location.search.indexOf("PrintAndClose=") > 0)
        print();
});

现在,打开任何URL时,只需附加查询字符串参数“ PrintAndClose = true”,它将打印并关闭。


1

对我来说,我的最终解决方案是以下几种答案的组合:

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

1

这就是对我有用的(2018/02)。我需要一个单独的请求,因为我的打印尚未显示在屏幕上。基于以上一些出色的回应,我感谢大家,我注意到:

  • w.onload必须前设置w.document.write(data)
    似乎很奇怪,因为您想预先设置钩子。我的猜测:当打开没有内容的窗口时,挂钩已经被触发。由于已被触发,因此不会再次触发。但是,如果仍在进行新document.write()的处理,则在处理完成后将调用该挂钩。
  • w.document.close()仍然是必需的。否则什么也不会发生。

我已经在Chrome 64.0,IE11(11.248),Edge 41.16299(edgeHTML 16.16299),FF 58.0.1中对此进行了测试。他们会抱怨弹出窗口,但会打印出来。

function on_request_print() {
  $.get('/some/page.html')
    .done(function(data) {
      console.log('data ready ' + data.length);
      var w = window.open();
      w.document.write(data);
      w.onload = function() {
        console.log('on.load fired')
        w.focus();
        w.print();
        w.close();
      }
      console.log('written data')
      //this seems to be the thing doing the trick
      w.document.close();
      console.log('document closed')
    })
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
<a onclick="on_request_print();">Print rapportage</a>

1
const printHtml = async (html) => {
    const printable = window.open('', '_blank', 'fullscreen=no');
    printable.document.open();
    printable.document.write(`<html><body onload="window.print()">${html}</body></html>`);
    await printable.print();
    printable.close();
};

这是我的ES2016解决方案。


1
您好Stuart,欢迎来到Stack Overflow!您能否解释一下为什么此代码可以有效帮助OP和其他用户?谢谢!
石南花

1

这对我来说非常完美,@ holger,但是,我已经对其进行了修改并使其更适合我,现在弹出窗口并单击打印或取消按钮立即关闭。

function printcontent()
{ 
var disp_setting="toolbar=yes,location=no,directories=yes,menubar=yes,"; 
disp_setting+="scrollbars=yes,width=300, height=350, left=50, top=25"; 
var content_vlue = document.getElementById("content").innerHTML; 
var w = window.open("","", disp_setting);
w.document.write(content_vlue); //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();
}"

1

jQuery的:

$(document).ready(function(){ 
  window.print();
  setTimeout(function(){ 
             window.close();
  }, 3000);
});

0

IE浏览器有(有?)在onbeforeprintonafterprint事件:你可以等待,但它只能在IE工作(这可能会或可能不会确定)。

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


0

使这样的东西跨浏览器工作非常痛苦。

我本来希望做同样的事情-打开一个样式为打印的新页面,使用JS打印,然后再次关闭。这是一场噩梦。

最后,我选择了简单地单击到可打印页面,然后使用下面的JS来启动打印,然后将自己重定向到完成后想要去的地方(在这种情况下,在PHP中设置了变量)。

我已经在OSX和Windows的Chrome和Firefox以及IE11-8上对它进行了测试,并且可以在所有设备上使用(尽管如果您实际上没有安装打印机,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>

0

只需使用此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();
}

单击提交或取消按钮后,它将关闭窗口


0

在IE11上,两次调用onfocus事件,因此两次提示用户关闭窗口。可以通过稍作更改来防止这种情况:

<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>

0

在FF 36,Chrome 41和IE 11中,这对我有用。即使您取消了打印,甚至用右上角的“ X”关闭了打印对话框。

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

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

这对我来说是完美的工作。希望能帮助到你


0

这在Chrome上对我有效(尚未尝试其他功能)

$(function(){
    window.print();
    $("body").hover(function(){
        window.close();
    });
});

0

我尝试了这个并且有效

var popupWin = window.open('', 'PrintWindow', 
'width=650,height=650,location=no,left=200px');
popupWin.document.write(data[0].xmldata);
popupWin.print();
popupWin.close();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.