VUE调取打印机

业务需要添加调用打印机方法

原生方法: window.print()
现封装如下:
一 引入JS文件

// 打印类属性、方法定义
const Print = function (dom, options) {
      if (!(this instanceof Print))
            return new Print(dom, options);
      this.options = this.extend({
            noPrint: ".no-print"
      }, options);
      if (dom instanceof String) {
            this.dom = document.querySelector(dom);
      } else {
            this.isDOM(dom); this.dom = this.isDOM(dom) ? dom : dom.$el;
      }
      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 = 0; k < inputs.length; k++) {
                  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);
                  } else {
                        inputs[k].setAttribute("value", inputs[k].value);
                  }
            } for (var k2 = 0; k2 < textareas.length; k2++) {
                  if (textareas[k2].type == "textarea") {
                        textareas[k2].innerHTML = textareas[k2].value;
                  }
            } for (var k3 = 0; k3 < selects.length; k3++) {
                  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;";
            iframe.setAttribute("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();
            var _this = this; iframe.onload = function () {
                  _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);
            }
      },
      isDOM: HTMLElement instanceof Object ? function (obj) {
            return obj instanceof HTMLElement;
      } : function (obj) {
            return (
                  obj && obj instanceof Object && obj.nodeType === 1 &&
                  obj.nodeName instanceof String);
      }
};
const MyPlugin = {};
MyPlugin.install = function (Vue, options) {
      Vue.prototype.$print = Print;
};
export default MyPlugin;

二 在main.js中进行 全局注册

import Print from ".print"
Vue.use(Print)

因为已经挂在到VUE原型链上,所以在组件中可以直接进行使用
(说明:在需要打印的地方添加ref,不需要打印的地方添加 no-print 的class 类名,通过 $print 去调用需要打印的ref(或者用定义id然后调用id节点的方式也可以,vue中推荐用ref))

<div class="wrapper">
    <button @click="$print($refs.print)">打印</button>
    <button @click="handleClick">JS调用打印</button>
    <div ref="print">
      <h1>这是打印区域</h1>
      <small style="color:red">字体颜色备注</small>
      <p class="no-print">这是不用打印区域</p>
    </div>
  </div>
</template>
<script>
export default {
  name: 'demo',
  methods: {
    // JS 操作调用
    handleClick() {
      this.$print(this.$refs.print)
    }
  }
}
</script>
<style lang="scss" scoped>
.wrapper {
  padding: 2rem;
  background: #ffffff;
  margin: 1rem;
}
</style>

本页面没有页码,不涉及多页打印

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容