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

86

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

Цундоку
источник

Ответы:

113

если вы попытаетесь закрыть окно сразу после вызова print (), оно может закрыть окно немедленно, и print () не будет работать. Вот чего не следует делать :

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

Это решение будет работать в Firefox, потому что при вызове print () оно ожидает завершения печати, а затем продолжает обработку javascript и close () окно. IE не справится с этим, потому что он вызывает функцию close (), не дожидаясь завершения вызова print (). Всплывающее окно будет закрыто до завершения печати.

Один из способов решить эту проблему - использовать событие onafterprint, но я не рекомендую его вам, потому что эти события работают только в IE.

Лучший способ - закрыть всплывающее окно после закрытия диалогового окна печати (печать выполнена или отменена). В этот момент всплывающее окно будет сфокусировано, и вы можете использовать событие «onfocus» для закрытия всплывающего окна.

Для этого просто вставьте этот встроенный код javascript во всплывающее окно:

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

Надеюсь, это здорово ;-)

Обновить:

Для новых браузеров Chrome он может закрываться слишком рано, см. Здесь . Я реализовал это изменение, и оно работает во всех текущих браузерах: 29.02.16

        setTimeout(function () { window.print(); }, 500);
        window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
serfer2
источник
Как бы то ни было, в IE8 это, похоже, не работает. Окно закрывается непосредственно перед отображением диалогового окна печати.
Хит
15
На данный момент это не работает для Chrome, поскольку Chrome обрабатывает печать изнутри, окно не теряет фокус при загрузке диалогового окна печати и, следовательно, не восстанавливает фокус после завершения печати. Любой способ заставить это работать для Chrome?
jlbriggs
6
По состоянию на февраль 2016 года этот и НИ ОДИН из других ответов на основе focus () больше не работают в Chrome. Единственное рабочее решение - это решение @noamtcohen (к сожалению, с очень низким количеством голосов).
Jpsy
2
Я думаю, что последняя версия Chrome не отображает диалоговое окно печати до тех пор, пока изображения на странице не загрузятся, но он выполняет закрытие раньше, поэтому страница закрывается перед загрузкой (диалоговое окно печати никогда не отображается). Чтобы исправитьwindow.onload = function () { window.print(); setTimeout(window.close, 500); };
Брайан Лейшман
4
Вышеупомянутое решение больше не работает, добавьте прослушиватель событий onafterprint, чтобы закрыть окно window.onafterprint = function () {window.close ()};
Рахат Хамид
91

Это то, что я придумал, не знаю, почему до закрытия небольшая задержка.

 window.print();
 setTimeout(window.close, 0);
Ноамткоэн
источник
1
Интересно, что этот заниженный ответ в настоящее время является правильным. По состоянию на февраль 2016 года ни один из ответов на основе focus () больше не работает в Chrome. Это решение работает в FF, Chrome и Safari в Windows и OS X, IE9 +, Android Chrome и IOS Safari. Мы видели диалоги подтверждения только в старых IE. Все остальные закрываются без проблем.
Jpsy
6
По состоянию на 17 марта это не сработало для меня точно так же, как в Chrome (56), но добавление некоторого времени к тайм-ауту сработало. window.print (); setTimeout (window.close, 500);
jAC 06
Как упоминалось в jAC, для этого требуется больше времени. По моему, 10мс было мало, а 100 было. Похоже, это вопрос того, сколько времени потребуется на визуализацию предварительного просмотра. Если у меня установлено значение 10 мс, он напечатал только частично обработанную версию страницы. С 100 у меня все получилось.
Джейкоб Юинг
1
Чтобы расширить это, ~ кажется ~, что тайм-аут приостанавливается после того, как окно печати полностью отрисовано (в любом случае, в Chrome на MacBook), а остаток считается после закрытия окна.
Джейкоб Юинг
1
Вам не нужен 0, это значение по умолчанию
Брайан Лейшман,
14

Только:

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

Оно работает.

Инь Стиль
источник
2
У меня это не работает надежно на хроме. Иногда это срабатывает, но иногда окно сразу же закрывается до появления диалогового окна печати. Я могу предотвратить это, увеличив тайм-аут до 5000, но иногда для закрытия окна после печати требуется до 5 секунд. Я не совсем уверен, что здесь происходит, но вряд ли это будет надежно в разных браузерах.
спидариус
1
Как упоминалось ниже, полное кроссбраузерное решение более сложное.
Эрик
1
Не забывайте: Scripts may close only the windows that were opened by it.предупреждение.
Cas Bloem
Вышеупомянутое решение больше не работает, добавьте прослушиватель событий onafterprint, чтобы закрыть окно. 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();

Кажется, это работает во всех браузерах.

Хольгер
источник
казалось, работает. этого больше нет, я отправлю свой код ниже.
Remco
10

Этот код отлично работал у меня:

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

Когда страница открывается, автоматически открывается диалоговое окно печати, а после печати или отмены окно закрывается.

Надеюсь, это поможет,

Виктор Олару
источник
эта доза не работает, если вы открыли pdf для печати, а не html или jsp, где тогда я могу поместить тело загрузки?
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();пока диалоговое окно печати не будет закрыто. Когда это происходит, onafterprintсобытие может возникнуть до того, как onafterprintбудет назначено. Таким образом, было бы лучше window.onafterprint = window.close;прийти раньше window.print();. В противном случае подход, используемый в этом ответе, работает лучше, чем подходы на основе onfocus или setTimeout, предложенные другими ответами.
Кей
8

Это кроссбраузерное решение, уже протестированное в Chrome, Firefox, Opera к 2016/05 году.

Имейте в виду, что в 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 или отменил задание печати, окно / вкладка автоматически самоуничтожится. Примечание: я тестировал это только в хроме.

редактировать

Как указала Джипси в комментариях, статус фокуса документа не нужен. Вы можете просто использовать ответ от noamtcohen, я изменил свой код на него, и он работает.

Надо11
источник
Это решение приводит к зависанию исходного окна, если пользователь закрывает всплывающее окно знаком «X» в углу, а не выбирает «Отмена» или «Печать». Та же проблема, что и решение Хуана, на которое изначально указал @JFK.
Clayton
Вышеупомянутый javascript не предназначен для размещения в печатаемом html независимо от того, открыт ли он во всплывающем окне или, как я, на новой вкладке. Таким образом, этот javascript не влияет на исходное окно.
Nado11
5

это работает для меня:

<script>window.onload= function () { window.print();window.close();   }  </script>
arun.m
источник
5

У меня сработало следующее:

function print_link(link) {
    var mywindow = window.open(link, 'title', 'height=500,width=500');   
    mywindow.onload = function() { mywindow.print(); mywindow.close(); }
}
Md Abu Sohib Hossain
источник
5

Просто оберните window.close от OnAfterPrint обработчика событий, он работал для меня

printWindow.print();
printWindow.onafterprint = () => printWindow.close();
user10145303
источник
Требуется Safari v12
Пол Брэди,
4

Это хорошо работает в Chrome 59:

window.print();
window.onmousemove = function() {
  window.close();
}
Максуд
источник
4

Я пробовал много вещей, которые не работали. Единственное, что у меня сработало, это:

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

проверено на хроме.

Зеяд
источник
Ненавижу, насколько это работает,
Франц Джастин Буэнавентура
3

Следующее решение работает для более новых версий IE9, IE8, Chrome и FF по состоянию на 10 марта 2014 г. Сценарий таков: вы находитесь в окне (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');
Хуан Мануэль Перес
источник
Он работает в Chrome до тех пор, пока пользователь печатает или отменяет операцию, НО, если пользователь закрывает окно (B), окно (A) зависает (я сказал в Chrome?). Протестируйте (в Chrome) jsfiddle.net/qy6QV/2/show и закройте окно. Потом попробуй перезагрузить ... завис.
JFK
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), но не FF в Windows.

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>';
user1322092
источник
1

Вот что я делаю ....

Включить печать окна и его закрытие в зависимости от параметра запроса.

Требуется jQuery. Может быть выполнено в _Layout или на главной странице для работы со всеми страницами.

Идея состоит в том, чтобы передать параметр в URL-адресе, сообщающий странице о печати и закрытии, если параметр установлен, то событие jQuery «готово» распечатывает окно, а затем, когда страница полностью загружена (после печати), «загрузка» вызывается, который закрывает окно. Все эти, казалось бы, лишние шаги заключаются в том, чтобы дождаться печати окна перед закрытием.

В теле html событие добавления и загрузки, которое вызывает printAndCloseOnLoad (). В этом примере мы используем cshtm, вы также можете использовать javascript для получения param.

<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-адреса просто добавьте параметр строки запроса «PrintAndClose = true», и он будет напечатан и закроется.

RitchieD
источник
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
Привет, Стюарт, и добро пожаловать в Stack Overflow! Не могли бы вы объяснить, почему этот код помогает ОП и другим пользователям больше? Благодарность!
heather
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 был (есть?) onbeforeprintИ onafterprintсобытие: вы могли бы подождать, но это будет работать только на IE (который может или не может быть в порядке).

В качестве альтернативы вы можете попытаться подождать, пока фокус не вернется в окно из диалогового окна печати, и закрыть его. Amazon Web Services делает это в своих диалоговых окнах печати счетов-фактур: вы нажимаете кнопку печати, открывается удобный для печати вид и сразу же открывается диалоговое окно принтера. Если вы нажмете «Печать» или «Отмена», диалоговое окно печати закроется, а затем сразу же закроется удобный для печати вид.

Femi
источник
0

Очень сложно заставить такие вещи работать в разных браузерах.

Изначально я хотел сделать то же самое - открыть новую страницу, предназначенную для печати, распечатать ее с помощью 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'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();
}

он закроет окно после нажатия кнопки отправки или отмены

user3373573
источник
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();
user13548
источник