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(){});
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:
window.openwrite (o writeln ) cualquier contenido que desee en la nueva ventana.write un <script> que contenga alguna funcionalidad para la nueva ventana:document.readyState está "completo"; si es así, haga su procedimiento de impresión. De lo contrario:setTimeout para volver a verificar document.readyState como se indicó anteriormente. (Básicamente, repita de alguna manera).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.
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(); }; });