Подтвердить что ты не робот

Закрыть окно автоматически после закрытия диалогового окна печати

У меня есть открытая вкладка, когда пользователь нажимает кнопку. На onload у меня появилось диалоговое окно печати, но пользователь спросил, возможно ли после отправки принтеру на печать, если вкладка может закрыться. Я не уверен, что это можно сделать. Я попытался использовать setTimeout();, но это не определенный период времени, так как пользователь может отвлечься и снова открыть вкладку. Есть ли способ сделать это?

4b9b3361

Ответ 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>

Так что это будет

  1. Откройте новое окно, когда вы нажмете "Печать"
  2. Запуск диалога печати (браузера) после загрузки страницы
  3. Закрыть окно после печати (или отменено).

Надеюсь, вам весело!

Ответ 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();
}"