Mam otwartą kartę, gdy użytkownik kliknie przycisk. Na ekranie onload
mam wywołanie okna dialogowego drukowania, ale użytkownik zapytał mnie, czy jest możliwe, że po wysłaniu go do drukarki do drukowania, czy karta może się zamknąć. Nie jestem pewien, czy da się to zrobić. Próbowałem użyć setTimeout();
, ale nie jest to określony okres czasu, ponieważ użytkownik może się rozproszyć i będzie musiał ponownie otworzyć kartę. Czy jest jakiś sposób, aby to osiągnąć?
javascript
printing
Tsundoku
źródło
źródło
Odpowiedzi:
jeśli spróbujesz zamknąć okno zaraz po wywołaniu print (), może ono natychmiast zamknąć okno i print () nie zadziała. Tego nie powinieneś robić :
window.open(); ... window.print(); window.close();
To rozwiązanie zadziała w Firefoksie, ponieważ po wywołaniu print () czeka na zakończenie drukowania, a następnie kontynuuje przetwarzanie javascript i zamyka () okno. IE nie powiedzie się z tym, ponieważ wywołuje funkcję close () bez czekania na wykonanie wywołania print (). Wyskakujące okienko zostanie zamknięte przed zakończeniem drukowania.
Jednym ze sposobów rozwiązania tego problemu jest użycie zdarzenia „onafterprint”, ale nie polecam go, ponieważ te zdarzenia działają tylko w IE.
Najlepszym sposobem jest zamknięcie wyskakującego okienka po zamknięciu okna drukowania (zakończeniu lub anulowaniu drukowania). W tym momencie wyskakujące okienko będzie skoncentrowane i możesz użyć zdarzenia „onfocus” do zamknięcia wyskakującego okienka.
Aby to zrobić, po prostu wstaw ten osadzony kod javascript w wyskakującym okienku:
<script type="text/javascript"> window.print(); window.onfocus=function(){ window.close();} </script>
Mam nadzieję, że to działa ;-)
Aktualizacja:
W przypadku nowych przeglądarek Chrome może nadal zostać zamknięty zbyt wcześnie, zobacz tutaj . Zaimplementowałem tę zmianę i działa ona dla wszystkich obecnych przeglądarek: 29.02.2016
setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
źródło
window.onload = function () { window.print(); setTimeout(window.close, 500); };
Oto, co wymyśliłem, nie wiem, dlaczego jest małe opóźnienie przed zamknięciem.
window.print(); setTimeout(window.close, 0);
źródło
Właśnie:
window.print(); window.close();
To działa.
źródło
Scripts may close only the windows that were opened by it.
ostrzeżeniu.window.onafterprint = function(){ window.close()};
Chcę tylko napisać, co zrobiłem i co zadziałało (ponieważ nic innego, co próbowałem, nie zadziałało).
Miałem problem z tym, że IE zamykał okna, zanim pojawiło się okno dialogowe drukowania.
Po wielu próbach i błędach testów, oto co mam do pracy:
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();
Wydaje się, że działa to we wszystkich przeglądarkach.
źródło
Ten kod działał dla mnie idealnie:
<body onload="window.print()" onfocus="window.close()">
Po otwarciu strony automatycznie otwiera się okno dialogowe drukowania, a po wydrukowaniu lub anulowaniu zamyka okno.
Mam nadzieję, że to pomoże,
źródło
Jasne, że można to łatwo rozwiązać, wykonując następujące czynności:
<script type="text/javascript"> window.print(); window.onafterprint = window.close(); </script>
Lub jeśli chcesz coś zrobić, na przykład przejdź do poprzedniej strony.
<script type="text/javascript"> window.print(); window.onafterprint = back; function back() { window.history.back(); } </script>
źródło
window.onafterprint = window.close();
należywindow.onafterprint = window.close;
The byłych wyznacza wynik odwindow.close()
doonafterprint
. Spowoduje towindow.close()
uruchomienie natychmiast po ustawieniu programu obsługi i nic do uruchomienia, gdyonafterprint
zdarzenie zostanie zgłoszone. Ten ostatni przypisujewindow.close
jako obsługę zdarzeń, a tego właśnie chcemy.window.print();
do momentu zamknięcia okna dialogowego drukowania. W takim przypadkuonafterprint
zdarzenie może zostać wywołane przedonafterprint
przypisaniem. Dlatego byłoby lepiej, gdybyśmy byliwindow.onafterprint = window.close;
wcześniejwindow.print();
. W przeciwnym razie podejście użyte w tej odpowiedzi działa lepiej niż podejście oparte na onfocus lub setTimeout sugerowane w innych odpowiedziach.To rozwiązanie dla różnych przeglądarek zostało już przetestowane w Chrome, Firefox i Opera do 2016/05.
Pamiętaj, że Microsoft Edge ma błąd , który nie zamknie okna, jeśli drukowanie zostanie anulowane. Powiązany link
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); } }
źródło
Używając Chrome, próbowałem przez jakiś czas, aby uruchomić
window.onfocus=function() { window.close(); }
i<body ... onfocus="window.close()">
. Moje wyniki:Próbowałem też,
<body onload="window.print(); window.close()" >
co spowodowało zamknięcie okna, zanim mogłem cokolwiek kliknąć w oknie dialogowym drukowania.Nie mogłem użyć żadnego z nich. Więc użyłem małego Jquery do monitorowania statusu dokumentu i ten kod działa dla mnie.
<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>
Po prostu upewnij się, że dołączyłeś jquery, a następnie skopiuj / wklej go do pliku HTML, który drukujesz. Jeśli użytkownik wydrukował, zapisał jako plik PDF lub anulował zadanie drukowania, okno / karta automatycznie ulegnie zniszczeniu. Uwaga: przetestowałem to tylko w chrome.
Edytować
Jak zauważył Jypsy w komentarzach, status ostrości dokumentu nie jest potrzebny. Możesz po prostu użyć odpowiedzi z noamtcohen, zmieniłem swój kod na to i działa.
źródło
ten działa dla mnie:
<script>window.onload= function () { window.print();window.close(); } </script>
źródło
Pracowały dla mnie:
function print_link(link) { var mywindow = window.open(link, 'title', 'height=500,width=500'); mywindow.onload = function() { mywindow.print(); mywindow.close(); } }
źródło
Wystarczy owinąć window.close przez onafterprint obsługi zdarzeń, pracował dla mnie
printWindow.print(); printWindow.onafterprint = () => printWindow.close();
źródło
Działa to dobrze w Chrome 59:
window.print(); window.onmousemove = function() { window.close(); }
źródło
Próbowałem wielu rzeczy, które nie działały. Jedyne, co mi pomogło, to:
window.print(); window.onafterprint = function () { window.close(); }
testowany na chromie.
źródło
Poniższe rozwiązanie działa dla nowszych wersji IE9, IE8, Chrome i FF od 10.03.2014. Scenariusz jest taki: jesteś w oknie (A), w którym klikasz przycisk / link, aby uruchomić proces drukowania, następnie otwiera się nowe okno (B) z treścią do wydrukowania, okno dialogowe drukowania jest wyświetlane natychmiast, i możesz anulować lub wydrukować, a wtedy nowe okno (B) zamknie się automatycznie.
Poniższy kod na to pozwala. Ten kod javascript należy umieścić w html dla okna A (nie dla okna 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); };
Przycisk / link do uruchomienia procesu musi po prostu wywołać tę funkcję, jak w:
openPrintWindow('http://www.google.com', 'windowTitle', 'width=820,height=600');
źródło
Wydrukuj i zamknij okno nowej karty za pomocą php i javascript za pomocą jednego kliknięcia przycisku
źródło
To działało najlepiej dla mnie, wstrzykując HTML do wyskakującego okienka, takiego jak
<body onload="window.print()"...
Powyższe działa dla IE, Chrome i FF (na Macu), ale nie FF w 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>';
źródło
Oto, co robię ...
Włącz okno do drukowania i zamykania się na podstawie parametru zapytania.
Wymaga jQuery. Można to zrobić w _Layout lub stronie wzorcowej, aby pracować ze wszystkimi stronami.
Chodzi o to, aby przekazać w adresie URL parametr informujący stronę o wydrukowaniu i zamknięciu. Jeśli parametr jest ustawiony, to zdarzenie „ready” jQuery drukuje okno, a następnie, gdy strona jest w pełni załadowana (po wydrukowaniu), „onload” jest wywoływana, która zamyka okno. Wszystkie te pozornie dodatkowe kroki polegają na czekaniu na wydrukowanie okna przed jego zamknięciem.
W treści html zdarzenie add i onload, które wywołuje printAndCloseOnLoad (). W tym przykładzie używamy cshtm, możesz również użyć javascript, aby uzyskać param.
<body onload="sccPrintAndCloseOnLoad('@Request.QueryString["PrintAndClose"]');">
W javascript dodaj funkcję.
function printAndCloseOnLoad(printAndClose) { if (printAndClose) { // close self without prompting window.open('', '_self', ''); window.close(); } }
I zdarzenie gotowe do jQuery.
$(document).ready(function () { if (window.location.search.indexOf("PrintAndClose=") > 0) print(); });
Teraz podczas otwierania dowolnego adresu URL wystarczy dołączyć parametr ciągu zapytania „PrintAndClose = true”, a zostanie on wydrukowany i zamknięty.
źródło
Moim ostatecznym rozwiązaniem było dla mnie kilka odpowiedzi:
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();
źródło
To właśnie zadziałało dla mnie (2018/02). Potrzebowałem osobnej prośby, ponieważ mój wydruk jeszcze nie pojawił się na ekranie. Opierając się na kilku znakomitych odpowiedziach powyżej, za które wszystkim dziękuję, zauważyłem:
w.onload
musi nie być ustawiony wcześniejw.document.write(data)
.Wydaje się to dziwne, ponieważ chciałbyś wcześniej ustawić haczyk. Domyślam się: hak jest odpalany już przy otwieraniu okna bez zawartości. Odkąd jest wystrzelony, nie odpali ponownie. Ale jeśli nadal trwa przetwarzanie z nowym,
document.write()
to po zakończeniu przetwarzania zostanie wywołane podpięcie.w.document.close()
nadal jest wymagane. W przeciwnym razie nic się nie dzieje.Przetestowałem to w Chrome 64.0, IE11 (11.248), Edge 41.16299 (edgeHTML 16.16299), FF 58.0.1. Będą narzekać na wyskakujące okienka, ale to się drukuje.
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>
źródło
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(); };
Oto moje rozwiązanie ES2016.
źródło
To działa idealnie dla mnie @holger, jednak zmodyfikowałem go i lepiej mi pasuje, teraz okno wyskakuje i zamyka się natychmiast po naciśnięciu przycisku drukowania lub anulowania.
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(); }"
źródło
jQuery:
$(document).ready(function(){ window.print(); setTimeout(function(){ window.close(); }, 3000); });
źródło
IE miał (ma?) Zdarzenia
onbeforeprint
ionafterprint
: możesz na to poczekać, ale będzie działać tylko w IE (co może być w porządku lub nie).Alternatywnie możesz spróbować poczekać, aż fokus wróci do okna z okna dialogowego drukowania i je zamknąć. Amazon Web Services robi to w swoich oknach dialogowych drukowania faktur: po naciśnięciu przycisku drukowania otwiera się widok do drukowania i natychmiast otwiera się okno dialogowe drukarki. Jeśli naciśniesz drukuj lub anulujesz, okno dialogowe drukowania zamyka się, a następnie widok przyjazny do drukowania natychmiast się zamyka.
źródło
Jest wiele problemów, gdy takie rzeczy działają w różnych przeglądarkach.
Początkowo chciałem zrobić to samo - otworzyć nową stronę ze stylem do druku, wydrukować ją za pomocą JS, a następnie ponownie zamknąć. To był koszmar.
Ostatecznie zdecydowałem się po prostu przejść do strony do wydrukowania, a następnie użyć poniższego kodu JS, aby rozpocząć drukowanie, a następnie przekierować się do miejsca, w którym chciałem się udać (w tym przypadku ze zmienną ustawioną w PHP).
Przetestowałem to w Chrome i Firefox na OSX i Windows oraz IE11-8 i działa na wszystkich (chociaż IE8 zawiesi się na chwilę, jeśli w rzeczywistości nie masz zainstalowanej drukarki).
Udanego polowania (drukowanie).
<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>
źródło
po prostu użyj tego skryptu 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(); }
okno zamknie się po kliknięciu przycisku Prześlij lub Anuluj
źródło
W IE11 zdarzenie onfocus jest wywoływane dwukrotnie, więc użytkownik jest dwukrotnie proszony o zamknięcie okna. Można temu zapobiec poprzez niewielką zmianę:
<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>
źródło
To zadziałało dla mnie w FF 36, Chrome 41 i IE 11. Nawet jeśli anulujesz drukowanie i nawet jeśli zamknąłeś okno dialogowe drukowania za pomocą prawego górnego „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);
źródło
setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
U mnie działa idealnie. Mam nadzieję, że to pomoże
źródło
To działa dla mnie w Chrome (nie próbowałem na innych)
$(function(){ window.print(); $("body").hover(function(){ window.close(); }); });
źródło
Próbowałem tego i działa
var popupWin = window.open('', 'PrintWindow', 'width=650,height=650,location=no,left=200px'); popupWin.document.write(data[0].xmldata); popupWin.print(); popupWin.close();
źródło