it-swarm.com.de

Fenster automatisch schließen, nachdem der Druckdialog geschlossen wurde

Ich habe eine Registerkarte geöffnet, wenn der Benutzer auf eine Schaltfläche klickt. Auf der onload habe ich den Druckdialog geöffnet, aber der Benutzer hat mich gefragt, ob es möglich war, nach dem Senden an den Drucker zu drucken, ob sich die Registerkarte schließen lässt. Ich bin nicht sicher, ob dies möglich ist. Ich habe setTimeout(); ausprobiert, aber es ist keine definierte Zeit, da der Benutzer möglicherweise abgelenkt wird und die Registerkarte erneut öffnen muss. Gibt es eine Möglichkeit, dies zu erreichen?

66
Tsundoku

wenn Sie versuchen, das Fenster unmittelbar nach dem Aufruf von print () zu schließen, wird das Fenster möglicherweise sofort geschlossen, und print () funktioniert nicht. Dies ist, was Sie nicht tun sollten:

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

Diese Lösung funktioniert in Firefox, da beim Aufruf von print () gewartet wird, bis der Druckvorgang abgeschlossen ist. Anschließend wird die Verarbeitung von JavaScript fortgesetzt und das Fenster close () wird ..__ Das Warten auf den print () - Aufruf ist beendet. Das Popup-Fenster wird geschlossen, bevor der Druckvorgang abgeschlossen ist.

Eine Möglichkeit, dies zu lösen, ist die Verwendung des "onafterprint" -Ereignisses, aber ich empfehle es Ihnen nicht, da diese Ereignisse nur im IE funktionieren. 

Der beste Weg ist das Schließen des Popup-Fensters, sobald der Druckdialog geschlossen ist (der Druckvorgang wird beendet oder abgebrochen). In diesem Moment wird das Popup-Fenster fokussiert, und Sie können das Ereignis "onfocus" verwenden, um das Popup-Fenster zu schließen.

Fügen Sie dazu einfach den in JavaScript eingebetteten Code in Ihr Popup-Fenster ein:

<script type="text/javascript">
window.print();
window.onfocus=function(){ window.close();}
</script>

Hoffe das hepls ;-)

Update: 

Bei neuen Chrome-Browsern kann es noch zu früh schließen siehe hier . Ich habe diese Änderung implementiert und funktioniert für alle aktuellen Browser: 29.2.16

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

Das ist, was ich mir ausgedacht habe, ich weiß nicht, warum es eine kurze Verzögerung gibt, bevor es schließt.

 window.print();
 setTimeout(window.close, 0);
67
noamtcohen

Gerade:

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

Es klappt.

14
Ying Style

Ich möchte nur schreiben, was ich getan habe und was für mich funktioniert hat (da ich sonst nichts versucht hatte).

Ich hatte das Problem, dass IE die Fenster schließen würde, bevor der Druckdialog angezeigt wurde.

Nach einer ganzen Reihe von Versuchen und Irrtümern habe ich dazu gekommen:

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

Dies scheint in allen Browsern zu funktionieren.

11
Holger

Dieser Code hat für mich perfekt funktioniert:

<body onload="window.print()" onfocus="window.close()">

Wenn die Seite geöffnet wird, wird der Druckdialog automatisch geöffnet. Nach dem Drucken oder Abbrechen wird das Fenster geschlossen.

Ich hoffe es hilft,

10
Victor Olaru

Mit Chrome habe ich eine Weile versucht, die window.onfocus=function() { window.close(); } und die <body ... onfocus="window.close()"> Zum Laufen zu bringen. Meine Ergebnisse: 

  1. Ich hatte meinen Druckdialog geschlossen, es ist nichts passiert.
  2. Ich habe Fenster/Tabs in meinem Browser geändert, immer noch nichts.
  3. zurück zu meinem ersten Fenster/Tab gewechselt und dann wurde das window.onfocus-Ereignis ausgelöst, das das Fenster schloss.

Ich habe auch <body onload="window.print(); window.close()" > versucht, was dazu führte, dass das Fenster geschlossen wurde, bevor ich überhaupt etwas im Druckdialogfeld anklicken konnte. 

Ich konnte beides nicht verwenden ... Daher verwendete ich eine kleine Jquery, um den Dokumentstatus zu überwachen, und dieser Code funktioniert für mich.

<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>

Stellen Sie nur sicher, dass Sie Jquery hinzugefügt haben, und kopieren Sie diese in die HTML-Datei, die Sie gerade drucken. Wenn der Benutzer gedruckt, als PDF gespeichert oder den Druckauftrag abgebrochen hat, wird das Fenster/die Registerkarte automatisch zerstört. Hinweis: Ich habe dies nur in Chrom getestet.

Bearbeiten

Wie Jypsy in den Kommentaren darauf hingewiesen hat, ist kein Dokumentfokusstatus erforderlich. Sie können einfach die Antwort von noamtcohen verwenden, ich habe meinen Code geändert und es funktioniert.

7
Nado11

Dies ist eine Cross-Browser-Lösung bereits getestet auf Chrome, Firefox, Opera bis 2016/05.

Beachten Sie, dass Microsoft Edge hat einen Fehler das Fenster nicht schließt, wenn der Druck abgebrochen wurde. In Verbindung stehender 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);
    }
}
7
Heroselohim

Folgendes hat für mich gearbeitet:

function print_link(link) {
    var mywindow = window.open(link, 'title', 'height=500,width=500');   
    mywindow.onload = function() { mywindow.print(); mywindow.close(); }
}
4
Abu shoaib

Das funktioniert gut in Chrome 59:

window.print();
window.onmousemove = function() {
  window.close();
}
3
maxhud

Die folgende Lösung funktioniert für IE9, IE8, Chrome und FF, neuere Versionen vom 10. März 2014 .. Das Szenario ist das Folgende: Sie befinden sich in einem Fenster (A), in dem Sie auf eine Schaltfläche/einen Link klicken, um zu starten Nach dem Druckvorgang wird ein neues Fenster (B) mit dem zu druckenden Inhalt geöffnet, der Druckdialog wird sofort angezeigt und Sie können entweder abbrechen oder drucken und das neue Fenster (B) wird automatisch geschlossen.

Der folgende Code erlaubt dies. Dieser Javascript-Code wird für Fenster A in HTML eingefügt (nicht für Fenster 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);
};

Die Schaltfläche/Verknüpfung zum Starten des Prozesses muss einfach diese Funktion aufrufen, wie in:

openPrintWindow('http://www.google.com', 'windowTitle', 'width=820,height=600');
3

dieser arbeitet für mich:

<script>window.onload= function () { window.print();window.close();   }  </script>
3
arun.m

Dies funktionierte am besten für mich, indem ich HTML in das Popup einfügte, wie zum Beispiel <body onload="window.print()"... Das Obige funktioniert für IE, Chrome und FF (auf dem Mac), aber kein FF unter 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
user1322092

Hier ist was ich mache ....

Aktivieren Sie das Fenster zum Drucken und schließen Sie es selbst basierend auf einem Abfrageparameter.

Erfordert jQuery. Kann in _Layout oder Masterseite ausgeführt werden, um mit allen Seiten zu arbeiten.

Die Idee ist, einen Parameter in der URL zu übergeben, der die Seite zum Drucken und Schließen anweist. Wenn der Parameter eingestellt ist, wird das Fenster "jQuery" ready "gedruckt, und wenn die Seite vollständig geladen ist (nach dem Drucken), wird" onload " wird aufgerufen, was das Fenster schließt. Alle diese scheinbar zusätzlichen Schritte bestehen darin, auf das Fenster zu warten, bevor es sich schließt. 

Fügen Sie im html-body das Ereignis add und onload hinzu, das printAndCloseOnLoad () aufruft. In diesem Beispiel verwenden wir cshtm. Sie können auch javascript verwenden, um param zu erhalten.

<body onload="sccPrintAndCloseOnLoad('@Request.QueryString["PrintAndClose"]');">

Fügen Sie im Javascript die Funktion hinzu.

function printAndCloseOnLoad(printAndClose) {
    if (printAndClose) {
        // close self without prompting
        window.open('', '_self', ''); window.close();
    }
}

Und jQuery ready event.

$(document).ready(function () {
    if (window.location.search.indexOf("PrintAndClose=") > 0)
        print();
});

Wenn Sie nun eine beliebige URL öffnen, fügen Sie einfach den Abfrage-String param "PrintAndClose = true" an, und es wird gedruckt und geschlossen.

1
RitchieD
<!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>

Drucken und schließen Sie ein neues Tab-Fenster mit PHP und Javascript mit einem einzigen Klick

1

Das hat bei mir funktioniert (2018/02). Ich brauchte eine separate Anfrage, weil mein Druck noch nicht auf dem Bildschirm angezeigt wurde. Aufgrund einiger der hervorragenden Antworten, für die ich Ihnen allen danke, ist mir aufgefallen:

  • w.onload muss nicht vor w.document.write(data) eingestellt sein.
    Es scheint seltsam, weil Sie vorher den Haken setzen möchten. Meine Vermutung: Der Haken wird bereits beim Öffnen des Fensters ohne Inhalt ausgelöst. Da es abgefeuert wird, wird es nicht mehr feuern. Wenn jedoch die Verarbeitung mit einer neuen document.write() noch läuft, wird der Hook aufgerufen, wenn die Verarbeitung abgeschlossen ist. 
  • w.document.close() ist noch erforderlich. Sonst passiert nichts. 

Ich habe dies in Chrome 64.0, IE11 (11.248), Edge 41.16299 (EdgeHTML 16.16299), FF 58.0.1 getestet. .__ Sie beschweren sich über Popups, aber es wird gedruckt. 

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

Hier ist meine ES2016-Lösung.

1
Stuart

Für mich war meine Endlösung eine Mischung aus mehreren Antworten:

    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();
0
Felipe

Das funktioniert für mich auf Chrome (habe andere nicht probiert)

$(function(){
    window.print();
    $("body").hover(function(){
        window.close();
    });
});
0
emmmm

versuche dies:

var xxx = window.open("","Printing...");
xxx.onload = function () {
     setTimeout(function(){xxx.print();}, 500);
     xxx.onfocus = function () {
        xxx.close();
     }  
}
0
Sugeng Novianto

Es gibt viele Schmerzen, solche Sachen zu bekommen, die in Browsern funktionieren.

Ursprünglich wollte ich dasselbe tun: Öffnen Sie eine neue Seite für den Druck, drucken Sie sie mit JS und schließen Sie sie wieder. Das war ein Albtraum.

Am Ende habe ich mich dazu entschieden, einfach auf die druckbare Seite zu klicken und dann mit der folgenden JS einen Druckvorgang zu initiieren und mich dann dorthin umzuleiten, wo ich hin wollte, wenn ich fertig war (mit einer in PHP gesetzten Variablen in diesem) Beispiel).

Ich habe dies für Chrome und Firefox unter OSX und Windows sowie für IE11-8 getestet und funktioniert bei allen (obwohl IE8 ein wenig einfrieren wird, wenn Sie keinen Drucker installiert haben).

Glückliche Jagd (Drucken).

<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
boboshady

Dies funktionierte für mich in FF 36, Chrome 41 und IE 11. Auch wenn Sie den Druck abbrechen und auch wenn Sie den Druckdialog mit dem rechten oberen "X" geschlossen haben.

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
James Bell

Das funktioniert bei mir einwandfrei @holger, ich habe es jedoch modifiziert und mir besser angepasst, das Fenster öffnet sich nun und schließt sich, sobald Sie auf die Druck- oder Abbruchtaste klicken.

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 hatte (hat?) Die onbeforeprint- und onafterprint-Ereignisse: Sie könnten darauf warten, aber es würde nur mit IE funktionieren (was möglicherweise nicht in Ordnung ist).

Alternativ können Sie versuchen und warten, bis der Fokus vom Druckdialogfeld zum Fenster zurückkehrt und das Fenster schließt. Amazon Web Services führt dies in ihren Rechnungsdruckdialogen aus: Wenn Sie auf die Schaltfläche "Drucken" klicken, wird die druckfreundliche Ansicht und sofort der Druckerdialog geöffnet. Wenn Sie auf "Drucken" oder "Abbrechen" klicken, wird der Druckdialog geschlossen und die druckfreundliche Ansicht wird sofort geschlossen.

0
Femi

Bei IE11 wird das onfocus-Ereignis zweimal aufgerufen, sodass der Benutzer zweimal aufgefordert wird, das Fenster zu schließen. Dies kann durch eine geringfügige Änderung verhindert werden:

<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

Ich habe es versucht und es funktioniert

var popupWin = window.open('', 'PrintWindow', 
'width=650,height=650,location=no,left=200px');
popupWin.document.write(data[0].xmldata);
popupWin.print();
popupWin.close();
0
user13548

einfach hinzufügen:

<html>
<body onload="print(); close();">
</body>
</html>
0

Sicher ist das leicht zu lösen, indem Sie Folgendes tun:

  <script type="text/javascript">
     window.print();
     window.onafterprint = window.close;
  </script>
0
Samuel Bie

verwenden Sie einfach dieses Java-Skript

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

das Fenster wird geschlossen, nachdem Sie auf die Schaltfläche zum Senden oder Abbrechen geklickt haben

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

Es funktioniert perfekt für mich ... Ich hoffe es hilft

0
Klajdi Dosti

Ich denke, der beste Weg ist es warten Damit das Dokument (auch bekannt als DOM) ordnungsgemäß geladen wird, können Sie die Funktionen Drucken und Schließen verwenden. Ich wickle es in die Document Ready-Funktion (jQuery) ein:

<script>
$(document).ready(function () {
window.print();
window.close();
});
</script>

Bemerkenswert ist, dass das oben auf meiner "druckbaren Seite" steht (Sie können es anrufen "printable.html" dass ich von einer anderen Seite verlinke (rufen Sie es an linkpage.html falls Sie es wollen):

<script>
function openNewPrintWindow(){
var newWindow=window.open('http://printable.html'); //replace with your url
newWindow.focus(); //Sets focus window
}
</script>

Und für den Copy-Paste-Entwickler, der nur nach einer Lösung sucht, ist hier der "Auslöser" für die Funktion oben (gleiche Seite):

<button onclick="openNewPrintWindow()">Print</button>

So wird es sein

  1. Öffnen Sie ein neues Fenster, wenn Sie auf Drucken klicken
  2. Löst den (Browser-) Druckdialog nach dem Laden der Seite aus
  3. Fenster nach dem Drucken schließen (oder abbrechen).

Ich hoffe, du hast Spaß!

0
Rbbn