Tenho uma guia aberta quando o usuário clica em um botão. No onload
eu fiz abrir a caixa de diálogo de impressão, mas o usuário me perguntou se era possível que depois de enviar para a impressora para imprimir, a guia pudesse se fechar. Não tenho certeza se isso pode ser feito. Eu tentei usar setTimeout();
, mas não é um período de tempo definido, pois o usuário pode se distrair e ter que reabrir a guia. Existe alguma maneira de conseguir isso?
javascript
printing
Tsundoku
fonte
fonte
Respostas:
se você tentar fechar a janela logo após a chamada de print (), pode fechar a janela imediatamente e print () não funcionará. Isso é o que você não deve fazer :
window.open(); ... window.print(); window.close();
Esta solução funcionará no Firefox, porque na chamada de print (), ele espera até que a impressão seja concluída e então continua processando javascript e close () a janela. O IE irá falhar com isso porque chama a função close () sem esperar que a chamada print () seja feita. A janela pop-up será fechada antes que a impressão seja concluída.
Uma maneira de resolver isso é usar o evento "onafterprint", mas eu não recomendo porque esses eventos só funcionam no IE.
A melhor maneira é fechar a janela pop-up assim que a caixa de diálogo de impressão for fechada (a impressão foi concluída ou cancelada). Neste momento, a janela popup estará focada e você pode usar o evento "onfocus" para fechar o popup.
Para fazer isso, basta inserir este código javascript incorporado em sua janela pop-up:
<script type="text/javascript"> window.print(); window.onfocus=function(){ window.close();} </script>
Espero que isso ajude ;-)
Atualizar:
Para novos navegadores Chrome, ele ainda pode fechar muito em breve, consulte aqui . Eu implementei essa mudança e ela funciona para todos os navegadores atuais: 29/02/16
setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
fonte
window.onload = function () { window.print(); setTimeout(window.close, 500); };
Foi isso que eu pensei, não sei por que há um pequeno atraso antes de fechar.
window.print(); setTimeout(window.close, 0);
fonte
Somente:
window.print(); window.close();
Funciona.
fonte
Scripts may close only the windows that were opened by it.
aviso.window.onafterprint = function(){ window.close()};
Só quero escrever o que fiz e o que funcionou para mim (como nada mais que tentei funcionou).
Tive o problema de o IE fechar as janelas antes que a caixa de diálogo de impressão fosse exibida.
Depois de muitos testes de tentativa e erro, comecei a trabalhar assim:
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();
Isso parece funcionar em todos os navegadores.
fonte
Este código funcionou perfeitamente para mim:
<body onload="window.print()" onfocus="window.close()">
Quando a página é aberta, a caixa de diálogo de impressão é aberta automaticamente e, após a impressão ou cancelamento, ela fecha a janela.
Espero que ajude,
fonte
Claro que isso é facilmente resolvido fazendo o seguinte:
<script type="text/javascript"> window.print(); window.onafterprint = window.close(); </script>
Ou se você quiser fazer algo como, por exemplo, vá para a página anterior.
<script type="text/javascript"> window.print(); window.onafterprint = back; function back() { window.history.back(); } </script>
fonte
window.onafterprint = window.close();
deve serwindow.onafterprint = window.close;
O primeiro atribui o resultado dewindow.close()
aonafterprint
. Isso fará comwindow.close()
que seja executado imediatamente quando o manipulador for definido e nada seja executado quando oonafterprint
evento for gerado. Este último atribuiwindow.close
como manipulador de eventos, que é o que queremos.window.print();
a caixa de diálogo de impressão é descartada. Quando isso acontece, é possível que oonafterprint
evento seja gerado antes deonafterprint
ser atribuído. Assim, seria melhorwindow.onafterprint = window.close;
vir anteswindow.print();
. Caso contrário, a abordagem usada nesta resposta funciona melhor do que as baseadas em onfocus ou setTimeout sugeridas pelas outras respostas.Esta é uma solução para vários navegadores já testada no Chrome, Firefox, Opera em 2016/05.
Lembre-se de que o Microsoft Edge tem um bug que não fecha a janela se a impressão for cancelada. Link Relacionado
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); } }
fonte
Usando o Chrome, tentei por um tempo fazer o
window.onfocus=function() { window.close(); }
e o<body ... onfocus="window.close()">
funcionarem. Meus resultados:Também tentei, o
<body onload="window.print(); window.close()" >
que resultou no fechamento da janela antes mesmo de clicar em qualquer coisa na caixa de diálogo de impressão.Eu não poderia usar nenhum desses. Usei um pouco de Jquery para monitorar o status do documento e esse código funciona para mim.
<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>
Apenas certifique-se de incluir o jquery e copie / cole no html que você está imprimindo. Se o usuário imprimiu, salvou como PDF ou cancelou o trabalho de impressão, a janela / guia se autodestruirá. Nota: Eu só testei isso no Chrome.
Editar
Como Jypsy apontou nos comentários, o status do foco do documento não é necessário. Você pode simplesmente usar a resposta de noamtcohen, mudei meu código para isso e funciona.
fonte
este funciona para mim:
<script>window.onload= function () { window.print();window.close(); } </script>
fonte
O seguinte funcionou para mim:
function print_link(link) { var mywindow = window.open(link, 'title', 'height=500,width=500'); mywindow.onload = function() { mywindow.print(); mywindow.close(); } }
fonte
Apenas envolva window.close por onafterprint event handler, funcionou para mim
printWindow.print(); printWindow.onafterprint = () => printWindow.close();
fonte
Isso funciona bem no Chrome 59:
window.print(); window.onmousemove = function() { window.close(); }
fonte
Tentei muitas coisas que não funcionaram. A única coisa que funcionou para mim foi:
window.print(); window.onafterprint = function () { window.close(); }
testado em cromo.
fonte
A solução a seguir está funcionando para as versões mais recentes do IE9, IE8, Chrome e FF em 10/03/2014. O cenário é o seguinte: você está em uma janela (A), onde clica em um botão / link para iniciar o processo de impressão, então uma nova janela (B) com o conteúdo a ser impresso é aberta, o diálogo de impressão é mostrado imediatamente, e você pode cancelar ou imprimir, e então a nova janela (B) fecha automaticamente.
O código a seguir permite isso. Este código javascript deve ser colocado no html para a janela A (não para a janela 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); };
O botão / link para iniciar o processo deve simplesmente invocar esta função, como em:
openPrintWindow('http://www.google.com', 'windowTitle', 'width=820,height=600');
fonte
Imprima e feche a janela da nova guia com php e javascript com um único clique de botão
fonte
Isso funcionou melhor para mim injetando o HTML no pop-up, como
<body onload="window.print()"...
O acima funciona para IE, Chrome e FF (no Mac), mas não FF no 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>';
fonte
Aqui está o que eu faço ....
Permite que a janela seja impressa e fechada com base em um parâmetro de consulta.
Requer jQuery. Pode ser feito em _Layout ou página mestra para trabalhar com todas as páginas.
A ideia é passar um parâmetro na URL informando a página para imprimir e fechar, se o parâmetro estiver definido, o evento jQuery “pronto” imprimirá a janela e, quando a página estiver totalmente carregada (após a impressão), o “onload” é chamado, o que fecha a janela. Todas essas etapas aparentemente extras são esperar que a janela seja impressa antes de se fechar.
No evento html body add e onload que chama printAndCloseOnLoad (). Neste exemplo, estamos usando cshtm, você também pode usar javascript para obter parâmetros.
<body onload="sccPrintAndCloseOnLoad('@Request.QueryString["PrintAndClose"]');">
No javascript adicione a função.
function printAndCloseOnLoad(printAndClose) { if (printAndClose) { // close self without prompting window.open('', '_self', ''); window.close(); } }
E evento pronto para jQuery.
$(document).ready(function () { if (window.location.search.indexOf("PrintAndClose=") > 0) print(); });
Agora, ao abrir qualquer URL, basta anexar o parâmetro de string de consulta “PrintAndClose = true” e ele será impresso e fechado.
fonte
Para mim, minha solução final foi uma mistura de várias respostas:
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();
fonte
Isso é o que funcionou para mim (02/2018). Eu precisava de um pedido separado porque minha impressão ainda não estava na tela. Com base em algumas das excelentes respostas acima, pelas quais agradeço a todos, percebi:
w.onload
não deve ser definido antesw.document.write(data)
.Parece estranho porque você gostaria de definir o anzol de antemão. Meu palpite: o gancho já é disparado ao abrir a janela sem conteúdo. Uma vez que foi disparado, ele não disparará novamente. Mas, quando ainda houver processamento em andamento com um novo
document.write()
, o gancho será chamado quando o processamento for concluído.w.document.close()
ainda é necessário. Caso contrário, nada acontecerá.Eu testei isso no Chrome 64.0, IE11 (11.248), Edge 41.16299 (edgeHTML 16.16299), FF 58.0.1. Eles vão reclamar de popups, mas 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>
fonte
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(); };
Aqui está minha solução ES2016.
fonte
Isso funciona perfeitamente para mim @holger, no entanto, eu modifiquei e fica melhor para mim, a janela agora aparece e fecha imediatamente quando você clica no botão imprimir ou cancelar.
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(); }"
fonte
jquery:
$(document).ready(function(){ window.print(); setTimeout(function(){ window.close(); }, 3000); });
fonte
O IE tinha (tem?) Os eventos
onbeforeprint
eonafterprint
: você poderia esperar por isso, mas só funcionaria no IE (que pode ou não estar ok).Como alternativa, você pode tentar e esperar que o foco retorne à janela da caixa de diálogo de impressão e fechá-la. Amazon Web Services faz isso em seus diálogos de impressão de faturas: você clica no botão imprimir, ele abre a visualização amigável para impressão e abre imediatamente o diálogo da impressora. Se você clicar em imprimir ou cancelar, a caixa de diálogo de impressão fecha e a visualização amigável para impressão fecha imediatamente.
fonte
É muito difícil fazer coisas como essa funcionarem em todos os navegadores.
Eu estava originalmente procurando fazer o mesmo tipo de coisa - abrir uma nova página com estilo para impressão, imprimir usando JS e fechá-la novamente. Isso foi um pesadelo.
No final, optei por simplesmente clicar na página imprimível e, em seguida, usar o JS abaixo para iniciar uma impressão e, em seguida, redirecionar-me para onde queria ir quando terminar (com uma variável definida em PHP, neste caso).
Eu testei isso no Chrome e Firefox no OSX e Windows, e no IE11-8, e funciona em todos (embora o IE8 congele um pouco se você não tiver uma impressora instalada).
Boa caça (impressão).
<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>
fonte
apenas use este 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(); }
irá fechar a janela após enviar ou cancelar clique no botão
fonte
No IE11, o evento onfocus é chamado duas vezes, portanto, o usuário é solicitado duas vezes a fechar a janela. Isso pode ser evitado por uma ligeira mudança:
<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>
fonte
Isso funcionou para mim no FF 36, Chrome 41 e IE 11. Mesmo se você cancelar a impressão, e mesmo se você fechar a caixa de diálogo de impressão com o "X" superior direito.
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);
fonte
setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
Funcionou perfeitamente para mim. Espero que ajude
fonte
Isso funciona para mim no Chrome (não tentei em outros)
$(function(){ window.print(); $("body").hover(function(){ window.close(); }); });
fonte
Eu tentei isso e funciona
var popupWin = window.open('', 'PrintWindow', 'width=650,height=650,location=no,left=200px'); popupWin.document.write(data[0].xmldata); popupWin.print(); popupWin.close();
fonte