ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

原生js打印插件Print.js

2020-11-30 15:03:19  阅读:427  来源: 互联网

标签:function inputs 插件 dom js var Print document


网页打印功能在很多的网站系统中都会使用到。比如说报表打印功能等。
以下是在Jquery插件库中找到的一款原生js打印插件,代码清洁简单,封装的代码也很好理解。

index.html页面代码

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Print.js 演示</title>
<style>
	html,body{
		margin: 0;
		padding: 0;
	}
	body{
		font-size: 14px;
		color: #333;
	}
	.fr{
		float:right;
	}
	.vt{
		vertical-align: top;
	}
	
  .wrap{
    margin: 0 auto;
    padding: 20px;
    width: 640px;
    border:1px solid #ccc;
  }
  .form .row{
    padding: 10px 0 0;
  }
  .btn{
     display: block;
     margin: 20px auto;
     padding: 8px 16px;
  }
</style>
</head>
<body>

<div id="wrap" class="wrap">
  <div class="con">
      <h1>萨摩耶犬</h1>
      <ul>
        <li>
          <h3>发展历史</h3>
          <img class="fr" src="files/dog.jpg" width="200">
          萨摩耶犬是因西伯利亚牧民族萨莫耶德人而得名,原产位于俄罗斯北极地区,起源于17世纪。原始的萨摩耶犬是由如今定居在乌拉尔山以东的极地地区的萨莫耶德游牧部落所培育的。在19世纪末,有毛皮商人将此犬输入美国及欧洲等地。而后该犬传到英国,因其雪白的毛色深得人们喜爱。20世纪初期,北极探险的热潮中,此犬因其天生的特性为探险者提供许多帮助,而获得殊荣。
        </li>
        <li>
          <h3>外形特征</h3>
          直立的耳朵很厚,呈三角形,尖端略圆。两耳分的较开。眼睛颜色深为佳,两眼凹陷,间距大,杏仁形,下眼睑向耳基部倾斜。鼻子颜色有黑色、棕色、肝褐色,鼻的颜色有时随年龄和气候改变。嘴唇多数是黑色,嘴角上翘。牙齿强壮,剪状咬合。背部直,中等长度,肌肉丰满。脚大而长,比较平,似野兔的足,趾稍分开;趾尖呈拱形肉垫厚而硬,趾之间有保护的毛,脚圆形或似猫足。尾巴比较长,自然下垂时可达 跗关节部,尾部被毛长而厚,当犬处于戒备状态时,尾上翘高于背部或位于背部一侧,休息时下垂。
        </li>
        <li>
          <h3>问卷</h3>
          <div class="form">
            <div class="row">名字:<input type="text" placeholder="请留下您的名字"></div>
            <div class="row">性别:<input type="radio" name="radio">先生 <input type="radio" name="radio">女士</div>
            <div class="row">你家有宠物吗: <input type="checkbox">有</div>
            <div class="row">留言:<textarea class="vt" cols="60" rows="10"></textarea></div>
          </div>
        </li>
      </ul>
  </div>
  <button class="btn no-print" onClick="Print('#wrap')">点击开始打印</button>
</div>

<script src="Print.js"></script>
</body>
</html>

Print.js代码如下:

/* @Print.js
 * DH (http://denghao.me)
 * 2017-7-14
 */
(function(window, document) {
  var Print = function(dom, options) {
    if (!(this instanceof Print)) return new Print(dom, options);

    this.options = this.extend({
      'noPrint': '.no-print'
    }, options);

    if ((typeof dom) === "string") {
      this.dom = document.querySelector(dom);
    } else {
      this.dom = dom;
    }

    this.init();
  };
  Print.prototype = {
    init: function() {
      var content = this.getStyle() + this.getHtml();
      this.writeIframe(content);
    },
    extend: function(obj, obj2) {
      for (var k in obj2) {
        obj[k] = obj2[k];
      }
      return obj;
    },

    getStyle: function() {
      var str = "",
        styles = document.querySelectorAll('style,link');
      for (var i = 0; i < styles.length; i++) {
        str += styles[i].outerHTML;
      }
      str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";

      return str;
    },

    getHtml: function() {
      var inputs = document.querySelectorAll('input');
      var textareas = document.querySelectorAll('textarea');
      var selects = document.querySelectorAll('select');

      for (var k in inputs) {
        if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
          if (inputs[k].checked == true) {
            inputs[k].setAttribute('checked', "checked")
          } else {
            inputs[k].removeAttribute('checked')
          }
        } else if (inputs[k].type == "text") {
          inputs[k].setAttribute('value', inputs[k].value)
        }
      }

      for (var k2 in textareas) {
        if (textareas[k2].type == 'textarea') {
          textareas[k2].innerHTML = textareas[k2].value
        }
      }

      for (var k3 in selects) {
        if (selects[k3].type == 'select-one') {
          var child = selects[k3].children;
          for (var i in child) {
            if (child[i].tagName == 'OPTION') {
              if (child[i].selected == true) {
                child[i].setAttribute('selected', "selected")
              } else {
                child[i].removeAttribute('selected')
              }
            }
          }
        }
      }

      return this.dom.outerHTML;
    },

    writeIframe: function(content) {
      var w, doc, iframe = document.createElement('iframe'),
        f = document.body.appendChild(iframe);
      iframe.id = "myIframe";
      iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";

      w = f.contentWindow || f.contentDocument;
      doc = f.contentDocument || f.contentWindow.document;
      doc.open();
      doc.write(content);
      doc.close();
      this.toPrint(w);

      setTimeout(function() {
        document.body.removeChild(iframe)
      }, 100)
    },

    toPrint: function(frameWindow) {
      try {
        setTimeout(function() {
          frameWindow.focus();
          try {
            if (!frameWindow.document.execCommand('print', false, null)) {
              frameWindow.print();
            }
          } catch (e) {
            frameWindow.print();
          }
          frameWindow.close();
        }, 10);
      } catch (err) {
        console.log('err', err);
      }
    }
  };
  window.Print = Print;
}(window, document));

绑定方法

Print('#Dom');

指定不打印区域

方法一. 添加no-print样式类

<div class="no-print">不要打印我</div>

方法二. 自定义类名

Print('#Dom',{'no-print':'.do-not-print-me-xxx'});
<div class="do-not-print-me-xxx">不要打印我</div>

思路

将目标区域的dom/css添加到空iframe中,打印该iframe。

注意

不支持background-color背景色打印,试试用background-image代替

标签:function,inputs,插件,dom,js,var,Print,document
来源: https://blog.csdn.net/huangbaokang/article/details/78435088

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有