vue如何实现页面打印自动分页
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,这篇文章主要为大家展示了"vue如何实现页面打印自动分页",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"vue如何实现页面打印自动分页"这篇文章吧。一、通过
千家信息网最后更新 2025年02月04日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 MyPlugin
2.把文件放在项目里面的某一个文件夹
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安全错误
数据库的锁怎样保障安全
网络技术与舞蹈教育
软件开发面试什么
东营高校党建软件开发公司
梅州市兴博网络技术有限公司
kettle免费数据库插件
qq游戏服务器链接断开怎么办
成都乐育网络技术有限公司
计算机数据库程序设计考试
计算机网络安全要素
网络安全检查类别
域名和服务器可以做什么
末日之刃服务器人口普查2022
重庆软件开发的培训
群晖的服务器在大陆吗
神武4手游找不到服务器
java项目连同数据库打包
汽车调表服务器
网络安全行业研究报告
黑暗之魂3服务器为什么连不上
2019酒泉网络安全宣传周
软件开发精品培训
河海大学服务器租赁怎么报销
受托方研发项目软件开发费
spoon起始数据库在哪里
腾讯云服务器内存使用率高
大家都是如何做数据备份的服务器
asp下拉列表关联数据库
网络安全大赛宣传报道
和数据库的职业规划
海口升腾服务器供应费用