javascripthtmlprintingvisibilityprintthis

Getting blank page sent to printer using a hidden div method


I am using a code snippet that I found to display a multipage form using visibility hidden. There is a very good possibility that all of my problem stems from this method. That resource was from here: http://www.devx.com/webdev/Article/10483/0/page/2

It is a fairly straightforward way to display multiple pages of a form...it probably was never intended to be able to allow printing.

<html>
<head>

<script type="text/javascript" src="jquery-1.10.2.min.js"></script>
<script language="JavaScript">

$.getScript("printThis.js", function(){
});

var currentLayer = 'page1';
function showLayer(lyr){
hideLayer(currentLayer);
document.getElementById(lyr).style.visibility = 'visible';
currentLayer = lyr;
}

function hideLayer(lyr){
document.getElementById(lyr).style.visibility = 'hidden';
}
function showValues(form){
var values = '';
var len = form.length - 1; //Leave off Submit Button
for(i=0; i<len; i++){
    if(form[i].id.indexOf("C")!=-1||form[i].id.indexOf("B")!=-1)
        continue;
    values += form[i].id;
    values += ': ';
    values += form[i].value;
    values += '\n';
}
alert(values);
}
</script>

<style>
body{
font: 10pt sans-serif;
}
.page{
position: absolute;
top: 10;
left: 100;
visibility: hidden;
}
</style>
</head>

<body>
<form id="multiForm" action="App1.php" method="POST" action="javascript:void(0)" onSubmit="showValues(this)" id="app">

<div id="page1" class="page" style="visibility:visible;">

Applicant Name: <input type="text" size="50" name="name1" >

</form>
<p><input type="button" id="C1" value="Continue" onClick="showLayer('page2')"></p>
</div>

<div id="page2" class="page">

This is Page 2
<br>
<input type="button" id="B1" value="Go Back" onClick="showLayer('page1')">
<input type="button" id="B2" value="Print App" onClick="$('#page1').printThis({})">
<br><br>

</div>
</form>
</body>
</html>

The "Print App" button is properly calling the printThis plugin. However, I get no content from the page1 DIV section. All that is printed is the normal header portion (Page 1 of 1) in the upper right and about:blank in lower left and date in lower right of page…no content, which with my sample file should be Applicant Name input box.

I assume that this is because the DIV for page1 is set to "hidden" while the content of page2 is being displayed. If I substitute "page2" in the button call then I get the content from page2 as expected.

So...I guess what I am after is a way to temporarily change the DIV being referenced in the printThis button call to be visible just long enough to perform the page print.

Any ideas?


Solution

  • I'm the plugin author - you need to incorporate the print media query into your css.

    This would also help users that select file > print or control + P, as it will show all form elements.

    The print media query allows you to make styling changes specifically for the printed page.

    Example:

    @media print {
         #page1, #page2 {
            display: block;
            visibility: visible;
            position: relative;
         }
    }
    

    You include this in your css.

    Additionally, based on your above code - you have css and javascript inline in your page. You should consider moving both to an external files, for maintenance and improved code standards.

    printThis won't work with your current setup, because the plugin looks for the container (selector) you have specified and any linked css in the head of the document.

    So for the above, you can do the following:

    <!-- move all of this to the bottom of the page for performance -->
    <script type="text/javascript" src="jquery-1.10.2.min.js"></script>
    <script type="text/javascript" src="printThis.js"></script>
    <script type="text/javascript" src="myJavascript.js"></script>
    <!-- the above file is your javascript externalized, remove $.getScript, wrap in $(document).ready() -->
    

    Then put this in your head:

    <link type='text/css' rel='stylesheet' href='style.css'>
    <!-- contains your css from the page, including the print media query -->