J'ai un onglet ouvert lorsque l'utilisateur clique sur un bouton. Sur le onload
je l'ai fait apparaître la boîte de dialogue d'impression, mais l'utilisateur m'a demandé s'il était possible qu'après l'envoi à l'imprimante pour imprimer, si l'onglet pouvait se fermer. Je ne sais pas si cela peut être fait. J'ai essayé d'utiliser setTimeout();
, mais ce n'est pas une période définie car l'utilisateur pourrait être distrait et devoir rouvrir l'onglet. Y a-t-il un moyen d'accomplir cela?
javascript
printing
Tsundoku
la source
la source
Réponses:
si vous essayez de fermer la fenêtre juste après l'appel de print (), cela peut fermer la fenêtre immédiatement et print () ne fonctionnera pas. Voici ce que vous ne devez pas faire :
window.open(); ... window.print(); window.close();
Cette solution fonctionnera dans Firefox, car à l'appel de print (), elle attend que l'impression soit terminée, puis continue de traiter javascript et ferme () la fenêtre. IE échouera avec cela car il appelle la fonction close () sans attendre que l'appel print () soit terminé. La fenêtre contextuelle se fermera avant la fin de l'impression.
Une façon de le résoudre est d'utiliser l'événement "onafterprint", mais je ne vous le recommande pas car ces événements ne fonctionnent que dans IE.
Le meilleur moyen est de fermer la fenêtre contextuelle une fois la boîte de dialogue d'impression fermée (l'impression est terminée ou annulée). A ce moment, la fenêtre popup sera focalisée et vous pourrez utiliser l'événement "onfocus" pour fermer la popup.
Pour ce faire, insérez simplement ce code javascript intégré dans votre fenêtre contextuelle:
<script type="text/javascript"> window.print(); window.onfocus=function(){ window.close();} </script>
J'espère que ça va ;-)
Mise à jour:
Pour les nouveaux navigateurs Chrome, il se peut qu'il se ferme encore trop tôt, voir ici . J'ai implémenté ce changement et cela fonctionne pour tous les navigateurs actuels: 29/02/16
setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
la source
window.onload = function () { window.print(); setTimeout(window.close, 500); };
C'est ce que j'ai proposé, je ne sais pas pourquoi il y a un petit retard avant la fermeture.
window.print(); setTimeout(window.close, 0);
la source
Juste:
window.print(); window.close();
Ça marche.
la source
Scripts may close only the windows that were opened by it.
avertissement.window.onafterprint = function(){ window.close()};
Je veux juste écrire ce que j'ai fait et ce qui a fonctionné pour moi (car rien d'autre que j'ai essayé n'avait fonctionné).
J'ai eu le problème qu'IE fermait les fenêtres avant que la boîte de dialogue d'impression ne se lève.
Après de nombreux essais et erreurs, voici ce que je me suis mis au travail:
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();
Cela semble fonctionner dans tous les navigateurs.
la source
Ce code a parfaitement fonctionné pour moi:
<body onload="window.print()" onfocus="window.close()">
Lorsque la page s'ouvre, elle ouvre automatiquement la boîte de dialogue d'impression et après l'impression ou l'annulation, elle ferme la fenêtre.
J'espère que cela aide,
la source
Bien sûr, cela est facilement résolu en faisant ceci:
<script type="text/javascript"> window.print(); window.onafterprint = window.close(); </script>
Ou si vous voulez faire quelque chose comme par exemple, allez à la page précédente.
<script type="text/javascript"> window.print(); window.onafterprint = back; function back() { window.history.back(); } </script>
la source
window.onafterprint = window.close();
devrait êtrewindow.onafterprint = window.close;
Le premier attribue le résultat dewindow.close()
àonafterprint
. Cela entraînerawindow.close()
une exécution immédiate lorsque le gestionnaire est défini et rien à exécuter lorsque l'onafterprint
événement est déclenché. Ce dernier assignewindow.close
le gestionnaire d'événements, ce que nous voulons.window.print();
jusqu'à ce que la boîte de dialogue d'impression soit fermée. Lorsque cela se produit, il est possible que l'onafterprint
événement soit déclenché avantonafterprint
son affectation. Ainsi, il vaudrait mieuxwindow.onafterprint = window.close;
venir avantwindow.print();
. Sinon, l'approche utilisée dans cette réponse fonctionne mieux que celles basées sur onfocus ou setTimeout suggérées par les autres réponses.Il s'agit d'une solution multi-navigateurs déjà testée sur Chrome, Firefox, Opera d'ici 2016/05.
Gardez à l'esprit que Microsoft Edge a un bogue qui ne fermera pas la fenêtre si l'impression était annulée. Lien connexe
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); } }
la source
En utilisant Chrome, j'ai essayé pendant un certain temps de faire fonctionner le
window.onfocus=function() { window.close(); }
et le<body ... onfocus="window.close()">
. Mes résultats:J'ai également essayé
<body onload="window.print(); window.close()" >
ce qui a entraîné la fermeture de la fenêtre avant même de pouvoir cliquer sur quoi que ce soit dans la boîte de dialogue d'impression.Je ne pouvais utiliser ni l'un ni l'autre. J'ai donc utilisé un petit Jquery pour surveiller l'état du document et ce code fonctionne pour moi.
<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>
Assurez-vous simplement d'avoir inclus jquery, puis copiez / collez-le dans le code HTML que vous imprimez. Si l'utilisateur a imprimé, enregistré au format PDF ou annulé le travail d'impression, la fenêtre / l'onglet s'autodétruira. Remarque: je n'ai testé cela que dans Chrome.
Éditer
Comme Jypsy l'a souligné dans les commentaires, le statut de focus du document n'est pas nécessaire. Vous pouvez simplement utiliser la réponse de noamtcohen, j'ai changé mon code pour cela et cela fonctionne.
la source
celui-ci fonctionne pour moi:
<script>window.onload= function () { window.print();window.close(); } </script>
la source
Ce qui suit a fonctionné pour moi:
function print_link(link) { var mywindow = window.open(link, 'title', 'height=500,width=500'); mywindow.onload = function() { mywindow.print(); mywindow.close(); } }
la source
Enveloppez simplement window.close par le gestionnaire d'événements onafterprint, cela a fonctionné pour moi
printWindow.print(); printWindow.onafterprint = () => printWindow.close();
la source
Cela fonctionne bien dans Chrome 59:
window.print(); window.onmousemove = function() { window.close(); }
la source
J'ai essayé beaucoup de choses qui n'ont pas fonctionné. La seule chose qui a fonctionné pour moi était:
window.print(); window.onafterprint = function () { window.close(); }
testé sur chrome.
la source
La solution suivante fonctionne pour les versions plus récentes d'IE9, IE8, Chrome et FF à partir du 10/03/2014. Le scénario est le suivant: vous êtes dans une fenêtre (A), où vous cliquez sur un bouton / lien pour lancer le processus d'impression, puis une nouvelle fenêtre (B) avec le contenu à imprimer est ouverte, la boîte de dialogue d'impression s'affiche immédiatement, et vous pouvez annuler ou imprimer, puis la nouvelle fenêtre (B) se ferme automatiquement.
Le code suivant permet cela. Ce code javascript est à placer dans le html pour la fenêtre A (pas pour la fenêtre 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); };
Le bouton / lien pour lancer le processus doit simplement invoquer cette fonction, comme dans:
openPrintWindow('http://www.google.com', 'windowTitle', 'width=820,height=600');
la source
Imprimer et fermer la nouvelle fenêtre d'onglet avec php et javascript en un seul clic
la source
Cela a fonctionné mieux pour moi en injectant le HTML dans la fenêtre contextuelle, comme ce qui
<body onload="window.print()"...
précède fonctionne pour IE, Chrome et FF (sur Mac) mais pas de FF sur 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>';
la source
Voici ce que je fais ...
Permettre à la fenêtre de s'imprimer et de se fermer en fonction d'un paramètre de requête.
Nécessite jQuery. Peut être fait dans _Layout ou master page pour travailler avec toutes les pages.
L'idée est de passer un paramètre dans l'URL indiquant à la page d'imprimer et de fermer, si le paramètre est défini, l'événement jQuery «ready» imprime la fenêtre, puis lorsque la page est complètement chargée (après impression), le «onload» est appelé ce qui ferme la fenêtre. Toutes ces étapes apparemment supplémentaires consistent à attendre que la fenêtre s'imprime avant de se fermer.
Dans le corps html, l'événement d'ajout et de chargement qui appelle printAndCloseOnLoad (). Dans cet exemple, nous utilisons cshtm, vous pouvez également utiliser javascript pour obtenir param.
<body onload="sccPrintAndCloseOnLoad('@Request.QueryString["PrintAndClose"]');">
Dans le javascript, ajoutez la fonction.
function printAndCloseOnLoad(printAndClose) { if (printAndClose) { // close self without prompting window.open('', '_self', ''); window.close(); } }
Et un événement prêt pour jQuery.
$(document).ready(function () { if (window.location.search.indexOf("PrintAndClose=") > 0) print(); });
Maintenant, lors de l'ouverture d'une URL, ajoutez simplement la chaîne de requête param "PrintAndClose = true" et elle s'imprimera et se fermera.
la source
Pour moi, ma solution finale était un mélange de plusieurs réponses:
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();
la source
C'est ce qui a fonctionné pour moi (2018/02). J'avais besoin d'une demande distincte car mon impression ne s'affiche pas encore à l'écran. Sur la base de certaines des excellentes réponses ci-dessus, pour lesquelles je vous remercie tous, j'ai remarqué:
w.onload
ne doit pas être réglé avantw.document.write(data)
.Cela semble étrange car vous voudriez régler le crochet au préalable. Ma conjecture: le crochet est déjà déclenché lors de l'ouverture de la fenêtre sans contenu. Puisqu'il est tiré, il ne se déclenchera plus. Mais, quand le traitement est encore en cours avec un nouveau
document.write()
le hook sera appelé une fois le traitement terminé.w.document.close()
est toujours nécessaire. Sinon, rien ne se passe.J'ai testé cela dans Chrome 64.0, IE11 (11.248), Edge 41.16299 (edgeHTML 16.16299), FF 58.0.1. Ils se plaindront des popups, mais cela s'imprime.
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>
la source
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(); };
Voici ma solution ES2016.
la source
Cela fonctionne parfaitement pour moi @holger, cependant, je l'ai modifié et me convient mieux, la fenêtre apparaît maintenant et se ferme immédiatement lorsque vous appuyez sur le bouton d'impression ou d'annulation.
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(); }"
la source
jquery:
$(document).ready(function(){ window.print(); setTimeout(function(){ window.close(); }, 3000); });
la source
IE avait (a?) Le
onbeforeprint
etonafterprint
événements : vous pourriez attendre cela, mais cela ne fonctionnerait que sur IE (ce qui peut ou non être ok).Vous pouvez également essayer d'attendre que le focus revienne à la fenêtre à partir de la boîte de dialogue d'impression et de le fermer. Amazon Web Services fait cela dans leurs boîtes de dialogue d'impression de factures: vous appuyez sur le bouton d'impression, cela ouvre la vue conviviale et ouvre immédiatement la boîte de dialogue de l'imprimante. Si vous appuyez sur Imprimer ou si vous annulez, la boîte de dialogue d'impression se ferme, puis la vue conviviale se ferme immédiatement.
la source
Il y a beaucoup de mal à faire fonctionner des choses comme celle-ci sur les navigateurs.
À l'origine, je cherchais à faire le même genre de chose: ouvrir une nouvelle page conçue pour l'impression, l'imprimer avec JS, puis la refermer. C'était un cauchemar.
En fin de compte, j'ai choisi de cliquer simplement sur la page imprimable, puis d'utiliser le JS ci-dessous pour lancer une impression, puis de me rediriger vers où je voulais aller une fois terminé (avec une variable définie en PHP dans cet exemple).
J'ai testé cela sur Chrome et Firefox sur OSX et Windows, et IE11-8, et cela fonctionne sur tous (bien qu'IE8 se fige un peu si vous n'avez pas d'imprimante installée).
Bonne chasse (impression).
<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>
la source
utilisez simplement ce 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(); }
il fermera la fenêtre après avoir cliqué sur le bouton Soumettre ou Annuler
la source
Sur IE11, l'événement onfocus est appelé deux fois, ainsi l'utilisateur est invité deux fois à fermer la fenêtre. Cela peut être évité par un léger changement:
<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>
la source
Cela a fonctionné pour moi dans FF 36, Chrome 41 et IE 11. Même si vous annulez l'impression, et même si vous avez fermé la boîte de dialogue d'impression avec le "X" en haut à droite.
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);
la source
setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
Cela fonctionne parfaitement pour moi. J'espère que cela aide
la source
Cela fonctionne pour moi sur Chrome (je n'ai pas essayé d'autres)
$(function(){ window.print(); $("body").hover(function(){ window.close(); }); });
la source
J'ai essayé ça et ça marche
var popupWin = window.open('', 'PrintWindow', 'width=650,height=650,location=no,left=200px'); popupWin.document.write(data[0].xmldata); popupWin.print(); popupWin.close();
la source