Fechar a janela automaticamente após fechar a caixa de diálogo de impressão


86

Tenho uma guia aberta quando o usuário clica em um botão. No onloadeu 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?



Respostas:


113

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

Pelo que vale a pena, isso parece falhar no IE8. A janela fecha imediatamente antes que a caixa de diálogo de impressão seja exibida.
Heath

15
isso não parece funcionar para o chrome neste ponto, já que o chrome lida com a impressão internamente, a janela não perderá o foco quando a caixa de diálogo de impressão for carregada e, portanto, não recuperará o foco quando a impressão for concluída. Há alguma maneira de fazer isso funcionar para o Chrome?
jlbriggs de

6
Em fevereiro de 2016, esta e NENHUMA das outras respostas baseadas em focus () funcionam mais no Chrome. A única solução de trabalho é @noamtcohen (infelizmente com uma contagem de votos muito baixa).
Jpsy

2
Acho que a versão mais recente do Chrome não está mostrando a caixa de diálogo de impressão até que as imagens na página sejam carregadas, mas está executando o fechamento antes, portanto, a página fecha antes de carregar (a caixa de diálogo de impressão nunca é exibida). Para corrigirwindow.onload = function () { window.print(); setTimeout(window.close, 500); };
Brian Leishman

4
A solução acima não funciona mais, adicione ouvinte de evento onafterprint para fechar a janela window.onafterprint = function () {window.close ()};
Rahat Hameed

91

Foi isso que eu pensei, não sei por que há um pequeno atraso antes de fechar.

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

1
É interessante que essa resposta de pontuação baixa seja atualmente a correta. Em fevereiro de 2016, nenhuma das respostas baseadas em focus () funciona mais no Chrome. Esta solução funciona em FF, Chrome e Safari em Windows e OS X, IE9 +, Android Chrome e IOS Safari. Só experimentamos diálogos de confirmação em IEs antigos. Todos os outros fecham perfeitamente.
Jpsy

6
Em 17 de março, isso não funcionou exatamente como no Chrome (56), mas adicionando algum tempo ao tempo limite funcionou. window.print (); setTimeout (window.close, 500);
jAC

Como o jAC mencionou, isso precisava de mais tempo para funcionar. No meu, 10ms não foram suficientes, mas 100 foram. Parece ser uma questão de quanto tempo leva para renderizar a visualização da impressão. Com o meu definido para 10 ms, ele imprimiu apenas uma versão parcialmente renderizada da página. Com 100, consegui tudo.
Jacob Ewing

1
Para expandir isso, ~ parece ~ que o tempo limite é pausado quando a janela de impressão é totalmente renderizada (em cromo em um macbook de qualquer maneira), e o restante é contado depois que a janela é fechada.
Jacob Ewing

1
Você não precisa do 0, é o padrão
Brian Leishman

14

Somente:

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

Funciona.


2
Isso não funciona de forma confiável para mim no Chrome. Às vezes funciona, mas às vezes a janela fecha imediatamente antes que a caixa de diálogo de impressão seja exibida. Posso evitar que isso aconteça aumentando o tempo limite para 5000, mas às vezes leva até 5 segundos para a janela fechar após a impressão. Não tenho certeza do que está acontecendo aqui, mas não parece provável que seja robusto em navegadores diferentes.
speedarius

1
Conforme mencionado abaixo, a solução completa para vários navegadores é mais complexa.
Eric

1
Não se esqueça do: Scripts may close only the windows that were opened by it.aviso.
Cas Bloem

A solução acima não funciona mais, adicione ouvinte de evento no pós - impressão para fechar a janela. window.onafterprint = function(){ window.close()};
Rahat Hameed

12

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.


parecia funcionar. já não, vou postar meu código abaixo.
Remco

10

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,


esta dose não funciona se você abriu o pdf para imprimir não html ou jsp onde eu posso colocar onload body?
shareef

9

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>

window.close ();
Mustafa

Nota: window.onafterprint = window.close();deve ser window.onafterprint = window.close;O primeiro atribui o resultado de window.close()a onafterprint. Isso fará com window.close()que seja executado imediatamente quando o manipulador for definido e nada seja executado quando o onafterprintevento for gerado. Este último atribui window.closecomo manipulador de eventos, que é o que queremos.
Kei

Além disso, em alguns navegadores, a execução do código é interrompida depois que window.print();a caixa de diálogo de impressão é descartada. Quando isso acontece, é possível que o onafterprintevento seja gerado antes de onafterprintser atribuído. Assim, seria melhor window.onafterprint = window.close;vir antes window.print();. Caso contrário, a abordagem usada nesta resposta funciona melhor do que as baseadas em onfocus ou setTimeout sugeridas pelas outras respostas.
Kei

8

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

7

Usando o Chrome, tentei por um tempo fazer o window.onfocus=function() { window.close(); }e o <body ... onfocus="window.close()"> funcionarem. Meus resultados:

  1. Eu fechei meu diálogo impresso, nada aconteceu.
  2. Mudei janela / abas no meu navegador, ainda nada.
  3. mudou de volta para minha primeira janela / guia e, em seguida, o evento window.onfocus disparou fechando a janela.

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.


Essa solução faz com que a janela original trave se o usuário fechar o pop-up com o "X" no canto em vez de selecionar Cancelar ou Imprimir. O mesmo problema da solução de Juan, que @JFK apontou originalmente.
Clayton de

O javascript acima não deve ser colocado no html sendo impresso, seja aberto em um pop-up ou, como eu faço, em uma nova guia. Portanto, este javascript não tem efeito na janela original.
Nado11

5

este funciona para mim:

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

5

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

5

Apenas envolva window.close por onafterprint event handler, funcionou para mim

printWindow.print();
printWindow.onafterprint = () => printWindow.close();

Requer Safari v12
Paul Brady

4

Isso funciona bem no Chrome 59:

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

4

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.


Eu odeio o quanto isso funciona
Franz Justin Buenaventura

3

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

Funciona no Chrome desde que o usuário imprima ou cancele a operação, MAS se o usuário fechar a janela (B), a janela (A) trava (eu disse no Chrome?). Teste (no Chrome) jsfiddle.net/qy6QV/2/show e feche a janela. Em seguida, tente recarregá-lo ... desligou.
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>

Imprima e feche a janela da nova guia com php e javascript com um único clique de botão


1

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

1

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.


1

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

1

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.onloadnão deve ser definido antes w.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>

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

Aqui está minha solução ES2016.


1
Olá Stuart, bem-vindo ao Stack Overflow! Você poderia explicar por que esse código funciona para ajudar mais o OP e outros usuários? Obrigado!
heather

1

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

1

jquery:

$(document).ready(function(){ 
  window.print();
  setTimeout(function(){ 
             window.close();
  }, 3000);
});

0

O IE tinha (tem?) Os eventos onbeforeprinte onafterprint: 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.


0

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

0

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


0

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>

0

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

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

Funcionou perfeitamente para mim. Espero que ajude


0

Isso funciona para mim no Chrome (não tentei em outros)

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

0

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();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.