У меня есть открытая вкладка, когда пользователь нажимает кнопку. На onload у меня появилось диалоговое окно печати, но пользователь спросил, возможно ли после отправки принтеру на печать, если вкладка может закрыться. Я не уверен, что это можно сделать. Я попытался использовать setTimeout();, но это не определенный период времени, так как пользователь может отвлечься и снова открыть вкладку. Есть ли способ сделать это?
Закрыть окно автоматически после закрытия диалогового окна печати
Ответ 1
если вы попытаетесь закрыть окно сразу после вызова 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>
Надеюсь, что это hepls; -)
Обновление:
Для новых браузеров Chrome они могут скоро закрыться здесь. Я внедрил это изменение и работает для всех текущих браузеров: 2/29/16
        setTimeout(function () { window.print(); }, 500);
        window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
		Ответ 2
Это то, что я придумал, я не знаю, почему перед закрытием существует небольшая задержка.
 window.print();
 setTimeout(window.close, 0);
		Ответ 3
Просто:
window.print();
window.close();
Он работает.
Ответ 4
Я просто хочу написать то, что я сделал, и то, что сработало для меня (поскольку ничто другое, что я пробовал, не сработало).
У меня возникла проблема, что 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();
Это похоже на работу во всех браузерах.
Ответ 5
Этот код отлично работал у меня:
<body onload="window.print()" onfocus="window.close()">
При открытии страницы открывается диалоговое окно печати автоматически, а после печати или отмены оно закрывает окно.
Надеюсь, что это поможет,
Ответ 6
Используя Chrome, я некоторое время пытался получить window.onfocus=function() { window.close(); } и
<body ... onfocus="window.close()">
работать. Мои результаты:
- Я закрыл свой диалог печати, ничего не произошло.
 - Я изменил окно/вкладки в моем браузере, все еще ничего.
 - изменилось на мое первое окно/вкладку, а затем окно 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 или отменил задание на печать, окно/вкладка автоматически разрушится. Примечание. Я проверил это только в хроме.
Изменить
Как отметила Jypsy в комментариях, статус фокуса документа не нужен. Вы можете просто использовать ответ от noamtcohen, я изменил свой код на него, и он работает.
Ответ 7
Это кросс-браузерное решение уже протестировано в Chrome, Firefox, Opera к 2016 году.
Имейте в виду, что 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);
    }
}
		Ответ 8
Следующие работали для меня:
function print_link(link) {
    var mywindow = window.open(link, 'title', 'height=500,width=500');   
    mywindow.onload = function() { mywindow.print(); mywindow.close(); }
}
		Ответ 9
этот работает для меня:
<script>window.onload= function () { window.print();window.close();   }  </script>
		Ответ 10
Следующее решение работает для версий IE9, IE8, Chrome и FF с 2014-03-10. Сценарий таков: вы находитесь в окне (A), где вы нажимаете кнопку/ссылку для запуска процесса печати, затем открывается новое окно (B) с напечатанным содержимым, диалоговое окно печати отображается сразу, и вы можете отменить или распечатать, а затем новое окно (B) автоматически закрывается.
Этот код позволяет это сделать. Этот код javascript должен быть помещен в html для окна A (не для окна 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);
};
Кнопка/ссылка для запуска процесса должна просто вызвать эту функцию, как в:
openPrintWindow('http://www.google.com', 'windowTitle', 'width=820,height=600');
		Ответ 11
Это хорошо работает в Chrome 59:
window.print();
window.onmousemove = function() {
  window.close();
}
		Ответ 12
Это работало лучше всего, когда я вводил HTML в всплывающее окно, например <body onload="window.print()"...
Это работает для IE, Chrome и FF (на Mac), но без FF в Windows.
fooobar.com/questions/95626/...
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>';
		Ответ 13
Вот что я делаю....
Включить окно для печати и закрытия на основе параметра запроса.
Требуется jQuery. Может выполняться на странице _Layout или главной странице для работы со всеми страницами.
Идея состоит в том, чтобы передать URL-адрес URL-адреса, чтобы страница печатала и закрывала, если параметр задан, событие "готово" jQuery печатает окно, а затем, когда страница полностью загружена (после печати), "onload" вызывается, который закрывает окно. Все эти, казалось бы, дополнительные шаги - дождаться, пока окно будет напечатано, прежде чем закрыться.
В корпусе html add и onload, которое вызывает 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-адрес, просто добавьте строку запроса param "PrintAndClose = true", и она будет печататься и закрываться.
Ответ 14
Это то, что сработало для меня (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>
		Ответ 15
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.
Ответ 16
<!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 одним нажатием кнопки
Ответ 17
Конечно, это легко решается с помощью:
  <script type="text/javascript">
     window.print();
     window.onafterprint = window.close;
  </script>
		Ответ 18
В IE были (есть?) события onbeforeprint и onafterprint: вы можете дождаться этого, но он будет работать только в IE (что может быть или не быть нормально).
В качестве альтернативы вы можете попробовать и дождаться возврата фокуса в окно из диалогового окна печати и закрыть его. Amazon Web Services делает это в своих диалоговых окнах печати факсов: вы нажимаете кнопку печати, открываете доступный для печати вид и сразу же открываете диалоговое окно принтера. Если вы нажмете печать или отмените диалог печати, закройте окно, а затем откроется удобный для печати вид.
Ответ 19
Там много боли, чтобы работать в разных браузерах.
Я изначально хотел сделать то же самое - откройте новую страницу, предназначенную для печати, напечатайте ее с помощью JS, затем закройте ее снова. Это был кошмар.
В конце концов, я решил просто перейти на страницу для печати, а затем использовать приведенную ниже JS для начала печати, а затем перенаправить себя туда, куда я хотел пойти, когда закончите (с переменным, установленным в PHP в этом случае).
Я тестировал это через Chrome и Firefox на OSX и Windows и IE11-8, и он работает на всех (хотя IE8 немного замерзнет, если на самом деле у вас не установлен принтер).
Счастливая охота (печать).
<script type="text/javascript">
   window.print(); //this triggers the print
   setTimeout("closePrintView()", 3000); //delay required for IE to realise what 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>
		Ответ 20
просто используйте этот java script
 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();
}
он закроет окно после отправки или отмена кнопки
Ответ 21
В 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>
		Ответ 22
Это работало для меня в 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);
		Ответ 23
Для меня мое окончательное решение было сочетанием нескольких ответов:
    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();
		Ответ 24
setTimeout(function () { window.print(); }, 500);
        window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
Он отлично работает для меня. Надеюсь, что это поможет.
Ответ 25
Это работает для меня в Chrome (не пробовали другие)
$(function(){
    window.print();
    $("body").hover(function(){
        window.close();
    });
});
		Ответ 26
Я пробовал это, и он работает
var popupWin = window.open('', 'PrintWindow', 
'width=650,height=650,location=no,left=200px');
popupWin.document.write(data[0].xmldata);
popupWin.print();
popupWin.close();
		Ответ 27
Думаю, лучший способ - дождаться, когда документ (ака DOM) будет правильно загружен, а затем использовать функции печати и закрытия. Я обертываю его в функцию Document Ready (jQuery):
<script>
$(document).ready(function () {
window.print();
window.close();
});
</script>
 Стоит заметить, что приведенное выше помещено на мою "страницу для печати" (вы можете называть ее "printable.html", с которой я ссылаюсь на другой странице (назовите это linkpage.html, если хотите):
<script>
function openNewPrintWindow(){
var newWindow=window.open('http://printable.html'); //replace with your url
newWindow.focus(); //Sets focus window
}
</script>
 И для copy-paste-разработчика, который просто ищет решение, вот "триггер" функции выше (на той же странице):
<button onclick="openNewPrintWindow()">Print</button>
 Так что это будет
- Откройте новое окно, когда вы нажмете "Печать"
 - Запуск диалога печати (браузера) после загрузки страницы
 - Закрыть окно после печати (или отменено).
 
Надеюсь, вам весело!
Ответ 28
просто добавьте:
<html>
<body onload="print(); close();">
</body>
</html>
		Ответ 29
попробуй это:
var xxx = window.open("","Printing...");
xxx.onload = function () {
     setTimeout(function(){xxx.print();}, 500);
     xxx.onfocus = function () {
        xxx.close();
     }  
}
		Ответ 30
Это прекрасно работает для меня @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();
}"