vue implements printing function (can print multiple pages)

When we use the vue-print-nb plug-in, we find that we can only print one page, which is very uncomfortable. Now we have encapsulated a tool class that can print multiple pages. It is simple and convenient. Without further ado, let’s go directly to the code.

First introduce the tool class

1. Create the print.js file in the src/utils folder
Insert image description here
2. Copy the following code directly into it

// 打印类属性、方法定义
/* 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 += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";
        str += "<style>html,body,div{height: auto!important;font-size:14px}</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: (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

3. Introduce the code into the entry file main.js of the vue project

import Print from '@/utils/print.js'
Vue.use(Print) // 打印
vue page code

1. Use div in the code block to set the page content that needs to be printed. Pay attention to keywords

<Button type="primary" @click="handlePrint">打印</Button>
<div ref="print">
	<!-- 页面内容 -->
	<div>...表格,打印内容...</div>
	<!-- 不打印 -->
	<div class="no-print">...不打印内容...</div>
</div>

2. In the implementation method

// 打印
handlePrint() {
    
    
  this.$print(this.$refs.print);
}

3. After clicking the print button, this page will pop up. When the printer is connected, you can print.
Insert image description here

At this point, our function has been implemented. Isn’t it super simple? Print.js has been encapsulated. If necessary, you can adjust the content of print.js appropriately.
It’s a long road ahead, let’s work hard together! ! !

Guess you like

Origin blog.csdn.net/weixin_52473844/article/details/134373609