Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

800
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!