Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

804
Vistas
¿Retrasar window.print () hasta que la página se haya cargado dentro de una solicitud ajax para evitar una pantalla de impresión en blanco?

Lo que estoy tratando de hacer con este código es realizar una solicitud ajax a algo que genera códigos de barras y los devuelve para imprimirlos. Cuando hago la solicitud genera todo correctamente pero la ventana de impresión está en blanco. Si cancelo la ventana de impresión, la ventana subyacente tiene los códigos de barras correctos para imprimir. Sospecho que necesito retrasar el .print() hasta que la ventana secundaria se haya cargado por completo, pero la solución se me escapa. ¡Gracias de antemano por cualquier ayuda!

 var barcode = $.ajax({ url: "barcode.php", method: "POST", data: { name : name, text : text, number : numLines }, }); var printText; barcode.done(function( jqXHR, textStatus ) { printText = jqXHR; var WindowObject = window.open(); WindowObject.document.writeln(printText); WindowObject.focus(); WindowObject.print(); });

Todo esto está envuelto en un $( documento ).ready(function(){});

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Después de investigar un poco, encontré dos respuestas: una que probablemente sea mejor en cuanto a convenciones y otra que es más fácil de implementar, pero (lamentablemente) también bastante complicada.

Para la primera solución, solo está simplificando la segunda solución. Simplemente proporcione una URL a window.open , lo que da como resultado una página que tendrá el contenido y un script que llama a window.print cuando todo esté cargado. Esto debería ser fácil ya que parece que está alojando las páginas aquí, por lo que puede hacer que "barcode.php" acepte los parámetros GET y todo lo que necesita hacer es agregar la funcionalidad de impresión a la página.

 // Assumes parameters provided are safe to use in a url. window.open('barcode.php?name=' + name + '&text=' + text + '&number=' + number');

Luego, en el contenido que se devuelve desde "barcode.php", agregue un script:

 document.onload = function() { window.focus(); window.print(); window.close(); };

Esto es mucho mejor que cualquier otra solución que se me ocurra, especialmente porque debería (no probé esto, así que realmente no lo sé) poder usar el evento de load o onload .


Solo brindo la solución hacky por dos razones: dediqué un poco de tiempo a ella y puede resultar útil algún día. Sin embargo, me gustaría enfatizar que esta segunda solución es bastante tonta. Aconsejaría no usarlo en un entorno de producción y

Si quieres usarlo, así es como funciona:

  • Crea una ventana con window.open
  • write (o writeln ) cualquier contenido que desee en la nueva ventana.
  • write un <script> que contenga alguna funcionalidad para la nueva ventana:
    • Compruebe si document.readyState está "completo"; si es así, haga su procedimiento de impresión. De lo contrario:
    • Use setTimeout para volver a verificar document.readyState como se indicó anteriormente. (Básicamente, repita de alguna manera).
    • Hacemos esto porque no podemos usar el evento de load o onload porque tampoco se dispara.

Aquí hay un código de ejemplo para mostrar eso:

 var WindowObject = window.open(); WindowObject.document.write('<img src="http://i.imgur.com/Jvh1OQm.jpg" />'); // This is your content to be printed WindowObject.document.write('<script>(' + (function() { function checkReadyState() { if (document.readyState === 'complete') { window.focus(); window.print(); window.close(); } else { setTimeout(checkReadyState, 200); // May need to change interval } } checkReadyState(); }) + ')();</sc' + 'ript>');

Nuevamente, voy a enfatizar que esta es una forma muy mala de hacer lo que se quiere. Solo proporciono este conocimiento porque siento que posiblemente podría ser útil para alguien.

over 4 years ago · Santiago Trujillo Denunciar

0

Podría intentar usar WindowObject.onload = function () { ... }; Por aquí:

 barcode.done(function( jqXHR, textStatus ) { printText = jqXHR; var WindowObject = window.open(); WindowObject.onload = function () { WindowObject.document.writeln(printText); WindowObject.focus(); WindowObject.print(); }; });
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda