在一个项目中,有一个功能需求
在一个页面上,有一个表单,表单包括textbox, radiobutton, checkbox, textarea等控件
用户填写表单后,按下submit按钮提交表单
现在用户有个需求,他们希望在这个页面上增加一个print按钮或者链接
点击print时,可以打印
最简单的想法就是,加上一个print的链接,然后调用javascript中的window.print()能打印
我最初是这样写代码的
在网页上增加一个print的链接
<a href="javascript:void(0)" onclick="printProduct()"><i class="fa fa-print" aria-hidden="true"></i>Print this page</a>
或者,也可以写成这样
<a href="javascript:printProduct()"><i class="fa fa-print" aria-hidden="true"></i>Print this page</a>
然后,javascript的printProduct方法写成如下
function printProduct() { document.body.innerHTML = document.getElementById("printDiv").innerHTML; window.print(); history.go(0); }
页面上,需要打印的表单写在id=printDiv的div中
实现这个功能后,发现几个问题
1.在页面填写好表单内容后,点击打印按钮时,打印出来的表单内容是空的,没有任何内容
2. 打印完成后,回到网页上,刚才网页上填写的内容,也全部都消失了
为什么会出现这种情况呢,怎么解决呢?
产生这个问题的原因是
$("#form").html()时,没有包含你在网页上填写的数据。 为了解决这个问题,你需要用html()之前,把你在网页上填入表单的所有数据都val(\'\')先
也就是说,在调用window.print()之前,我们需要一个javascript来bindData
这里,我写了一个bindData的javascript函数
function bindData() { $("input[type=\'text\'],select option").each(function () { $(this).attr(\'value\', $(this).val()); }); $("input[type=\'radio\'],input[type=\'checkbox\']").each(function () { if ($(this).attr(\'checked\')) $(this).attr(\'checked\', true); else $(this).removeAttr(\'checked\'); }); $("select option").each(function () { if ($(this).attr(\'selected\')) $(this).attr(\'selected\', true); else $(this).removeAttr(\'selected\'); }); $(\'textarea\').each(function () { $(this).html($(this).val()); }); }
这样,把这个javascript函数放在打印之前。上面发生的第1个问题就解决了
我们在看第2个问题,点击打印按钮后,回到网页,发现网页上,你之前填写的内容都没有了
为了解决这个问题,我们采用另一种方式
我们在Javascript代码中,临时创建一个window窗口,然后把你要打印的内容写入这个临时的window窗口,打印完成后,再关闭这个新创建的窗口
代码如下
function printProduct() { bindData(); var printContent = document.getElementById("printDiv").innerHTML; var newWindow = window.open(); newWindow.document.write(printContent); newWindow.print(); newWindow.close(); }
到这里,整个网页表单打印功能就完成了