JS实现快递单打印功能【推荐】

作者:计算机教程

目前正在做浏览器端采用JS方式实现打印这么一个功能,JS打印实现的方法很多,但是兼容各个浏览器实现打印预览的功能有些棘手,现将实现的内容及遇到的问题记录下来,希望有大牛看到所提的问题后可以给予解答,在此感谢啦。

最近做项目需要打印快递单,在网上搜索了一下发现直接给出代码的比较少。

1.JS实现打印的方式

 首先说一下js网页打印的几种方法:

方式一:window.print()

1.window.print()

window.print();会弹出打印对话框,打印的是window.document.body.innerHTML中的内容,下面是从网上摘到的一个局部打印的例子,该例子的不足是打印会修改页面的内容。

会弹出打印对话框

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>局部打印案例</title> 
<script type="text/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();   
}   
</script> 
</head> 

<body> 
<p>1不需要打印的地方</p> 
<p>2这里不要打印啊</p> 
<!--startprint--><!--注意要加上html里star和end的这两个标记--> 
<h1>打印标题</h1> 
<p>打印内容~~</p> 
<!--endprint--> 
<button type="button" onclick="doPrint()">打印</button> 
<p>不打印的地方啊哈哈哈哈</p> 
<p>2</p> 
</body> 
</html> 

2.使用html 标签引入Webbrowser控件

方式二:使用html 标签<object>引入Webbrowser控件

 这种方式是其只兼容IE10以下的浏览器,其他浏览器不可使用

这种方式是其只兼容IE,其他浏览器不可使用,同时IE10以下的浏览器才可以使用,调用方式如下:

3.document.execCommand(”print”)

<body> 
  <object id="WebBrowser" classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height="0" width="0"> </object> 
</body> 
<script> 
  WebBrowser.ExecWB(1,1) //打开  
  WebBrowser.ExecWB(2,1) //关闭现在所有的IE窗口,并打开一个新窗口  
  WebBrowser.ExecWB(4,1) //保存网页 
  //--------------- 常用 ---------------   
  WebBrowser.ExecWB(6,1) //打印  
  WebBrowser.ExecWB(7,1) //打印预览  
  WebBrowser.ExecWB(8,1) //打印页面设置  
  //-------------------------------------  
  WebBrowser.ExecWB(10,1) //查看页面属性  
  WebBrowser.ExecWB(15,1) //撤销  
  WebBrowser.ExecWB(17,1) //全选  
  WebBrowser.ExecWB(22,1) //刷新  
  WebBrowser.ExecWB(45,1) //关闭窗体无提示 
</script> 

类似window.print() 

这种方式优势是在IE下可以弹出打印预览,这是打印很人性化的功能,但是遗憾的是高版本的IE浏览器不支持WebBrowser了

 **4.采用JQuery插件

方式三:采用document.execCommand(”print”)

5.用浏览器打印第三方插件如lodpod等**

该方式也兼容各个版本的浏览器,同window.print()一样,其启动的是打印对话框,chrome的打印对话框自带预览功能,但是IE、火狐仅仅只弹出打印设置对话框,没有预览功能。

由于我这边不需要兼容ie10以下,而且个人不喜欢在react项目中引入jquery,同时嫌第三方插件太麻烦,最终选择window.print(),具体这几种方法区别大家可以去网上查一下,这类博客很多。

方式四:采用JQuery插件

 废话不多说,直接贴代码

使用jQuery浏览插件可以很方便的进行局部打印,常用的插件有:

<!DOCTYPE html>
<html>
<head>
  <meta charset=" utf-8">
  <title>打印</title>
  <link rel="stylesheet" href="./print.css" rel="external nofollow" type="text/css">
  <style type="text/css">
    @import url("print.css") print;
  </style>
  <script language="javascript">
      function remove_ie_header_and_footer() {
        let HKEY_Root, HKEY_Path, HKEY_Key;
        HKEY_Root = "HKEY_CURRENT_USER";
        HKEY_Path = "\Software\Microsoft\Internet Explorer\PageSetup\";
        try {
          let 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 printPage(printpage)
      {
        if (!!window.ActiveXObject || "ActiveXObject" in window) { //是否ie
          remove_ie_header_and_footer();
        }
        let newstr = printpage.innerHTML;
        let oldstr = document.body.innerHTML;
        document.body.innerHTML =newstr;
        window.print();
        document.body.innerHTML=oldstr;
        return false;
      }
      window.onload = function()
      {
        let bt=document.getElementById("bt");
        let page=document.getElementById("printPage");
        bt.onclick=function()
        {
          printPage(page);
        }
      }
  </script>
</head>
<body>
<!--startPrint-->
<div id="printPage" >
  <div id="emsType" class="left">
    标准快递
  </div>
  <div id="barcode" class="right">
    二维码
  </div>
  <div id="sender" class="left">
    寄件:
    xxxx
  </div>
  <div id="area" class="right">
    xxx区
  </div>
  <div id="recipient" class="left">
    收件:
    xxxx人xxxx手机xxxxxxx
    xxxxxxxx小区
  </div>
  <div id="pay" class="left">
    付款方式:

    <br/>
    计费重量(KG):

    <br/>
    保价金额(元):

    <br/>
  </div>
  <div id="delivers" class="right">
    收件人代收人:

    <br/>
    签收时间:

    年

    月

    日

    时
    <br/>
    快件送达收货人地址,经收件人或收件人允许的代收人签字,视为送达
  </div>
  <div id="order" class="left">
    订单号:

    件数:

    重量(KG):


  </div>
  <div id="divide" class="left">
  </div>
  <div id="number" class="left right">
    条码
  </div>
  <div id="send" class="left right">
    寄件:

  </div>
  <div id="pickup" class="right">
    收件:

  </div>
  <div id="remark" class="left">
    备注:

  </div>
  <div id="net" class="left">
    www.ems.cn      客服电话:11183
  </div>
  <div id="QRCode" class="right">
    二维码
  </div>
</div>
<!--endPrint-->
<input name="print" class=" no-print" type="button" id="bt" value="点击打印" />
</body>
</html>

1)jquery.print.js 下载地址:https://github.com/DoersGuild/jQuery.print

通过css3 print控制打印样式,不需要打印的可以通过添加 class为noPrint来隐藏

2)jquery.print-preview.js 下载地址:https://github.com/etimbo/jquery-print-preview-plugin

@media print{
  body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin:0; padding:0; }
  body, button, input, select, textarea { font:12px/1.5 arial,"黑体", 5b8b4f53; }
  h1, h2, h3, h4, h5, h6{ font-size:100%; }
  address, cite, dfn, em, var { font-style:normal; }
  code, kbd, pre, samp { font-family:couriernew, courier, monospace; }
  small{ font-size:12px; }
  ul, ol { list-style:none; }
  a { text-decoration:none; }
  a:hover { text-decoration:underline; }
  sup { vertical-align:text-top; }
  sub{ vertical-align:text-bottom; }
  legend { color:#000; }
  fieldset, img { border:0; }
  button, input, select, textarea { font-size:100%; }
  table { border-collapse:collapse; border-spacing:0; }
  .no-print{
    display:none;
  }
  @page{
    size: 100mm 150mm;
    margin: 1.75mm;
  }
  #printPage {
    width: 96mm;
    height: 146mm;
    position: relative;
    border: 1px dotted #000000;
    box-sizing: border-box;
  }
  #printPage span{
    margin-left: 2mm;
  }
  .left {
    border-left: 1px dotted #000000;
    border-right: 1px dotted #000000;
    border-bottom: 1px dotted #000000;
    left: 0;
  }
  .right {
    border-right: 1px dotted #000000;
    border-bottom: 1px dotted #000000;
    /*right: 0;*/
  }
  .deviation{
    margin-left: 2mm;
  }
  #emsType{
    width: 40mm;
    height: 14mm;
    position: absolute;
    top: 0;
    padding-top: 6mm;
    font-size: 20px;
    border-top: 1px dotted #000000;
  }
  #barcode{
    width: 56mm;
    height: 20mm;
    position: absolute;
    top: 0;
    left: 40mm;
    border-top: 1px dotted #000000;
  }
  #sender{
    width: 46mm;
    height: 15mm;
    font-size: 12px;
    position: absolute;
    top: 20mm;
  }
  #area{
    width: 50mm;
    height: 15mm;
    position: absolute;
    top: 20mm;
    left: 46mm;
  }
  #recipient{
    width: 96mm;
    height: 17mm;
    position: absolute;
    left: 0;
    top: 35mm;
    font-size: 12px;
  }
  #pay{
    width: 40mm;
    height: 14mm;
    position: absolute;
    top: 52mm;
    font-size: 12px;
  }
  #delivers{
    width: 56mm;
    height: 14mm;
    position: absolute;
    top: 52mm;
    left: 40mm;
    font-size: 12px;
  }
  #order{
    width: 96mm;
    height: 20mm;
    position: absolute;
    left: 0;
    top: 66mm;
    font-size: 12px;
  }
  #divide{
    width: 96mm;
    height: 4mm;
    position: absolute;
    left: 0;
    top: 86mm;
  }
  #number{
    width: 96mm;
    height: 15mm;
    position: absolute;
    left: 0;
    top: 90mm;
    font-size: 12px;
  }
  #send{
    width: 40mm;
    height: 17mm;
    position: absolute;
    top: 105mm;
    font-size: 12px;
  }
  #pickup{
    width: 56mm;
    height: 17mm;
    position: absolute;
    top: 105mm;
    left: 40mm;
    font-size: 12px;
  }
  #remark{
    width: 68mm;
    height: 17mm;
    position: absolute;
    top: 122mm;
    font-size: 12px;
  }
  #net{
    width: 68mm;
    height: 7mm;
    position: absolute;
    top: 139mm;
    font-size: 12px;
  }
  #QRCode{
    width: 28mm;
    height: 24mm;
    position: absolute;
    top: 122mm;
    left: 68mm;
  }
  #note{
    font-size: 6px;
  }
}

这两种方式使用都很简单,1)通过$("#id").print(/*options*/);调用;2)通过$('#id').printArea(/*options*/); 其中的option可选项可以在下载地址下载下来后看示例代码,一般options不用传即可,示例代码如下:

一开始在ff和chrome打印出来的会有细微差别,这是由于浏览器自带样式的影响,清除浏览器样式后基本没区别了还有就是chrome需要将浏览器设置里自定义字体中最小字体调到最低,不然会影响打印效果 ff这需要在打印里设置页头页脚为空白,不然打印的带页头页脚。 

<html> 
<head> 
<meta http-equiv=Content-Type content="text/html; charset=utf-8"> 
<title>JQuery打印</title> 
<script type="text/javascript" src="./js/jquery-3.1.1.min.js"></script> 
<script language="javascript" src="./js/jquery.print.js"></script> 
</head> 

<body style='margin:0 auto;text-align:center;'> 
<button id='button_print' name='button_print' onclick="javascript:printit()>打印</button> 
<div id='ganburenmianbaio' class=WordSection1 style='width:750px;margin:0 auto;text-align:center;vertical-align: middle;'> 
</div> 
</body> 
<script language="javascript"> 
function printit(){ 
  $("#ganburenmianbaio").print({iframe:true,prepend:'<br/>'}); 
} 
</script> 
</html> 

 此外chrome打印出来的比ff清楚,这点原因我还没搞清楚。 

方式五:采用浏览器打印第三方插件

 贴两张打印预览,上面是chrome,下面是ff

该方式需要用户浏览器安装相关的第三方插件,用户体验不好,故在此不细述了。

图片 1
图片 2

2.打印预览

您可能感兴趣的文章:

chrome浏览器、win10自带的IE浏览器 调用打印弹出的打印设置界面中包含打印预览部分,故其通过上面的打印函数的调用即可实现。

本文由nba买球发布,转载请注明来源

关键词: