2012-05-01 36 views
19

Sé que se ha discutido aquí anteriormente, pero no encontré ninguna solución práctica/solución para esto, ¡espero que alguien tenga alguna idea de cómo resolver este problema!impresión de JavaScript bloqueada por Chrome, ¿solución?

Así es que es:

Si se intenta llamar window.print() método con frecuencia dentro de una única página (como si un usuario hace clic en un botón de impresión) en Google Chrome, el navegador lanza un mensaje de advertencia en la consola, indicando :

Haciendo caso omiso de las llamadas demasiado frecuentes para imprimir()

y no pasa nada! Después de varios segundos, las cosas vuelven a la normalidad y aparece el cuadro de diálogo de impresión en el momento en que llamas al comando window.print() nuevamente. Para empeorar las cosas, los buenos usuarios de Chrome usan el tiempo de espera exponencial para una página que llama al comando de impresión, lo que significa que mientras más usuarios hagan clic en un botón para imprimir, más tendrá que esperar para que aparezca el cuadro de diálogo de impresión.

Este problema ha sido en cromo desde hace bastante tiempo (14 versiones posteriores) y se confirma de ser un bicho Area-UI, me posted it again for google team ayer esperando si alguien del equipo de Chrome puede verificar cuando esta característica molesta increíble va a ¡arreglado!

Sin embargo, lo que estoy buscando aquí es una solución para este problema, ¿hay cualquier cosa que pueda hacer funcionar? Mi compañía está desarrollando un sistema financiero altamente transaccional con muchos informes que necesitan ser impresos, y por solo este pequeño problema, ¡todo el proyecto corre el riesgo de ejecutarse en mi navegador Google Chrome favorito!

Actualización:

Here's the code in Chrome browser que causa esta característica y parece que, al menos, 2 segundos que se necesita antes de que alguien llama a comando de impresión de nuevo, por lo que un temporizador de intervalo de 2 segundos en la interfaz de usuario, posiblemente, podría evitar que entrar en una espera infinita ¡llamar de vuelta! cualquier otro pensamiento?

+2

El único trabajo en torno a lo Se puede pensar en tener un temporizador interno (para rastrear cuándo está bien para llamar a imprimir) y cuando se presiona el botón de imprimir tener una animación similar a la de AJAX hasta que realmente se llame a imprimir. Esto no es genial, ya que aún demora el procedimiento de impresión, pero se vería mejor que y el error apareciera. – GillesC

+2

@gillesc: Sí, eso es mejor que no tener "nada" al hacer clic en un botón y hacer clic una y otra vez empeorándolo. Encontré la línea de código en el navegador Chrome que causa esta característica: http: //git.chromium.org/gitweb/? P = chromium.git; a = commitdiff_plain; h = 8a86b38e5c593998369f4c3a789489e3fd9e8354 y parece que al menos 2 segundos es Necesario antes de que alguien vuelva a llamar al comando de impresión, por lo que un temporizador de 2 segundos de intervalo posiblemente podría evitar entrar en una llamada de espera infinita. –

+1

¿Las llamadas a 'window.print' están en la misma página o en páginas diferentes? Si son diferentes, ¿están en una nueva ventana/pestaña o iframe?¿O la misma pestaña, a través de un redireccionamiento? – apsillers

Respuesta

19

Se podría sustituir condicionalmente la función window.print():

// detect if browser is Chrome 
if(navigator.userAgent.toLowerCase().indexOf("chrome") > -1) { 
    // wrap private vars in a closure 
    (function() { 
     var realPrintFunc = window.print; 
     var interval = 2500; // 2.5 secs 
     var nextAvailableTime = +new Date(); // when we can safely print again 

     // overwrite window.print function 
     window.print = function() { 
      var now = +new Date(); 
      // if the next available time is in the past, print now 
      if(now > nextAvailableTime) { 
       realPrintFunc(); 
       nextAvailableTime = now + interval; 
      } else { 
       // print when next available 
       setTimeout(realPrintFunc, nextAvailableTime - now); 
       nextAvailableTime += interval; 
      } 
     } 
    })(); 
} 

lugar de utilizar un temporizador de seguridad/envoltura externa, puede utilizar una interna. Solo agregue esto y window.print se comporta de forma segura en Chrome y normalmente en cualquier otro lugar. (Además, los medios de cierre realPrintFunc, interval y nextAvailableTime son privados al nuevo window.print

Si necesita coordinar las llamadas a window.print entre múltiples páginas enmarcadas, podría configurar nextAvailableTime en la página principal, en lugar de en el cierre, por lo que todos los marcos pueden acceder a un valor compartido usando window.parent.nextAvailableTime.

+0

Este fragmento realmente funciona, sin embargo, debe tener en cuenta que las llamadas frecuentes para imprimir solo se bloquean cuando alguien cancela el cuadro de diálogo de impresión, por lo que el temporizador debe iniciarse solo cuando el cuadro de diálogo desaparezca, supongo que esto se logra almacenando un referencia de 'setTimeout' y borrarlo siempre que crees uno nuevo, O puedes establecer un indicador de ocupado cada vez que se inicie' setTimeout' y NO INICIAR uno nuevo cuando se establece el indicador. Gracias por su tiempo pensado –

+0

¿Este fragmento todavía funciona para algunas personas? Me doy cuenta de que sigo viendo el error "Ignorar llamadas demasiado frecuentes para imprimir" mientras utilizo el código como se da textualmente, y algunas variaciones que miran un indicador/tiempo de espera así que no se configurarán más funciones de tiempo de espera. Usando Chrome 22.0.1229.94. –

1

Mi solución sería llamar al window.print() con menos frecuencia. Puede intentar ajustar window.print() en un método propio e introducir un intervalo de tiempo mínimo antes de ejecutar window.print(). Puede tener algún tipo de cambio/animación en la interfaz de usuario para indicar que se está trabajando.

"Trabajar"

menos que piense que realmente piensa pulsar el botón de impresión más de una vez por segundo/cada pocos segundos ayuda? Quiero decir, si la operación window.print() lleva tanto tiempo, no es culpa de sus códigos y de todos modos debería haber un indicador de "esperar y ser paciente" en la interfaz de usuario.

+1

Sí, eso es lo que he hecho hasta ahora, un intervalo de 2 segundos es el mínimo de tiempo de espera antes de enviar otro comando de impresión –

1

Si todas sus impresoras son compatibles con la red, puede cambiar lo que sucede al hacer clic en el botón Imprimir. En lugar de imprimir la página, su aplicación podría enviar una solicitud a un servidor con la URL de la página para imprimir y con información sobre qué impresora imprimir.

El servidor inicia el proceso de impresión de forma manual y no habrá ningún navegador en el medio, lo que podría evitar que lo haga.

+1

Solución ordenada, lo haré cuando el programa está instalado en una red local, pero desafortunadamente el software está dirigido a redes de área local y de área amplia. –

3

He estado tropezando con el mismo problema, y ​​la solución más directa para mí fue simplemente crear una nueva ventana, escribir lo que necesito, cerrar e imprimirlo. No he tenido que lidiar con el límite de Chrome desde que lo cambié para que funcione de esta manera, y no necesito hacer ningún seguimiento.

print_window= window.open(); 
print_window.document.write(print_css + divToPrint[0].outerHTML+"</html>"); 
print_window.document.close(); 
print_window.focus(); 
print_window.print(); 
print_window.close(); 
1

En todas partes que veo mencionar este problema sugiere el uso de temporizadores. Sin embargo, no resuelven el problema y siento que Kamyar es la única persona que realmente lee la fuente y entiende el problema, así que me pregunto por qué aceptó la respuesta que hizo.

El problema principal es que la duración de la demora en Chrome es exponencial, por lo que para que estos temporizadores funcionen, su demora también debe aumentarse en cada uso que, por supuesto, sería muy molesto muy rápidamente. En realidad, Chrome solo aplica el retraso después de solicitudes de impresión canceladas, pero no podemos detectar si una impresión es exitosa o no.

La solución de Abathur en realidad funciona mucho mejor de lo que cabría esperar. No estoy seguro si lo usaré pero funciona.

La buena noticia:

1) El retraso es realmente reducido en versiones más recientes de Chrome. Ahora va: [2, 2, 2, 4, 8, 16, 32, 32, ...].

2) Alguien se hizo cargo del problema el 28 de agosto: http://code.google.com/p/chromium/issues/detail?id=50186 Si desea resolver este problema, por favor vaya a la estrella.

1

¡No más vueltas! Error fixed como parte de v.23 si no estoy equivocado.

lo tanto, si el ciclo de liberación es cada 6 semanas y Chrome 22 fue lanzado 25o de sep, a continuación, para el 6 de de noviembre de (aprox.) La solución estará en la versión estable de Chrome

+3

Tengo 23 y sigue siendo un problema. –

Cuestiones relacionadas