Nuestros mejores programadores han agotado sus provisiones de café, por su búsqueda diariamente por la respuesta, hasta que Israel halló el hallazgo en Gogs y ahora la compartimos con nosotros.
Solución:
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.
También me limité a advertir al usuario que no cerrara la ventana de vista previa de 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 thenCancel 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.
El problema es que hay un diálogo de impresión en el navegador dentro de la ventana emergente. si llamas window.close()
inmediatamente entonces el diálogo no es visto por el usuario. 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 el window.close()
hasta que se descarte: 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();
Valoraciones y reseñas
Si te mola el asunto, tienes la habilidad dejar un escrito acerca de qué le añadirías a este enunciado.