Zamknij okno automatycznie po zamknięciu okna drukowania

86

Mam otwartą kartę, gdy użytkownik kliknie przycisk. Na ekranie onloadmam 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ąć?

Tsundoku
źródło

Odpowiedzi:

113

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); }
serfer2
źródło
Mimo wszystko wydaje się to nie działać w IE8. Okno zamyka się bezpośrednio przed wyświetleniem okna dialogowego drukowania.
Heath
15
w tym momencie wydaje się, że nie działa to w chrome, ponieważ chrome obsługuje drukowanie wewnętrznie, okno nie straci ostrości po załadowaniu okna dialogowego drukowania, a zatem nie odzyska ostrości po zakończeniu drukowania. Czy jest jakiś sposób, aby to działało w Chrome?
jlbriggs
6
Od lutego 2016 r. Ta i ŻADNA z pozostałych odpowiedzi opartych na funkcji focus () nie działają już w przeglądarce Chrome. Jedynym działającym rozwiązaniem jest @noamtcohen (niestety z bardzo niską liczbą głosów).
Jpsy,
2
Myślę, że najnowsza wersja przeglądarki Chrome nie wyświetla okna dialogowego drukowania, dopóki obrazy na stronie nie zostaną załadowane, ale wykonuje wcześniej zamknięcie, więc strona zamyka się przed załadowaniem (okno drukowania nigdy się nie wyświetla). Aby naprawićwindow.onload = function () { window.print(); setTimeout(window.close, 500); };
Brian Leishman
4
Powyższe rozwiązanie już nie działa, dodaj detektor zdarzeń po wydrukowaniu, aby zamknąć okno window.onafterprint = function () {window.close ()};
Rahat Hameed
91

Oto, co wymyśliłem, nie wiem, dlaczego jest małe opóźnienie przed zamknięciem.

 window.print();
 setTimeout(window.close, 0);
noamtcohen
źródło
1
Co ciekawe, ta nisko oceniana odpowiedź jest obecnie poprawna. Od lutego 2016 r. Żadna z odpowiedzi opartych na fokusie () nie działa już w przeglądarce Chrome. To rozwiązanie działa w FF, Chrome i Safari w systemie Windows i OS X, IE9 +, Android Chrome i IOS Safari. Dialogi potwierdzające występowały tylko w starych IE. Wszystkie inne zamykają się płynnie.
Jpsy,
6
Od 17 marca nie działało to dla mnie dokładnie tak, jak w Chrome (56), ale udało się dodać trochę czasu do czasu. window.print (); setTimeout (window.close, 500);
JAC
Jak wspomniał jAC, wymagało to więcej czasu, aby to zadziałało. U mnie 10 ms to za mało, ale 100 już. Wydaje się, że zależy to od tego, ile czasu zajmie renderowanie podglądu wydruku. Gdy mój jest ustawiony na 10 ms, wydrukował tylko częściowo wyrenderowaną wersję strony. Za 100 mam wszystko.
Jacob Ewing
1
Aby to rozwinąć, ~ wydaje się ~, że limit czasu jest wstrzymywany, gdy okno drukowania jest w pełni renderowane (i tak w chrome na Macbooku), a reszta jest liczona po zamknięciu okna.
Jacob Ewing
1
Nie potrzebujesz 0, to jest domyślne
Brian Leishman
14

Właśnie:

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

To działa.

Styl Ying
źródło
2
U mnie to nie działa niezawodnie na chrome. Czasami to działa, ale czasami okno po prostu zamyka się natychmiast, zanim pojawi się okno dialogowe drukowania. Mogę temu zapobiec, zwiększając limit czasu do 5000, ale czasami po wydrukowaniu okno zamyka się nawet po 5 sekundach. Nie jestem do końca pewien, co się tutaj dzieje, ale wydaje się, że nie jest to solidne w różnych przeglądarkach.
speedarius
1
Jak wspomniano poniżej, pełne rozwiązanie dla różnych przeglądarek jest bardziej skomplikowane.
Eric
1
Nie zapomnij o: Scripts may close only the windows that were opened by it.ostrzeżeniu.
Cas Bloem,
Powyższe rozwiązanie już nie działa, należy dodać detektor zdarzeń po wydrukowaniu, aby zamknąć okno. window.onafterprint = function(){ window.close()};
Rahat Hameed
12

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.

Holger
źródło
wydawało się działać. już nie działa, prześlę swój kod poniżej.
Remco
10

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,

Victor Olaru
źródło
ta dawka nie działa, jeśli otworzyłeś pdf do drukowania, a nie html lub jsp, gdzie mogę umieścić ciało na ładowanie?
shareef
9

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>
Samuel Bié
źródło
window.close ();
Mustafa
Uwaga: window.onafterprint = window.close();należy window.onafterprint = window.close;The byłych wyznacza wynik od window.close()do onafterprint. Spowoduje to window.close()uruchomienie natychmiast po ustawieniu programu obsługi i nic do uruchomienia, gdy onafterprintzdarzenie zostanie zgłoszone. Ten ostatni przypisuje window.closejako obsługę zdarzeń, a tego właśnie chcemy.
Kei
Ponadto w niektórych przeglądarkach wykonywanie kodu jest wstrzymywane window.print();do momentu zamknięcia okna dialogowego drukowania. W takim przypadku onafterprintzdarzenie może zostać wywołane przed onafterprintprzypisaniem. Dlatego byłoby lepiej, gdybyśmy byli window.onafterprint = window.close;wcześniej window.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.
Kei
8

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);
    }
}
Heroselohim
źródło
7

Używając Chrome, próbowałem przez jakiś czas, aby uruchomić window.onfocus=function() { window.close(); }i <body ... onfocus="window.close()"> . Moje wyniki:

  1. Zamknąłem okno dialogowe drukowania, nic się nie stało.
  2. Zmieniłem okno / zakładki w przeglądarce, nadal nic.
  3. zmieniłem z powrotem na moje pierwsze okno / kartę, a następnie zdarzenie window.onfocus wywołało zamknięcie okna.

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.

Nado11
źródło
To rozwiązanie powoduje zawieszenie się oryginalnego okna, jeśli użytkownik zamknie wyskakujące okienko ze znakiem „X” w rogu zamiast wybierania opcji Anuluj lub Drukuj. Ten sam problem, co rozwiązanie Juana, na które pierwotnie wskazał @JFK.
Clayton,
Powyższy javascript nie powinien być umieszczany w drukowanym html, niezależnie od tego, czy jest otwierany w wyskakującym okienku, czy, jak ja, w nowej karcie. Dlatego ten skrypt javascript nie ma wpływu na oryginalne okno.
Nado11
5

ten działa dla mnie:

<script>window.onload= function () { window.print();window.close();   }  </script>
arun.m
źródło
5

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(); }
}
Md Abu Sohib Hossain
źródło
5

Wystarczy owinąć window.close przez onafterprint obsługi zdarzeń, pracował dla mnie

printWindow.print();
printWindow.onafterprint = () => printWindow.close();
user10145303
źródło
Wymaga Safari v12
Paul Brady
4

Działa to dobrze w Chrome 59:

window.print();
window.onmousemove = function() {
  window.close();
}
maxhud
źródło
4

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.

Zeyad
źródło
Nienawidzę tego, jak bardzo to działa
Franz Justin Buenaventura
3

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');
Juan Manuel Perez
źródło
Działa w Chrome, o ile użytkownik drukuje lub anuluje operację, ALE jeśli użytkownik zamknie okno (B), okno (A) zawiesza się (czy powiedziałem w Chrome?). Przetestuj (w Chrome) jsfiddle.net/qy6QV/2/show i zamknij okno. Następnie spróbuj go ponownie załadować ... zawieszony.
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>

Wydrukuj i zamknij okno nowej karty za pomocą php i javascript za pomocą jednego kliknięcia przycisku

Abhinandan Budavi
źródło
1

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>';
user1322092
źródło
1

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.

RitchieD
źródło
1

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();
Felipe
źródło
1

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.onloadmusi nie być ustawiony wcześniej w.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>
Remco
źródło
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();
};

Oto moje rozwiązanie ES2016.

Stuart
źródło
1
Witaj Stuart i witaj w Stack Overflow! Czy mógłbyś wyjaśnić, dlaczego ten kod działa, aby bardziej pomóc OP i innym użytkownikom? Dzięki!
wrzos
1

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();
}"
Abubakar Ahmed Ruma
źródło
1

jQuery:

$(document).ready(function(){ 
  window.print();
  setTimeout(function(){ 
             window.close();
  }, 3000);
});
Armandof
źródło
0

IE miał (ma?) Zdarzenia onbeforeprinti onafterprint: 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.

Femi
źródło
0

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>
boboshady
źródło
0

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

user3373573
źródło
0

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>
Jakob Kofoed Janot
źródło
0

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);
James Bell
źródło
0
setTimeout(function () { window.print(); }, 500);
        window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }

U mnie działa idealnie. Mam nadzieję, że to pomoże

Klajdi Dosti
źródło
0

To działa dla mnie w Chrome (nie próbowałem na innych)

$(function(){
    window.print();
    $("body").hover(function(){
        window.close();
    });
});
emmmm
źródło
0

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();
user13548
źródło