Two methods of implementing automatic paging in Vue page printing

Two methods of implementing automatic paging in Vue page printing

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 ref

1. 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 printing

Disadvantages: 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:
  • Vue+element realizes the function of printing page
  • Vue form form submission + ajax asynchronous request + paging effect
  • Vue.js implements table functions of multi-condition filtering, searching, sorting and paging
  • Vue.js implements paging query function
  • Vuejs2.0 implements a simple paging example
  • Vue.js realizes infinite loading and paging function development
  • Example code for writing a pager with Vue
  • Implementation of paging problem of vue + element-ui
  • How to encapsulate paging components based on Vue
  • Pagination based on vue.js

<<:  Navicat connects to MySQL8.0.11 and an error 2059 occurs

>>:  Methods and steps for deploying GitLab environment based on Docker

Recommend

What are the benefits of using // instead of http:// (adaptive https)

//Default protocol /The use of the default protoc...

vue-pdf realizes online file preview

This article example shares the specific code of ...

Vue-CLI multi-page directory packaging steps record

Page directory structure Note that you need to mo...

Implementation of Docker private library

Installing and deploying a private Docker Registr...

VMware Workstation download and installation detailed tutorial

Virtual machines are very convenient testing soft...

How to use Element in React project

This is my first time using the element framework...

Vue global filter concepts, precautions and basic usage methods

Table of contents 1. The concept of filter 1. Cus...

Complete steps for using Echarts and sub-packaging in WeChat Mini Program

Preface Although the holiday is over, it shows up...

An article to help you understand the basics of VUE

Table of contents What is VUE Core plugins in Vue...

How to implement html input drop-down menu

Copy code The code is as follows: <html> &l...

Two ways to configure Vue global methods

Table of contents 1. Introduction 2. The first me...

9 Practical CSS Properties Web Front-end Developers Must Know

1. Rounded Corners Today's web designs are con...