2011-10-04 31 views
13

Tengo una página de impresión que se abre en una nueva pestaña o ventana. La página resultante abre un cuadro de diálogo de impresión. Después de que el usuario realiza una selección en el diálogo de impresión, la página cierra la pestaña/ventana.Chrome window.print() window.close() da como resultado 'error en la vista previa de impresión'. ¿Solución?

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

Esto funcionaba muy bien en los principales navegadores, pero una de las últimas versiones de Chrome rompe este (es decir 14.0.835.202).

Recibo el siguiente mensaje de lo que supongo que es el complemento de impresión de Chrome: "Vista previa de impresión fallida".

¿Alguien tiene una solución para cerrar la pestaña/ventana de Chrome después de imprimir?

+0

También me gustaría tratar de utilizar el controlador que obtuvo de 'window.open' – buley

Respuesta

6

No creo que haya ningún evento de impresión estandarizado. IE has a couple, pero me doy cuenta de que no te ayuda con Chrome.

Creo que te quedarán solo dos opciones. Un botón de cierre manual o alguna forma de retraso usando setTimeout.

+2

previamente la había tenido en su lugar: window.print(); setTimeout ('window.close()', 1000); Esto solía funcionar con Chrome, pero dejó de funcionar en la última versión. Informes de Chrome: "La impresión no está disponible porque la página que intentabas imprimir se ha cerrado". Si alguien niega que un botón de cerrar es la única opción, ¡por favor hágamelo saber! ¡Gracias! – Hoppe

10

Esta pregunta es un éxito en Google, así que pensé en agregar lo que encontré, aunque no refleja exactamente su situación. Si tiene un enlace que llama al window.print(), entonces su manejador onclick debe devolver falso u obtienes el error. ¡Esto es cierto incluso si el enlace es un hash y no va a ninguna parte!

de impresión no está disponible porque la página que intentas imprimir se ha cerrado

Para solucionar este problema, asegúrese de añadir return false para el enlace.

<a href="#" onclick="window.print(); return false;" >Print</a> 

Aquí está el error de Chromium que soluciona esto. Está marcado como fijo para Chrome 17 (aún no lanzado) y he verificado la solución en Chrome 18.

http://code.google.com/p/chromium/issues/detail?id=92107

0

mi corte actual. básicamente, justo después de window.print(), ato el mousemove, clic, y presiono la tecla para activar la acción que quiero (window.close(); o window.location.href = somewhere;). Claro que la acción no ocurre mientras el usuario haga nada. Pero funciona bastante bien. (Bueno, yo puedo vivir con Hasta que el problema se corrige al menos)

/* 
// alternative to window.print() for dedicated print windows (had issue with <body onload=window.print()... 
// not used anymore. 
$('<a id="aprint" href="#" onclick="return window.print()" class="invisible"></a>').appendTo('body'); 
$('#aprint').trigger('click'); 
*/ 
$('body, select, input, textarea, button, submit, form').prop('disabled', true); 
window.print(); 
setTimeout(function() { 
    $('body').bind('mousemove click keypress', function() { 
     window.location.href=home;      
    }); 
}, 200);  
0

Mi solución a este:

window.print(); 
if(/Chrome/.test(navigator.userAgent)){ 
    $(window).focus(function(){ 
    window.location = '/print-thank-you'; 
    }); 
} else { 
    window.location = '/print-thank-you'; 
} 

EDIT: Impresión en Chrome versión> = 17 funciona igual que IE/FF, así que asegúrese de dar cuenta de eso también

5

Problema similar, tuve.

FYI PARA TODOS A PARTIR DE 17+ Estaba usando el plugin jquery, printElement y había encontrado una manera de editarlo para poder cerrar la ventana, incluso en cromo ... luego se actualizaron a esta nueva cosa de impresión ! Tengo una solución una vez más.

Anterior

Chrome used to open a seperate window containing just the element i wanted 
printed and its relative css. That window then spawned the .print command 
which opened another window containing print preview. By adding a simple 50 
millisecond timeout i was able to close the previous window without hurting 
the print preview. 

el nuevo problema

Chrome no longer opens a new window for their print preview. Instead it 
opens a "dialog with overlay" in the current page to be printed (aka, our 
new blank page containing just the element for print). Thus, when my timer 
kicked in, it wouldn't close the page immediately, but as soon as the dialog 
code closed. The problem was, it closed so fast, the print command never 
made it to its service and thus nothing was printed to pdf 
(what our clinic uses). 

La nueva solución

supe aumentando el temporizador no fue de ayuda, el pecado ce solo se cerraría al final y aún podría detener el diálogo de impresión. En su lugar, agrego un enlace de script a la última versión de jquery en el encabezado de la nueva página de acercamiento y luego agregué un elemento emergente al cuerpo de la página que se va a imprimir. En vuelo estacionario ... ¡CERRAR! Y adivina qué ... ¡Funciona PERFECTAMENTE!

En verano, si utiliza una página en blanco para imprimir en cromo y necesita cerrar la página después de imprimir su elemento/todo lo demás, simplemente agregue un evento de desplazamiento en el cuerpo de esa página (o en html interno) eso cierra la ventana Luego, cuando haya seleccionado un método de impresión y pulse Imprimir, imprimirá y cerrará el cuadro de diálogo, dejándole esa ventana molesta. Simplemente mueva su mouse una scooch y ¡VIOLA! ¡La molesta ventana emergente se HA IDO!

+1

Esta es la única solución que he encontrado que realmente funciona. Felicitaciones a usted señor. –

2

agregar este script a su ventana de impresión emergente

<script src="/assets/print_window_close.js" type="text/javascript"></script> 

contenido de print_window_close.js es

jQuery(document).ready(function() { 

    setTimeout(function() { 
     window.close(); 
    }, 1); 

}); 

básicamente seTimeout se llama sólo cuando el documento se centra el cual ocurre sólo cuando la superposición el cuadro de diálogo de impresión está cerrado. por lo tanto, esto funciona exactamente de la manera que querías.

+0

Funciona para mí. Gracias. –

0

Después de una tarde de investigación y gracias a la respuesta de @ SpYk3HH, he encontrado una solución que funciona en las versiones Estoy funcionando actualmente:

IE: 9.0.8 ...

Firefox: 15,01

Chrome: 23.0.1271.97 m

Safari: 5.1.7

Cuando se prepara el HTML a visualizar en una impresión específica p edad, incluya un cheque por

if (oWindow == null || oWindow.closed || typeof(oWindow) == "undefined") 

y luego notifique al usuario para habilitar las ventanas emergentes temporalmente. Con el fin de permitir que su página para abrir, visualizar el cuadro de diálogo de impresión y cierre al diálogo de imprimir cerrar añadir esta función a la función onload para el cuerpo de la ventana:

function PrintPage() 
{ 
    self.print(); 
    self.onmouseover = (function() { window.close(); } 
} 

La razón por la que esto funciona es porque en el fondo todavía estamos tratando con objetos y eventos. Los navegadores pueden comportarse de manera diferente en algunas cosas, pero todos tienen puntos en común para buscar. Un evento simple onmouseover con suerte siempre ocurrirá cuando una ventana gane atención, por lo que este código no perderá su relevancia.

30

Acabo de encontrar una solución que me sienta bien. Comencé con la respuesta de Perú pero no quería usar jQuery en esta solución.

window.onload = function() { 
    window.print(); 
    setTimeout(function(){window.close();}, 1); 
} 

Por alguna razón Chrome no comienza el temporizador de tiempo de espera hasta que el diálogo de impresión está cerrada.

+0

¡Esto funciona genial! –

+0

Esto funcionó para mí en IE, Chrome y Firefox. No probé en ningún otro navegador. – jaredbaszler

+0

Pero cuando presiono ctrl + P antes del cuadro de diálogo de vista previa de impresión. Tab se está cerrando Hay algún trabajo alrededor –

0

que funcione bien para mí ...

var newWin = window.open('', ''); 
//htmlPage is your html content 
setTimeout(newWin.document.write(htmlPage),1000); 
// newWin.document.body.innerHTML = htmlPage; 
newWin.document.close(); 
newWin.focus(); 
setTimeout(newWin.print(), 10000); 
newWin.document.close(); 
newWin.close(); 
return false; 
3

Toda solución anterior no resuelve mi problema, utilizando el código resuelto mi problema

setTimeout(function() { 
     mywindow.print(); 
     mywindow.close(); 
    }, 1000); 
0

Probado hoy funciona para IE, FF, Chrome (including preview fix for chrome)

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

Para mí no pude encontrar una solución, así que creó uno.

Lo que hice fue crear un cuadro de texto invisible y centrarme en él mediante el uso de setInterval cada 50ms después de llamar a window.print(). También até el evento onfocus al cuadro de texto y cuando se dispara, cierro la ventana. Esto se prueba en Chrome, Firefox e Internet Explorer.

window.print(); 
 
setInterval(function() { 
 
    document.getElementById("focustext").focus(); 
 
}, 50); 
 
document.getElementById("focustext").onfocus = function() { window.close(); }
#focustext { 
 
    border: none; 
 
    height: 0px; 
 
    width: 0px; 
 
}
<input id="focustext" type="text" />

Cuestiones relacionadas