This article example shares the specific code of Vue to achieve automatic paging of page printing for your reference. The specific content is as follows 1. Get elements for printing by ref1. Encapsulate a js file // Print class attributes, method definitions/* 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:12px}</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; // Wrap the element to be printed // fix: https://github.com/xyl66/vuePlugs_printjs/issues/36 // let outerHTML = this.wrapperRefDom(this.dom).outerHTML // return outerHTML; }, // Loop to the parent element and wrap the element that needs to be printed // Prevent the css selector at the beginning of the root level from taking effect wrapperRefDom: function (refDom) { let prevDom = null let currDom = refDom // Determine whether the current element is in the body. If not in the document, return the node directly 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); } }, // Check if an element is a descendant of the body element and not the body element itself 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. Add instance method Vue.prototype.$printPage = Print } export default MyPlugin 2. Put the file in a folder in the project 3. Global reference in main.js 4. Page Usage Note: If you don’t want to print the content, just set the class to no-print. 2. Use the browser's built-in window.print() method to obtain HTML content for printingDisadvantages: The style can only be written on the label, otherwise it will not take effect 1. Encapsulate a js file export default function printHtml(html) { let style = getStyle(); let container = getContainer(html); document.body.appendChild(style); document.body.appendChild(container); getLoadPromise(container).then(() => { window.print(); document.body.removeChild(style); document.body.removeChild(container); }); } //Set the print style function getStyle() { let styleContent = `#print-container { display: none; } @media print { body > :not(.print-container) { display: none; } html, body { margin: 0 0.2cm; display: block !important; height:auto; } #print-container { display: block; } @page { margin: 0.25cm 0; } }`; let style = document.createElement("style"); style.innerHTML = styleContent; return style; } // Clear the print content function cleanPrint() { let div = document.getElementById('print-container') if (!!div) { document.querySelector('body').removeChild(div) } } //Create a new DOM and fill the content to be printed into the DOM function getContainer(html) { cleanPrint() let container = document.createElement("div"); container.setAttribute("id", "print-container"); container.innerHTML = html; return container; } // Call the print method after the image is fully loaded function getLoadPromise(dom) { let imgs = dom.querySelectorAll("img"); imgs = [].slice.call(imgs); if (imgs.length === 0) { return Promise.resolve(); } let finishedCount = 0; return new Promise(resolve => { function check() { finishedCount++; if (finishedCount === imgs.length) { resolve(); } } imgs.forEach(img => { img.addEventListener("load", check); img.addEventListener("error", check); }) }); } 2. Put the file in a folder in the project 3. Direct import of the page 4. Page Usage Note: For content that does not need to be printed, just set the style display: none on the label; The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM. You may also be interested in:
|
<<: Navicat connects to MySQL8.0.11 and an error 2059 occurs
>>: Methods and steps for deploying GitLab environment based on Docker
//Default protocol /The use of the default protoc...
1.0 Redis persistence Redis is an in-memory datab...
This article example shares the specific code of ...
What you will create In this new tutorial, we'...
1. Initialize data DROP TABLE IF EXISTS `test_01`...
Page directory structure Note that you need to mo...
Installing and deploying a private Docker Registr...
Virtual machines are very convenient testing soft...
This is my first time using the element framework...
Table of contents 1. The concept of filter 1. Cus...
Preface Although the holiday is over, it shows up...
Table of contents What is VUE Core plugins in Vue...
Copy code The code is as follows: <html> &l...
Table of contents 1. Introduction 2. The first me...
1. Rounded Corners Today's web designs are con...