tiempo - Javascript window.print() en Chrome, cerrar ventana o pestaña nueva en lugar de cancelar impresión deja javascript bloqueado en la ventana primaria
los scripts no pueden cerrar ventanas que no hayan sido abiertas por un script. (9)
¡OK aquí es lo que funcionó para mí! Tengo un botón en mi Nav izquierdo. Si hace clic en él, se abrirá una ventana y esa ventana cargará un documento. Después de cargar el documento, quiero imprimir el documento y luego cerrar la ventana emergente de inmediato.
contentDiv.focus();
contentDiv.contentWindow.print();
contentDiv.contentWindow.onfocus = function() {
window.close();
};
¿Por qué funcionó?
Bueno, después de imprimir, configura el evento de enfoque para cerrar la ventana. La ventana emergente de impresión se cargará tan rápido que el evento en foco no tendrá la oportunidad de activarse hasta que 1) imprima 2) cancele la impresión. Una vez que recuperas el foco en la ventana, ¡la ventana se cerrará!
Espero que funcione para ti
En la aplicación en la que trabajo, tenemos varios lugares diferentes desde los que un usuario puede imprimir. En todos estos casos estamos usando el mismo flujo de trabajo para abrir una nueva ventana (o pestaña), escribiendo lo que necesitemos para imprimir en el documento de la nueva ventana, y luego llamamos
$(w.document).ready(function () {
w.focus();
w.print();
w.close();
});
El problema que estoy viendo es que en Chrome, si cierro la pestaña o la ventana que se abre para la vista previa de impresión en lugar de hacer clic en el botón cancelar, Chrome sigue bloqueando el javascript en la ventana principal.
Es similar al problema descrito aquí:
Estamos experimentando este problema también, pero creo que esto es el resultado de cómo estamos implementando la impresión en una nueva ventana y la forma en que funciona la vista previa de impresión de Chrome. En IE y Firefox, la ventana de impresión muestra el cuadro de diálogo modal y no puede hacer nada en la ventana primaria hasta que se cierre la ventana de impresión. Del mismo modo, Chrome bloquea el uso de la ventana principal hasta que se cancela la vista previa de impresión. Sin embargo, espero cerrar esa pestaña o ventana para que funcione igual que cancelar la impresión.
¿Alguien más tiene este problema o sabe de una buena solución?
¡Gracias!
El problema es que hay un diálogo de impresión en el navegador dentro de la ventana emergente. Si llama a window.close()
inmediatamente, el usuario no verá el diálogo. El usuario debe hacer clic en "Imprimir" dentro del diálogo. Esto no es lo mismo que en otros navegadores donde el diálogo de impresión es parte del sistema operativo y bloquea window.close()
hasta que se descarta: en Chrome, es parte de Chrome, no del sistema operativo.
Este es el código que utilicé, en una pequeña ventana emergente creada por la ventana principal:
var is_chrome = function () { return Boolean(window.chrome); }
window.onload = function() {
if(is_chrome){
/*
* These 2 lines are here because as usual, for other browsers,
* the window is a tiny 100x100 box that the user will barely see.
* On Chrome, it needs to be big enough for the dialogue to be read
* (NB, it also includes a page preview).
*/
window.moveTo(0,0);
window.resizeTo(640, 480);
// This line causes the print dialogue to appear, as usual:
window.print();
/*
* This setTimeout isn''t fired until after .print() has finished
* or the dialogue is closed/cancelled.
* It doesn''t need to be a big pause, 500ms seems OK.
*/
setTimeout(function(){
window.close();
}, 500);
} else {
// For other browsers we can do things more briefly:
window.print();
window.close();
}
}
La impresión de Chrome suele ser una página de extensión, por lo que no hay ningún accesorio dom en su página actual. Puede desencadenar el comando de impresión utilizando las líneas de comando apis (window.print ()) pero luego no han proporcionado apis para cerrarlo debido a diversas razones, como elegir opciones de impresión, imprimir máquina, contar, etc.
Para aquellos de ustedes que están apareciendo una nueva ventana para imprimir y luego cerrarla automáticamente después de que el usuario haga clic en "Imprimir" o "Cancelar" en la vista previa de impresión de Chrome, utilicé lo siguiente (gracias a la ayuda de la respuesta de PaulVB) :
if (navigator.userAgent.toLowerCase().indexOf(''chrome'') > -1) {
var showPopup = false;
window.onbeforeunload = function () {
if (showPopup) {
return ''You must use the Cancel button to close the Print Preview window./n'';
} else {
showPopup = true;
}
}
window.print();
window.close();
} else {
window.print();
window.close();
}
Estoy debatiendo si sería una buena idea filtrar también por la versión de Chrome ...
Parece que el problema se resolvió con la última actualización de Chrome ... Estoy ejecutando la versión de Chrome 36.0.1964.4 dev-m.
Estaba limitado y advertí al usuario que no cierre la ventana de vista previa de la impresión haciendo lo siguiente:
if(navigator.userAgent.toLowerCase().indexOf(''chrome'') > -1){ // Chrome Browser Detected?
window.PPClose = false; // Clear Close Flag
window.onbeforeunload = function(){ // Before Window Close Event
if(window.PPClose === false){ // Close not OK?
return ''Leaving this page will block the parent window!/nPlease select "Stay on this Page option" and use the/nCancel button instead to close the Print Preview Window./n'';
}
}
window.print(); // Print preview
window.PPClose = true; // Set Close Flag to OK.
}
Ahora la advertencia ya no aparece después de la actualización de Chrome.
Puedo confirmar que tengo el mismo error en Windows 7 con Chrome Versión 35, pero comparto mi solución parcial, que abre una nueva pestaña en Chrome y muestra un cuadro de diálogo.
Para otro navegador, cuando el usuario haga clic en cancelar, cierre automáticamente la nueva ventana de impresión.
//Chrome''s versions > 34 is some bug who stop all javascript when is show a prints preview
//http://.com/questions/23071291/javascript-window-print-in-chrome-closing-new-window-or-tab-instead-of-cancel
if(navigator.userAgent.toLowerCase().indexOf(''chrome'') > -1) {
var popupWin = window.open();
popupWin.window.focus();
popupWin.document.write(''<!DOCTYPE html><html><head>'' +
''<link rel="stylesheet" type="text/css" href="style.css" />'' +
''</head><body onload="window.print()"><div class="reward-body">'' + printContents + ''</div></html>'');
popupWin.onbeforeunload = function (event) {
return ''Please use the cancel button on the left side of the print preview to close this window./n'';
};
}else {
var popupWin = window.open('''', ''_blank'', ''width=600,height=600,scrollbars=no,menubar=no,toolbar=no,location=no,status=no,titlebar=no'');
popupWin.document.write(''<!DOCTYPE html><html><head>'' +
''<link rel="stylesheet" type="text/css" href="style.css" />'' +
''</head><body onload="window.print()"><div class="reward-body">'' + printContents + ''</div>'' +
''<script>setTimeout(function(){ window.parent.focus(); window.close() }, 100)</script></html>'');
}
popupWin.document.close();
Si la función setTimeout tampoco funciona para usted, haga lo siguiente:
//Create an iframe
iframe = $(''body'').append($(''<iframe id="documentToPrint" name="documentToPrint" src="about:blank"/>''));
iframeElement = $(''#documentToPrint'')[0].contentWindow.document;
//Open the iframe
iframeElement.open();
//Write your content to the iframe
iframeElement.write($("yourContentId").html());
//This is the important bit.
//Wait for the iframe window to load, then print it.
$(''#documentToPrint'')[0].contentWindow.onload = function () {
$(''#print-document'')[0].contentWindow.print();
$(''#print-document'').remove();
};
iframeElement.close();
Use este código para regresar y volver a cargar la ventana actual:
function printpost() {
if (window.print()) {
return false;
} else {
location.reload();
}
}
he ordenado una página similar (ASP clásico ...)
mi enfoque era utilizar Q promise directamente en la ventana emergente.
Por ejemplo, mi problema era que la ventana emergente que quería imprimir se cierra demasiado rápido ... y la impresión anterior estaba vacía, lo resolví de esta manera:
Llamante:
var popup = window.open("index.asp","popupwindow","width=800,height=500,left=200,top=5,scrollbars,toolbar=0,resizable");
Popup (al final de la página):
<script src="/Scripts/jquery-1.9.1.min.js"></script>
<script src="/Scripts/q.min.js"></script>
<script type="text/javascript">
Q(window.print()).then(function () {window.close();});
</script>
Creo que su "bloqueo de padres" podría resolverse de manera similar
lo intentaré :
var w = whatever;
Q(
// fill your popup
).then(function () {
w.print();
}).then(function () {
w.close();
});
eso hace que "la impresión" y "el cierre" sean asincrónicos ... para que el padre sea inmediatamente "desbloqueado"