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

CentOS6.8 uses cmake to install MySQL5.7.18

Referring to the online information, I used cmake...

How to use MySQL DATEDIFF function to get the time interval between two dates

describe Returns the time interval between two da...

Detailed explanation of keepAlive use cases in Vue

In development, it is often necessary to cache th...

SQL GROUP BY detailed explanation and simple example

The GROUP BY statement is used in conjunction wit...

JavaScript String Object Methods

Table of contents Methods of String Object Method...

Understanding the Lazy Loading Attribute Pattern in JavaScript

Traditionally, developers create properties in Ja...

Vue implements 3 ways to switch tabs and switch to maintain data status

3 ways to implement tab switching in Vue 1. v-sho...

Docker data volume common operation code examples

If the developer uses Dockerfile to build the ima...

A detailed discussion on detail analysis in web design

In design work, I often hear designers participati...

Linux sar command usage and code example analysis

1. CPU utilization sar -p (view all day) sar -u 1...

Example of using javascript to drag and swap div positions

1 Implementation Principle This is done using the...