Tengo una pestaña abierta cuando el usuario hace clic en un botón. En el onload
tengo que abrir el cuadro de diálogo de impresión, pero el usuario me preguntó si era posible que después de enviar a la impresora para imprimir, si la pestaña podía cerrarse. No estoy seguro de si esto se puede hacer. He intentado usarlo setTimeout();
, pero no es un período de tiempo definido, ya que el usuario puede distraerse y tener que volver a abrir la pestaña. ¿Hay alguna forma de lograr esto?
javascript
printing
Tsundoku
fuente
fuente
Respuestas:
si intenta cerrar la ventana justo después de la llamada a print (), puede cerrar la ventana inmediatamente y print () no funcionará. Esto es lo que no debes hacer :
window.open(); ... window.print(); window.close();
Esta solución funcionará en Firefox, porque en la llamada print (), espera hasta que se imprime y luego continúa procesando javascript y cierra () la ventana. IE fallará con esto porque llama a la función close () sin esperar a que finalice la llamada a print (). La ventana emergente se cerrará antes de que finalice la impresión.
Una forma de resolverlo es utilizando el evento "onafterprint", pero no se lo recomiendo porque estos eventos solo funcionan en IE.
La mejor manera es cerrar la ventana emergente una vez que se cierra el cuadro de diálogo de impresión (la impresión está terminada o cancelada). En este momento, la ventana emergente se enfocará y puede usar el evento "onfocus" para cerrar la ventana emergente.
Para hacer esto, simplemente inserte este código incrustado de JavaScript en su ventana emergente:
<script type="text/javascript"> window.print(); window.onfocus=function(){ window.close();} </script>
Espero que esto ayude ;-)
Actualizar:
Para los nuevos navegadores Chrome, es posible que se cierre demasiado pronto, consulte aquí . Implementé este cambio y funciona para todos los navegadores actuales: 29/2/16
setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
fuente
window.onload = function () { window.print(); setTimeout(window.close, 500); };
Esto es lo que se me ocurrió, no sé por qué hay un pequeño retraso antes del cierre.
window.print(); setTimeout(window.close, 0);
fuente
Sólo:
window.print(); window.close();
Funciona.
fuente
Scripts may close only the windows that were opened by it.
advertencia.window.onafterprint = function(){ window.close()};
Solo quiero escribir lo que he hecho y lo que me ha funcionado (ya que nada de lo que intenté funcionó).
Tuve el problema de que IE cerraba las ventanas antes de que apareciera el cuadro de diálogo de impresión.
Después de muchas pruebas y pruebas de error, esto es lo que me puse a trabajar:
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();
Esto parece funcionar en todos los navegadores.
fuente
Este código funcionó perfectamente para mí:
<body onload="window.print()" onfocus="window.close()">
Cuando la página se abre, abre el cuadro de diálogo de impresión automáticamente y después de imprimir o cancelar, cierra la ventana.
Espero eso ayude,
fuente
Seguro que esto se resuelve fácilmente haciendo esto:
<script type="text/javascript"> window.print(); window.onafterprint = window.close(); </script>
O si quieres hacer algo como, por ejemplo, ve a la página anterior.
<script type="text/javascript"> window.print(); window.onafterprint = back; function back() { window.history.back(); } </script>
fuente
window.onafterprint = window.close();
debe serwindow.onafterprint = window.close;
El primero asigna el resultado dewindow.close()
aonafterprint
. Esto haráwindow.close()
que se ejecute inmediatamente cuando se establezca el controlador y no se ejecutará nada cuando se genere elonafterprint
evento. Este último lo asignawindow.close
como controlador de eventos, que es lo que queremos.window.print();
hasta que se cierra el cuadro de diálogo de impresión. Cuando esto sucede, es posible que elonafterprint
evento se genere antes de queonafterprint
se asigne. Por lo tanto, sería mejorwindow.onafterprint = window.close;
que viniera anteswindow.print();
. De lo contrario, el enfoque utilizado en esta respuesta funciona mejor que los basados en onfocus o setTimeout sugeridos por las otras respuestas.Esta es una solución de navegador cruzado ya probada en Chrome, Firefox, Opera en 2016/05.
Tenga en cuenta que Microsoft Edge tiene un error que no cierra la ventana si se cancela la impresión. Enlace 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); } }
fuente
Usando Chrome He intentado durante un tiempo para conseguir la
window.onfocus=function() { window.close(); }
y el<body ... onfocus="window.close()">
de trabajo. Mis resultados:También probé, lo
<body onload="window.print(); window.close()" >
que resultó en el cierre de la ventana antes de que pudiera hacer clic en cualquier cosa en el diálogo de impresión.No pude usar ninguno de esos. Entonces usé un poco de Jquery para monitorear el estado del documento y este código me funciona.
<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>
Solo asegúrese de haber incluido jquery y luego copie / pegue esto en el html que está imprimiendo. Si el usuario ha impreso, guardado como PDF o cancelado el trabajo de impresión, la ventana / pestaña se autodestruirá. Nota: Solo he probado esto en Chrome.
Editar
Como señaló Jypsy en los comentarios, el estado de enfoque del documento no es necesario. Simplemente puede usar la respuesta de noamtcohen, cambié mi código a eso y funciona.
fuente
Esta funciona para mí:
<script>window.onload= function () { window.print();window.close(); } </script>
fuente
Lo siguiente funcionó para mí:
function print_link(link) { var mywindow = window.open(link, 'title', 'height=500,width=500'); mywindow.onload = function() { mywindow.print(); mywindow.close(); } }
fuente
Simplemente envuelva window.close por el controlador de eventos onafterprint, funcionó para mí
printWindow.print(); printWindow.onafterprint = () => printWindow.close();
fuente
Esto funciona bien en Chrome 59:
window.print(); window.onmousemove = function() { window.close(); }
fuente
Probé muchas cosas que no funcionaron. Lo único que funcionó para mí fue:
window.print(); window.onafterprint = function () { window.close(); }
probado en cromo.
fuente
La siguiente solución funciona para las versiones más recientes de IE9, IE8, Chrome y FF a partir del 10 de marzo de 2014. El escenario es el siguiente: estás en una ventana (A), donde haces clic en un botón / enlace para iniciar el proceso de impresión, luego se abre una nueva ventana (B) con el contenido a imprimir, el diálogo de impresión se muestra inmediatamente, y puede cancelar o imprimir, y luego la nueva ventana (B) se cierra automáticamente.
El siguiente código lo permite. Este código javascript debe colocarse en el html para la ventana A (no para la ventana 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); };
El botón / enlace para iniciar el proceso simplemente tiene que invocar esta función, como en:
openPrintWindow('http://www.google.com', 'windowTitle', 'width=820,height=600');
fuente
Imprima y cierre la ventana de nueva pestaña con php y javascript con un solo clic
fuente
Esto funcionó mejor para mí al inyectar el HTML en la ventana emergente como
<body onload="window.print()"...
Lo anterior funciona para IE, Chrome y FF (en Mac) pero no FF en 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>';
fuente
Esto es lo que hago ...
Habilite la ventana para que se imprima y se cierre en función de un parámetro de consulta.
Requiere jQuery. Se puede hacer en _Layout o en una página maestra para trabajar con todas las páginas.
La idea es pasar un parámetro en la URL que le indique a la página que se imprima y se cierre, si el parámetro está configurado, el evento jQuery "ready" imprime la ventana, y luego, cuando la página está completamente cargada (después de imprimir), el "onload" se llama que cierra la ventana. Todos estos pasos aparentemente adicionales son esperar a que la ventana se imprima antes de cerrarse.
En el cuerpo html agregue y onload el evento que llama a printAndCloseOnLoad (). En este ejemplo, estamos usando cshtm, también podría usar javascript para obtener param.
<body onload="sccPrintAndCloseOnLoad('@Request.QueryString["PrintAndClose"]');">
En el javascript agregue la función.
function printAndCloseOnLoad(printAndClose) { if (printAndClose) { // close self without prompting window.open('', '_self', ''); window.close(); } }
Y evento listo para jQuery.
$(document).ready(function () { if (window.location.search.indexOf("PrintAndClose=") > 0) print(); });
Ahora, cuando abra cualquier URL, simplemente agregue el parámetro de cadena de consulta "PrintAndClose = true" y se imprimirá y cerrará.
fuente
Para mí, mi solución final fue una combinación de varias respuestas:
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();
fuente
Esto es lo que funcionó para mí (2018/02). Necesitaba una solicitud por separado porque mi impresión aún no estaba en la pantalla. Basado en algunas de las excelentes respuestas anteriores, por las cuales les agradezco a todos, noté:
w.onload
debe no ser puesto delantew.document.write(data)
.Parece extraño porque querrías colocar el anzuelo de antemano. Mi conjetura: el gancho ya está disparado al abrir la ventana sin contenido. Dado que está disparado, no volverá a disparar. Pero, cuando todavía se está procesando con un nuevo
document.write()
, se llamará al gancho cuando el procesamiento haya finalizado.w.document.close()
todavía se requiere. De lo contrario, no pasa nada.Probé esto en Chrome 64.0, IE11 (11.248), Edge 41.16299 (edgeHTML 16.16299), FF 58.0.1. Se quejarán de las ventanas emergentes, pero se 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>
fuente
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(); };
Aquí está mi solución ES2016.
fuente
Esto funciona para mí perfectamente @holger, sin embargo, lo modifiqué y me queda mejor, la ventana ahora aparece y se cierra inmediatamente después de presionar el botón de imprimir o 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(); }"
fuente
jquery:
$(document).ready(function(){ window.print(); setTimeout(function(){ window.close(); }, 3000); });
fuente
IE tenía (¿tiene?) Los eventos
onbeforeprint
yonafterprint
: podría esperar eso, pero solo funcionaría en IE (que puede o no estar bien).Alternativamente, puede intentar esperar a que el foco regrese a la ventana desde el cuadro de diálogo de impresión y cerrarlo. Amazon Web Services hace esto en sus cuadros de diálogo de impresión de facturas: presiona el botón de impresión, abre la vista fácil de imprimir e inmediatamente abre el cuadro de diálogo de la impresora. Si presiona imprimir o cancela, el cuadro de diálogo de impresión se cierra y luego la vista fácil de imprimir se cierra inmediatamente.
fuente
Es muy complicado conseguir que este tipo de cosas funcionen en todos los navegadores.
Originalmente estaba buscando hacer el mismo tipo de cosas: abrir una nueva página diseñada para imprimir, imprimirla usando JS y luego cerrarla nuevamente. Esto fue una pesadilla.
Al final, opté por simplemente hacer clic en la página imprimible y luego usar el JS a continuación para iniciar una impresión, luego redirigirme a donde quería ir cuando termine (con una variable establecida en PHP en este caso).
He probado esto en Chrome y Firefox en OSX y Windows, e IE11-8, y funciona en todos (aunque IE8 se congelará un poco si en realidad no tienes una impresora instalada).
Feliz caza (impresión).
<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>
fuente
solo usa 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(); }
se cerrará la ventana después de hacer clic en el botón enviar o cancelar
fuente
En IE11, el evento onfocus se llama dos veces, por lo que se solicita al usuario dos veces que cierre la ventana. Esto se puede prevenir con un ligero cambio:
<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>
fuente
Esto funcionó para mí en FF 36, Chrome 41 e IE 11. Incluso si cancela la impresión, e incluso si cierra el cuadro de diálogo de impresión con la "X" superior derecha.
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);
fuente
setTimeout(function () { window.print(); }, 500); window.onfocus = function () { setTimeout(function () { window.close(); }, 500); }
Funciona perfectamente para mí. Espero eso ayude
fuente
Esto me funciona en Chrome (no lo he probado en otros)
$(function(){ window.print(); $("body").hover(function(){ window.close(); }); });
fuente
Probé esto y funciona
var popupWin = window.open('', 'PrintWindow', 'width=650,height=650,location=no,left=200px'); popupWin.document.write(data[0].xmldata); popupWin.print(); popupWin.close();
fuente