• vue中打印插件vue-print-nb(二)-实例之两种方法——安包之设置一个id和绑定一个对象 & 下载print.js之ref设置锚点


    vue中打印插件vue-print-nb(二)-实例之两种方法——安包之设置一个id和绑定一个对象 & 下载print.js之ref设置锚点

    第一种方法
    方式1、设置一个id

    ① 给要打印的部分设置一个 id
    ② 在打印按钮中添加 v-print="'#id名'"

    1、安装vue-print-nb插件

    npm install vue-print-nb
    yarn add vue-print-nb
    
    • 1
    • 2

    2、在main.js中引入和配置

    import Print from 'vue-print-nb'
    //注册为了指令
    Vue.use(Print);  
    
    • 1
    • 2
    • 3

    3、在页面中使用

    index.vue

    
     
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    效果

    在这里插入图片描述

    方式2、绑定一个对象

    1)方法
    打印按钮的 v-print 绑定一个对象

    
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86

    效果同上

    第二种方法

    1.下载 print.js

    https://github.com/xyl66/vuePlugs_printjs

    详细文件见附录

    在这里插入图片描述

    2.下载好后,放在plugs中的print.js里,同样在main.js中进行引入

    import Print from '@/plugs/print'
    // 全局引入
    Vue.use(Print) 
    
    • 1
    • 2
    • 3

    3.在页面上使用

    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    效果同上

    注意事项:

    需使用ref获取dom节点,若直接通过id或class获取则webpack打包部署后打印内容为空。

    4.可以指定指定不打印区域

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

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

    方法二. 自定义类名

    不要打印我
    this.$print(this.$refs.print,{'no-print':'.do-not-print-me-xxx'}) // 使用
    • 1
    • 2
    • 3
    附录

    src\plugs\print.js

    // 打印类属性、方法定义
    /* eslint-disable */
    const 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.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 += "";
      
          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')
                  }
                }
              }
            }
          }
          // 包裹要打印的元素
          // fix: https://github.com/xyl66/vuePlugs_printjs/issues/36
          let outerHTML = this.wrapperRefDom(this.dom).outerHTML
          return outerHTML;
        },
        // 向父级元素循环,包裹当前需要打印的元素
        // 防止根级别开头的 css 选择器不生效
        wrapperRefDom: function (refDom) {
          let prevDom = null
          let currDom = refDom
          // 判断当前元素是否在 body 中,不在文档中则直接返回该节点
          if (!this.isInBody(currDom)) return currDom
      
          while (currDom) {
            if (prevDom) {
              let element = currDom.cloneNode(false)
              element.appendChild(prevDom)
              prevDom = element
            } else {
              prevDom = currDom.cloneNode(true)
            }
      
            currDom = currDom.parentElement
          }
      
          return prevDom
        },
      
        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);
          }
        },
        // 检查一个元素是否是 body 元素的后代元素且非 body 元素本身
        isInBody: function (node) {
          return (node === document.body) ? false : document.body.contains(node);
        },
        isDOM: (typeof HTMLElement === 'object') ?
          function (obj) {
            return obj instanceof HTMLElement;
          } :
          function (obj) {
            return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
          }
      };
      const MyPlugin = {}
      MyPlugin.install = function (Vue, options) {
        // 4. 添加实例方法
        Vue.prototype.$print = Print
      }
      export default MyPlugin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
  • 相关阅读:
    910数据结构(2020年真题)
    2023东莞理工大学考研介绍
    Java递归实现迷宫问题和八皇后
    视频分段方法:视频批量处理与音频提取的操作解析
    计算机网络---第四章网络层---ipv4---选择题
    MyBatis、MyBatisPlus转义数据库关键字
    【软考软件评测师】基于规则说明的测试技术下篇
    Mybatis-Plus配置性能分析插件
    Apache Dubbo 首个 Node.js 3.0-alpha 版本正式发布
    vue 实现自定义分页打印 window.print
  • 原文地址:https://blog.csdn.net/weixin_44867717/article/details/128168064