У меня открыта вкладка, когда пользователь нажимает кнопку. У onload
меня есть он вызывает диалоговое окно печати, но пользователь спросил меня, возможно ли, что после отправки на принтер для печати вкладка могла бы закрыться сама. Я не уверен, можно ли это сделать. Я пробовал использовать setTimeout();
, но это не определенный период времени, поскольку пользователь может отвлечься и ему придется снова открыть вкладку. Есть ли способ добиться этого?
javascript
printing
Цундоку
источник
источник
Ответы:
если вы попытаетесь закрыть окно сразу после вызова 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); }
источник
window.onload = function () { window.print(); setTimeout(window.close, 500); };
Это то, что я придумал, не знаю, почему до закрытия небольшая задержка.
window.print(); setTimeout(window.close, 0);
источник
Только:
window.print(); window.close();
Оно работает.
источник
Scripts may close only the windows that were opened by it.
предупреждение.window.onafterprint = function(){ window.close()};
Я просто хочу написать, что я сделал и что сработало для меня (поскольку все, что я пробовал, не сработало).
У меня была проблема, что 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();
Кажется, это работает во всех браузерах.
источник
Этот код отлично работал у меня:
<body onload="window.print()" onfocus="window.close()">
Когда страница открывается, автоматически открывается диалоговое окно печати, а после печати или отмены окно закрывается.
Надеюсь, это поможет,
источник
Конечно, это легко решить, сделав следующее:
<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.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, предложенные другими ответами.Это кроссбраузерное решение, уже протестированное в 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); } }
источник
Использование Chrome Я пытался некоторое время , чтобы получить
window.onfocus=function() { window.close(); }
и<body ... onfocus="window.close()">
работать. Мои результаты:Я также пробовал,
<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, я изменил свой код на него, и он работает.
источник
это работает для меня:
<script>window.onload= function () { window.print();window.close(); } </script>
источник
У меня сработало следующее:
function print_link(link) { var mywindow = window.open(link, 'title', 'height=500,width=500'); mywindow.onload = function() { mywindow.print(); mywindow.close(); } }
источник
Просто оберните window.close от OnAfterPrint обработчика событий, он работал для меня
printWindow.print(); printWindow.onafterprint = () => printWindow.close();
источник
Это хорошо работает в Chrome 59:
window.print(); window.onmousemove = function() { window.close(); }
источник
Я пробовал много вещей, которые не работали. Единственное, что у меня сработало, это:
window.print(); window.onafterprint = function () { window.close(); }
проверено на хроме.
источник
Следующее решение работает для более новых версий 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');
источник
Распечатать и закрыть окно новой вкладки с помощью php и javascript одним нажатием кнопки
источник
Это сработало лучше всего для меня, вставив 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>';
источник
Вот что я делаю ....
Включить печать окна и его закрытие в зависимости от параметра запроса.
Требуется 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», и он будет напечатан и закроется.
источник
Для меня окончательным решением было сочетание нескольких ответов:
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();
источник
Это то, что сработало для меня (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>
источник
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.
источник
Это отлично работает для меня @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(); }"
источник
jquery:
$(document).ready(function(){ window.print(); setTimeout(function(){ window.close(); }, 3000); });
источник
IE был (есть?)
onbeforeprint
Иonafterprint
событие: вы могли бы подождать, но это будет работать только на IE (который может или не может быть в порядке).В качестве альтернативы вы можете попытаться подождать, пока фокус не вернется в окно из диалогового окна печати, и закрыть его. Amazon Web Services делает это в своих диалоговых окнах печати счетов-фактур: вы нажимаете кнопку печати, открывается удобный для печати вид и сразу же открывается диалоговое окно принтера. Если вы нажмете «Печать» или «Отмена», диалоговое окно печати закроется, а затем сразу же закроется удобный для печати вид.
источник
Очень сложно заставить такие вещи работать в разных браузерах.
Изначально я хотел сделать то же самое - открыть новую страницу, предназначенную для печати, распечатать ее с помощью 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>
источник
просто используйте этот 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(); }
он закроет окно после нажатия кнопки отправки или отмены
источник
В 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>
источник
У меня это сработало в 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);
источник
setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
У меня это отлично работает. Надеюсь, это поможет
источник
Это работает для меня в Chrome (не пробовал на других)
$(function(){ window.print(); $("body").hover(function(){ window.close(); }); });
источник
Я пробовал это, и это работает
var popupWin = window.open('', 'PrintWindow', 'width=650,height=650,location=no,left=200px'); popupWin.document.write(data[0].xmldata); popupWin.print(); popupWin.close();
источник