vue如何实现页面打印自动分页
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要为大家展示了"vue如何实现页面打印自动分页",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"vue如何实现页面打印自动分页"这篇文章吧。一、通过
千家信息网最后更新 2026年11月01日vue如何实现页面打印自动分页
这篇文章主要为大家展示了"vue如何实现页面打印自动分页",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"vue如何实现页面打印自动分页"这篇文章吧。
一、通过ref方式获取元素进行打印
1.封装一个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 += ""; 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][xss_clean] = 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; // 包裹要打印的元素 // 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.$printPage = Print}export default MyPlugin2.把文件放在项目里面的某一个文件夹
3.在main.js里面全局引用
4.页面使用
备注:不需要打印的内容直接设置class为no-print即可
二、使用浏览器自带的window.print()方法获取html内容进行打印
缺点:样式只能写在标签上面,否则不生效
1.封装一个js文件
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); });} // 设置打印样式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[xss_clean] = styleContent; return style;} // 清空打印内容function cleanPrint() { let div = document.getElementById('print-container') if (!!div) { document.querySelector('body').removeChild(div) }} // 新建DOM,将需要打印的内容填充到DOMfunction getContainer(html) { cleanPrint() let container = document.createElement("div"); container.setAttribute("id", "print-container"); container[xss_clean] = html; return container;} // 图片完全加载后再调用打印方法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.把文件放在项目里面的某一个文件夹
3.页面直接引入
4.页面使用

备注:不需要打印的内容直接在标签上设置样式display: none;即可
以上是"vue如何实现页面打印自动分页"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
元素
内容
页面
文件
方法
样式
篇文章
包裹
备注
文件夹
标签
项目
学习
封装
帮助
全局
后代
图片
实例
属性
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网和科技创新
互联网科技有限公司图片
易互联网科技有限公司
互联网 卓越科技
艾特科技互联网
壕鑫互联网络科技
易通互联网络科技有限公司
广西互联网科技公司
深圳前海聚择互联网科技有限公司
新华互联网科技2019
互联网科技创新服务
合肥互联网科技公司公章图片
上海钢联属于互联网科技股吗
黑云互联网科技有限公司
互联网营销推广黑科技
卡尔迅互联网科技有限公司
互联网界的黑科技
陕西九四连强互联网科技有限公司
同城互联网络科技
上海互联网科技园景观
什么是科技互联网
广州宏创互联网科技
百单互联网科技有限公司
深圳期待互联网科技
南山科技园互联网公司有哪些
民营互联网公司国防科技
高科技互联网发展前景如何
广州百诚互联网科技有限公司官网
科技互联网行业投资研究
恒生互联网科技趋势