vue打印浏览器页面功能的两种实现方法
推荐使用方法二
方法一:通过npm 安装插件
1,安装 npm install vue-print-nb --save
2,引入 安装好以后在main.js文件中引入
| 1 | import Print from 'vue-print-nb' | 
Vue.use(Print); //注册
3,现在就可以使用了
| 1 2 3 4 5 | div id="printTest" >      <p>明月照于山间</p>      <p>清风来于江上 </p>    </div>    <buttonv-print="'#printTest'">打印</button> | 
4.如需通过链接地址打印:window.location.href = airway_bill; airway_bill为链接地址。
5.如果内容打印不全,在打印操作时点击更多设置,然后设置缩放。
方法一使用时可能会遇到内容只有一页,但是点击打印会打印2张的情况。解决办法:查看定义的元素高度是否有被设置为100%,或html高度被设置成100%,如果有去掉即可。
方法二:手动下载插件到本地
插件地址:https://github.com/xyl66/vuePlugs_printjs
1.在src下新建文件夹plugs,将下载好的print.js放入plugs文件夹下
2.在main.js中引入
print.js 里的代码
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | //print.js 里的代码// 打印类属性、方法定义/* eslint-disable */const Print =function(dom, options) {    if(!(thisinstanceofPrint)) returnnewPrint(dom, options);      this.options = this.extend({      'noPrint': '.no-print'    }, options);      if((typeofdom) === "string") {      this.dom = document.querySelector(dom);    } else{      this.dom = dom;    }      this.init();  };  Print.prototype = {      init: function() {      varcontent = this.getStyle() + this.getHtml();      this.writeIframe(content);    },        extend: function(obj, obj2) {      for(vark inobj2) {        obj[k] = obj2[k];      }      returnobj;    },      getStyle: function() {      varstr = "",        styles = document.querySelectorAll('style,link');      for(vari = 0; i < styles.length; i++) {        str += styles[i].outerHTML;      }      str += "<style>"+ (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";        returnstr;    },      getHtml: function() {      varinputs = document.querySelectorAll('input');      vartextareas = document.querySelectorAll('textarea');      varselects = document.querySelectorAll('select');        for(vark ininputs) {        if(inputs[k].type == "checkbox"|| inputs[k].type == "radio") {          if(inputs[k].checked == true) {            inputs[k].setAttribute('checked', "checked")          } else{            inputs[k].removeAttribute('checked')          }        } elseif(inputs[k].type == "text") {          inputs[k].setAttribute('value', inputs[k].value)        }      }        for(vark2 intextareas) {        if(textareas[k2].type == 'textarea') {          textareas[k2].innerHTML = textareas[k2].value        }      }        for(vark3 inselects) {        if(selects[k3].type == 'select-one') {          varchild = selects[k3].children;          for(vari inchild) {            if(child[i].tagName == 'OPTION') {              if(child[i].selected == true) {                child[i].setAttribute('selected', "selected")              } else{                child[i].removeAttribute('selected')              }            }          }        }      }        returnthis.dom.outerHTML;    },      writeIframe: function(content) {      varw, 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;";            w = f.contentWindow || f.contentDocument;      doc = f.contentDocument || f.contentWindow.document;      doc.open();      doc.write(content);      doc.close();      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);      }    }  };    const MyPlugin = {}  MyPlugin.install = function(Vue, options) {    Vue.prototype.$print = Print  }    export defaultMyPlugin | 
main.js里引入
| 1 2 | import Print from './plugs/print'Vue.use(Print) | 
使用
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <template>    <div>        <!-- 点击按钮打印 -->        <el-button type="primary"@click="printDemo">点击打印</el-button>                <!--  <div ref="print">            <h1>这里是打印内容</h1>        </div>-->        <img class="printsrcclass"ref='print':src="printsrc"/>    </div>    </template><script>export default{    data(){        return{}    },    methods: {        // 点击打印        printDemo(){            setTimeout(() => {                this.$print(this.$refs.print)            }, 100);        }    },    mounted() {    }} | 
4.注意事项 需使用ref获取dom节点,若直接通过id或class获取则webpack打包部署后打印内容为空
5.指定不打印区域
方法1. 添加no-print样式类
不要打印我
方法2. 自定义类名
不要打印我
| 1 | this. print (this. print(this. print(this.refs.print,{‘no-print':‘.do-not-print-me-xxx'}) // 使用 | 
如果图片出不来 打印出不来 等情况
参考下面代码
| 1 2 3 4 5 6 7 8 9 10 11 12 | const res2 = await fnApi(orderId); let myBlob = newBlob([res2.data], { type: 'image/jpeg'});        varhref = URL.createObjectURL(myBlob); // 创建对象超链接        // 此时拿到图片地址 href,后面直接使用该地址即可        let img = newImage();        img.src = href;        img.onload = () => {          this.printsrc = href;          this.$nextTick(() => {            this.mypirntFN();          })        } | 
接口别忘了加类型

Ps:
一,可能遇到的问题及解决方案
①图片占位置 ---------让它脱离文档流( position: absolute; 不要用fixed 这样内容多的时候只打印第一页)
②页面不想展示打印内容 只打印;------- 给它 z-index:-1 (display:none 的话打印内容也没有)
目前解决不了 跳过打印预览直接打印功能
总结
到此这篇关于vue打印浏览器页面功能的两种实现方法的文章就介绍到这了,更多相关vue打印浏览器页面功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
vue打印浏览器页面功能的两种实现方法的更多相关文章
- 史上最全的CSS hack方式一览  jQuery 图片轮播的代码分离  JQuery中的动画  C#中Trim()、TrimStart()、TrimEnd()的用法  marquee 标签的使用详情  js鼠标事件  js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法  ref和out的区别在c#中 总结
		史上最全的CSS hack方式一览 2013年09月28日 15:57:08 阅读数:175473 做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我 ... 
- html 指定页面字符集的两种方式
		1.html指定页面字符集的两种方式 方式一: <meta charset="utf-8"> 方式二: <meta http-equiv="Cont ... 
- JSP错误页面处理的两种方式
		JSP错误页面处理的两种方式: 方法1(真能针对单一页面生效,不推荐): 出错页面实例 <%@ page language="java" contentType=" ... 
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
		今天我们要讲的是ng2的路由系统. 例子 
- 两种js方法发起微信支付:WeixinJSBridge,wx.chooseWXPay区别
		原文链接:https://www.2cto.com/weixin/201507/412752.html 1.为什么会有两种JS方法可以发起微信支付? 当你登陆微信公众号之后,左边有两个菜单栏,一个是微 ... 
- uni-app开发经验分享一: 多页面传值的三种解决方法
		开发了一年的uni-app,在这里总结一些uni-app开发中的问题,提供几个解决方法,分享给大家: 问题描述:一个主页面,需要联通一到两个子页面,子页面传值到主页面,主页面更新 问题难点: 首先我们 ... 
- 两种Ajax方法
		两种Ajax方法 Ajax是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技 ... 
- HTML中label的两种使用方法
		如果您在 label 元素内点击文本,就会触发此控件.就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上. 有两种使用方法: 方法1: <label for=" ... 
- JS中的两种刷新方法以及区别和适用范围
		在项目中有一个人信息修改的页面,但是修改后显示的却是修改之前的内容,分析问题后发现查询语句写在了修改语句之前,有些某些需要又必须这么写,但是修改信息后先却显示之前的信息也太不科学了. 所以我就想用js ... 
- keil结合st-link使用SWO的两种调试方法笔记
		通过strongerHuang的教程,实现了SWO的两种调试方法, 1.在keil调试的过程中,使用debug printf viewer打印信息, 2.在STM32 ST-LINK Utility中 ... 
随机推荐
- 【并查集+dfs】codeforces 1833 E. Round Dance
			题意 输入一个正整数 \(T(1 \leq T \leq 10^4)\),表示接下来输入 \(T\) 组测试用例,对于每一个测试用例: 第一行,输入一个正整数 \(n(2 \leq n \leq 2 ... 
- LLM应用实战-财经新闻自动聚合
			1. 背景 这段时间项目比较忙,所以本qiang~有些耽误了学习,不过也算是百忙之中,抽取时间来支撑一个读者的需求,即爬取一些财经网站的新闻并自动聚合. 该读者看了之前的<AI资讯的自动聚合及报 ... 
- sqlserver查询某数据库下表的占用空间
			要查看 SQL Server 中哪个表占用的空间最多,您可以使用以下查询来列出所有表及其占用的空间大小,并按照占用空间从大到小进行排序: SELECT t.NAME AS TableName, p.r ... 
- DotNet Core Threadpool
			DotNet Core Threadpool Jai Rathore https://medium.com/@jaiadityarathore/dotnet-core-threadpool-bef2f ... 
- 【Python】【爬虫】【爬狼】001_urllib_get_获取响应结果页面代码
			情况说明 本节课我们要处理的网站是 www.yhdmp.cc 注意:腾讯报毒该网址.问题不大,基本这种盗版动漫的网站都会报毒吧.如果不放心可以自己找个其他的网站爬,我这个也是随便找的. 该网站搜索提交 ... 
- 【Web前端】【开源分享】H5登陆界面 - 2021年12月24日
			点我下载 
- 【MyBatis】学习笔记14:通过collection解决一对多的映射关系
			MyBatis14:通过collection解决一对多的映射关系 目录 MyBatis14:通过collection解决一对多的映射关系 对象 接口 映射文件 测试 总结 注意事项 已知,一个部门对应 ... 
- Qt编写的项目作品12-简易视频播放器
			一.功能特点 多线程实时播放rtsp视频流. 支持windows+linux+mac. 多线程显示图像,不卡主界面. 自动重连网络摄像头. 可设置边框大小即偏移量和边框颜色. 可设置是否绘制OSD标签 ... 
- Qt开源作品24-遮罩层窗体
			一.前言 在有些项目中,需要在弹框的窗体背后遮罩原有主窗体,使得突出显示弹窗窗体,突然想到之前写过一个全局截屏的东东,原理一致,拿来改改.只需要引入一个头文件和实现文件,然后在主窗体中设置下需要遮罩的 ... 
- 什么是 单点登录SSO?SSO工作原理
			记住多个用户名和密码来访问不同网站和应用程序很麻烦.单点登录 (SSO) 允许用户使用一组凭证访问多个资源,从而消除了对多个用户 ID 和密码的需求. 没有 SSO 的世界 在没有 SSO 的情况下, ... 
