Закрити вікно автоматично після закриття діалогового вікна друку


86

У мене відкрита вкладка, коли користувач натискає кнопку. На панелі " onloadЯ маю" відкрити діалогове вікно друку, але користувач запитав мене, чи можливо, що після надсилання на принтер для друку, якщо вкладка може закритися сама. Я не впевнений, чи можна це зробити. Я намагався використовувати setTimeout();, але це не визначений проміжок часу, оскільки користувач може відволіктися і йому доведеться відкрити вкладку знову. Чи є спосіб досягти цього?



Відповіді:


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>

Сподіваюся, це геплс ;-)

Оновлення:

Для нових хромованих браузерів може все ще близько занадто скоро побачити тут . Я застосував цю зміну, і вона працює для всіх поточних браузерів: 2/29/16

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

Для чого це варте, це здається невдалим у IE8. Вікно закривається безпосередньо перед тим, як з’явиться діалогове вікно друку.
— Heath

15
на даний момент це не працює для хрому, оскільки хром обробляє внутрішній друк, вікно не втратить фокус при завантаженні діалогового вікна друку, а тому не поверне фокус після завершення друку. Будь-який спосіб зробити так, щоб це працювало для Chrome?
— jlbriggs

6
Станом на лютий 2016 року ця та НІЯКА відповідь на інші фокуси () вже не працює в Chrome. Єдиним діючим рішенням є рішення @noamtcohen (на жаль, з дуже низьким підрахунком голосів).
— Jpsy

2
Я думаю, що остання версія Chrome не відображає діалогове вікно друку, поки зображення на сторінці не завантажуються, але виконується закриття раніше, тому сторінка закривається до завантаження (діалогове вікно друку ніколи не відображається). Виправитиwindow.onload = function () { window.print(); setTimeout(window.close, 500); };
— Брайан Лейшман

3
Вищевказане рішення більше не працює, будь ласка, додайте прослуховувач подій 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.03.17

Як згадував jAC, для його роботи потрібно було більше часу. На моєму 10 мс було недостатньо, але 100 було. Здається, що справа в тому, скільки часу потрібно, щоб відтворити попередній перегляд. Коли моє значення встановлено на 10 мс, воно надрукувало лише частково відтворену версію сторінки. Зі 100 я отримав цілу справу.
— Джейкоб Юінг,

1
Щоб розширити це, ~ здається ~, як час очікування призупинено, як тільки вікно друку буде повністю відтворено (у будь-якому випадку у chrome на macbook), а решта враховується після закриття вікна.
— Jacob Ewing

1
Вам не потрібно 0, це за замовчуванням
— Brian Leishman

14

Просто:

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

Це працює.


2
Для мене це не працює надійно на хромі. Іноді це спрацьовує, але іноді вікно просто негайно закривається до появи діалогового вікна друку. Я можу запобігти цьому, збільшивши час очікування до 5000, але тоді іноді потрібно близько 5 секунд, щоб вікно закрилося після друку. Я не зовсім впевнений, що тут відбувається, але це, мабуть, не буде надійним у різних браузерах.
— speedarius

1
Як уже згадувалося нижче, повне рішення для різних браузерів є більш складним.
— Ерік

1
Не забувайте: Scripts may close only the windows that were opened by it.попередження.
— Cas Bloem

Вищевказане рішення більше не працює, будь ласка, додайте прослуховувач подій після друку, щоб закрити вікно. 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 body?
— 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, я змінив свій код на це, і він працює.


Це рішення призводить до зависання оригінального вікна, якщо користувач закриває спливаюче вікно знаком "X" у куті, а не вибирає Скасувати або Друкувати. Те саме питання, що і рішення Хуана, на яке спочатку вказував @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

Просто оберніть window.close за допомогою обробника подій після друку, це спрацювало для мене

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

Потрібно Safari v12
— Пол Брейді



3

Наступне рішення працює для нових версій IE9, IE8, Chrome та FF станом на 10.03.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>';

1

Ось що я роблю ....

Увімкнути друк та закриття вікна на основі параметра запиту.

Потрібен jQuery. Можна зробити в _Layout або майстер-сторінці для роботи з усіма сторінками.

Ідея полягає в тому, щоб передати параметр в URL-адресі, який повідомляє сторінці друк і закриття, якщо параметр встановлений, тоді подія jQuery “готовий” друкує вікно, а потім, коли сторінка повністю завантажена (після друку), “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 готовий захід.

$(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
Привіт Стюарт, і ласкаво просимо до Stack Overflow! Не могли б ви пояснити, чому цей код допомагає операційній програмі та іншим користувачам більше? Дякую!
— вереск

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


0

IE мав (має?) onbeforeprintІonafterprint Події : ви могли дочекатися цього, але це спрацювало б лише на IE (що може і не буде нормально).

Крім того, ви можете спробувати почекати, поки фокус повернеться до вікна з діалогового вікна друку та закриє його. Amazon Web Services робить це у своїх діалогових вікнах для друку рахунків-фактур: якщо натиснути кнопку друку, вона відкриє друкарський вигляд і негайно відкриє діалогове вікно принтера. Якщо натиснути "Друк" або "Скасувати", діалогове вікно друку закриється, а друкарський вигляд негайно закриється.


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

він закриє вікно після натискання кнопки подати або скасувати


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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.