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


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.