iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >window.print()局部打印三种方式(小结)
  • 597
分享到

window.print()局部打印三种方式(小结)

2024-04-02 19:04:59 597人浏览 八月长安
摘要

目录方法一: 通过开始、结束标记(startprint、endprint)来打印方法二:通过id选择器来替换内容打印,方法类似第一种方法三:通过动态创建iframe来打印(推荐的方法

首先准备要打印的内容,也可以打印时再填充,html中定义如下:

<!--startprint-->
<div id="printcontent" style="display:none">
${printContentBody}
</div>
<!--endprint-->

方法一: 通过开始、结束标记(startprint、endprint)来打印

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;//重新给页面内容赋值;
    return false;
}

方法二:通过id选择器来替换内容打印,方法类似第一种

function doPrint2(){
    if(getExplorer() == "IE"){
        pagesetup_null();
    }
    //根据div标签ID拿到div中的局部内容
    bdhtml=window.document.body.innerHTML; 
    var jubuData = document.getElementById("printcontent").innerHTML;
    //把获取的 局部div内容赋给body标签, 相当于重置了 body里的内容
    window.document.body.innerHTML= jubuData; 
    //调用打印功能
    window.print();
    window.document.body.innerHTML=bdhtml;//重新给页面内容赋值;
    return false;
}

function pagesetup_null(){                
    var hkey_root,hkey_path,hkey_key;
    hkey_root="HKEY_CURRENT_USER";
    hkey_path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\";
    try{
        var RegWsh = new ActiveXObject("WScript.shell");
        hkey_key="header";
        RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"");
        hkey_key="footer";
        RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"");
    }catch(e){}
}

function getExplorer() {
    var explorer = window.navigator.userAgent ;
    //ie 
    if (explorer.indexOf("MSIE") >= 0) {
        return "IE";
    }
    //firefox 
    else if (explorer.indexOf("Firefox") >= 0) {
        return "Firefox";
    }
    //Chrome
    else if(explorer.indexOf("Chrome") >= 0){
        return "Chrome";
    }
    //Opera
    else if(explorer.indexOf("Opera") >= 0){
        return "Opera";
    }
    //Safari
    else if(explorer.indexOf("Safari") >= 0){
        return "Safari";
    }
}

方法三:通过动态创建iframe来打印(推荐的方法)(210616更新)

这里要注意判断iframe是否存在,防止反复使用时,iframe重复创建消耗内存

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="KeyWords" content="">
  <meta name="Description" content="">
  <title>Document</title>
 </head>
 <body>
 <button onclick="doPrint3()">打印</button>

<!--startprint-->
<div id="printcontent" style="display:none">
这里可以自己填充打印内容
</div>
<!--endprint-->

<script type='text/javascript'>
function doPrint3(){
    
    //判断iframe是否存在,不存在则创建iframe
    var iframe=document.getElementById("print-iframe");
    if(!iframe){  
            var el = document.getElementById("printcontent");
            iframe = document.createElement('IFRAME');
            var doc = null;
            iframe.setAttribute("id", "print-iframe");
            iframe.setAttribute('style', 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;');
            document.body.appendChild(iframe);
            doc = iframe.contentWindow.document;
            //这里可以自定义样式
            doc.write('<style media="print">@page {size: auto;margin: 0mm;}</style>'); //解决出现页眉页脚和路径的问题
            doc.write('<div>' + el.innerHTML + '</div>');
            doc.close();
            iframe.contentWindow.focus();            
    }
    setTimeout(function(){ iframe.contentWindow.print();},50)  //解决第一次样式不生效的问题
    if (navigator.userAgent.indexOf("MSIE") > 0){
        document.body.removeChild(iframe);
    }   
}
</script>
 </body>
</html>

对打印预览页面的居中或者横向、纵向设置可以参考这个链接:https://blog.csdn.net/ZHANGLIZENG/article/details/91865007

使用方法一、二时,弊端有2个:

1)由于替换来当前页面的内容,从而当取消打印时,会使原来的页面一些fORM表单失效。

2)当前页面中的样式会影响到打印的内容中的样式。

所以这里推荐使用iframe来创建,并且可以自定义样式。

以上内容在谷歌浏览器下测试通过,其他浏览器未做验证。

190622更新说明:

看到两个伙伴留言,我说说后面发生的事儿吧,我当时做的是电子面单的打印,但是发现第三种方法打印出的电子面单的条码还是不太清洗,字体偏淡。

所以最后也没有用第三种方法,直接使用lodop来打印了。

但是本身第三种方法测试是可行的。

20210616更新说明:

结合评论中的反馈,针对第三种方式解决了页眉页脚显示的问题、第一次出现样式不生效的问题。

到此这篇关于window.print()局部打印三种方式(小结)的文章就介绍到这了,更多相关window.print()局部打印内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: window.print()局部打印三种方式(小结)

本文链接: https://www.lsjlt.com/news/153038.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作