window.print()打印网页中指定内容的实现方法

方法一:

正常情况下的打印是使用 window.print(); 直接整页打印,但如果需要打印网页中定义的部分内容,则可使用如下的方法:
1、在页面的代码头部处加入JavaScript:
<script language=javascript>
function doPrint() {
bdhtml=window.document.body.innerHTML;
sprnstr="<!--startprint-->"; //开始打印标识字符串有17个字符
eprnstr="<!--endprint-->"; //结束打印标识字符串
prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17); //从开始打印标识之后的内容
prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr)); //截取开始标识和结束标识之间的内容
window.document.body.innerHTML=prnhtml; //把需要打印的指定内容赋给body.innerHTML
window.print(); //调用浏览器的打印功能打印指定区域

window.document.body.innerHTML=bdhtml;//重新给页面内容赋值;
}

2、在页面正文处加上<!--startprint-->与<!--endprint-->标识。
也就是在需要用户打印保存的正文所对应的html处附加上。同时,如果采用小偷程序获得远程数据并需打印,可将此等数据置于该定义标签之内即可。
3、截取内容部分已完成,现在加个“打印”的链接:
<a href="javascript:;"  onClick="doPrint()">打印</a>
<script language=javascript>
function doPrint() {
bdhtml=window.document.body.innerHTML;
sprnstr="<!--startprint-->";
eprnstr="<!--endprint-->";
prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17);
prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr));
window.document.body.innerHTML=prnhtml;
window.print();
}

要打印的内容在<!--startprint-->startprint与endprint之间的区域<!--endprint-->里。
<a href="javascript:;" onClick="doPrint()">打印</a>  

 

-----------------------------------------------------------------------------------------=====----

方法二:

function PrintPage1()
{  
var newstr = document.getElementById("printPage").innerHTML;
var oldstr = document.body.innerHTML;
document.body.innerHTML = newstr;
window.print();
document.body.innerHTML = oldstr;
return false;

}


方法三:

使用jquery.PrintArea.js 插件

用法:

$("div#printmain").printArea();  


但还是会打印DIV后面的内容,这里可以使用CSS控制打印分页

<div style="page-break-after: always;"></div> 

有时用CSS控制分页了但还是会连续打印页面,这里就可以用上PrintArea 插件中的属性参数。


PrintArea部分源码:

  1. var modes = { iframe : "iframe", popup : "popup" };  
  2. var defaults = { mode     : modes.iframe,  
  3.                     popHt    : 800,  
  4.                     popWd    : 800,  
  5.                     popX     : 200,  
  6.                     popY     : 200,  
  7.                     popTitle : '',  
  8.                     popClose : false ,  
  9.                     twoDiv   : '', //自已扩展的属性,为满足变态需求  
  10.                     pageTitle: ''};//自已扩展的属性,为满足变态需求  



可以看出插件中定义的属性格式为JSON,下面介绍部分属性

modes定义了两个属性,指定popup时会打开新窗口,可以视为打印预览页面,默认为iframe。

@popClose | [boolean] | (false),true  打印完成后是否开闭预览页面,默认为false(不关闭)。

  1. $("div#printmain").printArea({mode:"popup",popClose:true});  


这样就可以指定DIV打印了。

下面说一下我新增两个属性的用途
twoDiv:
        需要打印的第二个DIV ,当然会是第二页,这个页面比较长,需要自动分页,并且表格中每行都不一样,有些行跨了多行,这里打印出来,一行可能会打印在两张纸上。

pageTitle:
        第二个DIV分成多页里,每一页的表头都需要一样,这个参数就是公用表头。

这两个参数都对应着页面中的DIV,如:

  1. <div id="pageTitle" style="display: none;">  


页面定义好后,我们看看插件中是如何处理我们的页面的。

  1. writeDoc.open();  
  2. writeDoc.write(html); //打找一个窗口关写窗口中的HTML代码   
  3. writeDoc.close();  
  4.   
  5. printWindow.focus();  
  6. printWindow.print();  



下面是生成html的代码

  1. html+=docType() + "<html>" + getHead() + getBody(thisPage) + "</html>";  


插件中都定义了相义的方法,我没有做任何修改,这里我就不粘贴了。


下面是我的思路:
       需在将一个DIV中的内容分成多页,且一行不跨多页,我们就得在生成html 代码上下功夫了。

       首先找出DIV中的所有行,当公共表头加上这些行后高度达到一页,就需要分页了,这里就有可以一页中最后一行刚好跨了多页,将这一行保存下来,放到下一页。

       每一页生成完成后都需要在HTML标签后面加上CSS分页标记,这样就打印机就会乖乖的分页。
     
       说明一下,生成的预览页面一页就是一个HTML页面,它有对应的表头与DTD信息。

       有人可能明明预览只有4页,而打印出来总会多一页,这时你需要检验一下你生成的页面中分页标记是不是在HTML标签之前。
       分面标记一定要在HTML标签之后,这样可解决打印多打一页问题。

PS:  
       下面我会传上我修改过后的JS插件,由于我项目周期的原因,代码中很多部分都是写死了,只是为了解决本次打印的问题。所在代码中写得很乱,希望大家将究着看
      
       同事也希望哪位能够再优化一下,使之通用。

转自:http://www.cnblogs.com/mizzle/p/3889512.html

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
如果需要打印页面指定内容,可以使用 HTML 的打印样式表(@media print)。这样可以在打印时隐藏不需要打印内容,并且格式化需要打印内容。下面是一个示例代码: ```html <!DOCTYPE html> <html> <head> <title>Print Example</title> <style> @media print { .no-print { display: none; } } </style> </head> <body> <h1 class="no-print">Print Example</h1> <p class="no-print">This is an example of printing an HTML page using JavaScript.</p> <div id="print-content"> <p>This is the content to be printed.</p> </div> <button class="no-print" onclick="printContent()">Print</button> <script> function printContent() { var content = document.getElementById("print-content").innerHTML; var printWindow = window.open('', '', 'height=400,width=800'); printWindow.document.write('<html><head><title>Print Content</title></head><body>'); printWindow.document.write(content); printWindow.document.write('</body></html>'); printWindow.document.close(); printWindow.print(); } </script> </body> </html> ``` 在上面的示例,我们在 HTML 定义了一个样式表(@media print),用于在打印时隐藏指定的元素(在本例是标题和说明)。然后我们在页面定义了一个需要打印内容(在本例是一个 div 元素),并且给这个 div 元素添加了一个 id(print-content)。接着我们定义了一个打印按钮,并且给按钮添加一个 onclick 事件,该事件会调用 printContent() 函数。 在 printContent() 函数,首先获取需要打印内容(即 print-content 元素的 innerHTML),然后创建一个新的浏览器窗口(使用 window.open() 方法)。接着我们在新窗口写入需要打印内容,并且调用 print() 方法进行打印。 需要注意的是,在新窗口写入 HTML 代码时,需要在 head 标签添加 title 标签,否则在某些浏览器可能无法正常打印

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值