Chrome print blank page

12,911

Solution 1

It looks like it's attempting to print before the <img> has loaded, move the call to print inside an event handler for the load event of window by opening the link as a data URI or Blob, for example

var code = '\
    <html>\
        <head>\
            <title></title>\
            <script>\
    function printFunction() {\
        window.focus();\
        window.print();\
        window.close();\
    }\
    window.addEventListener(\'load\', printFunction);\
            </script>\
        </head>\
        <body><img src="'+src+'" width="300"></body>\
    </html>';

window.open('data:text/html,' + code, '_blank', 'width=600,height=600');

Don't forget you may need to HTML encode the tags in code


You could probably just listen for load on the <img> instead, but if you ever do anything more complicated than tring to print a single image you may find it breaks again in future

doc.write('<img onload="printFunction();" src="'+src+'" width="300">');

Where printFunction is the print function for all browsers

Solution 2

I encountered the same problem in Chrome. You can try these approaches, the first one worked for me. setTimeout didn't work for me (had to edit this later).

function printDiv(divName) {

    var printContents = document.getElementById(divName).innerHTML;
    w = window.open();

    w.document.write(printContents);
    w.document.write('<scr' + 'ipt type="text/javascript">' + 'window.onload = function() { window.print(); window.close(); };' + '</sc' + 'ript>');

    w.document.close(); // necessary for IE >= 10
    w.focus(); // necessary for IE >= 10

    return true;
}

setTimeout:

<div id="printableArea">
      <h1>Print me</h1>
</div>

<input type="button" onclick="printDiv('printableArea')" value="print a div!" />



    function printDiv(divName) {

        var printContents = document.getElementById(divName).innerHTML;
        w = window.open();
        w.document.write(printContents);

        w.document.close(); // necessary for IE >= 10
        w.focus(); // necessary for IE >= 10

        setTimeout(function () { // necessary for Chrome
            w.print();
            w.close();
        }, 0);

        return true;
    }

Solution 3

You need to wait for the image to finish loading:

var img = new Image();
img.src = src;
img.style.width = '300px';
img.onload = function(){
  doc.write(img);
};
Share:
12,911
user1930254
Author by

user1930254

Updated on June 17, 2022

Comments

  • user1930254
    user1930254 about 2 years

    I have an old javascript code to print images, if a user clicks on the thumbnail. It used to work just fine, but lately (only in Chrome!) there is a blank page in preview.

    Here is a demonstration in JsBin: http://jsbin.com/yehefuwaso/7 Click the printer icon. Now try it in Firefox; it will work as expected.

    Chrome: 41.0.2272.89 m

    Firefox: 30.0, 36.0.1

    function newWindow(src){
    
      win = window.open("","","width=600,height=600");
        var doc = win.document;
        // init head
        var head = doc.getElementsByTagName("head")[0];
        // create title
        var title = doc.createElement("title");
        title.text = "Child Window";
        head.appendChild(title);
        // create script
        var code = "function printFunction() { window.focus(); window.print(); }";
        var script = doc.createElement("script");
        script.text = code;
        script.type = "text/javascript";
        head.appendChild(script);
        // init body
        var body = doc.body;
        //image
        doc.write('<img src="'+src+'" width="300">');
    
        //chrome
        if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
    
          win.printFunction();               
    
        } else {
            win.document.close();
            win.focus();
            win.print();
            win.close();
        }
    }