美文网首页
vue+iframe实现打印效果

vue+iframe实现打印效果

作者: 夭桃_dd0a | 来源:发表于2019-01-08 18:43 被阅读0次

    当第一次项目需要用到打印的时候,内心慌的一批,赶紧百度看有没有好的办法,结果不尽人意。比如:有的需要转PDF再进行打印,有的需要引用插件,而且也没有明确的文档,有的用js代码实现,但是页面点击的功能会失效等等....
    无意之中发现了一个可以满足需求的解决方法用:
    vue+iframe
    在vue的html部分中我们先使用一个iframe标签引入需要打印的页面,如:

    <iframe id="frame" src="./static/html/preview.html" frameborder="0" ref="iframe" style="display: none;"></iframe>
    

    我们先将vue中需要准备什么
    vue文件要将处理的数据传给preview.html中,要监听数据的变动:

    window.addEventListener('message', this.handleMessage);//mounted钩子函数中
    this.iframeWin = this.$refs.iframe.contentWindow; //获取iframe
    
    handleMessage (event) {
                // 根据上面制定的结构来解析iframe内部发回来的数据
                const data = event.data;
                console.log('vue文件接收的数据',data);
                if(data.cmd=='success'){//自己定义一个判断是否正常
                  this.state='ok';
                }
              }
    
    printing(item){//点击打印
             let iframe = document.getElementById('frame');//获取iframe标签相当于获取了打印的区域了
                this.iframeWin.postMessage({
                  cmd:'getFormJson',
                  info:{//做一下数据处理 然后存到自定义的info字段里方便获取,
                          fontsize:this.font_size,
                       },
                },'*');
                setTimeout((res)=>{
                  if(this.state=='ok'){
                    iframe.contentWindow.print();//打印iframe的html页面
                  }
                },500)
              },
    

    截止到上面的 都是在vue中给iframe传的数据以及监听当前页面的信息,将最新的数据传给html文件

    下面说iframe中引用的html文件如何处理:

    window.onload =function(){
        window.addEventListener("message", function(event){//自己定义的一个监听的message
          let data = event.data;//event  是vue文件中把已经处理好的数据传过来的
          if(data.cmd=='getFormJson'){//数据类型,对应的字段都可以自己定义
            let meetname = document.getElementById('meetname');//获取html页面中容器
            let con='';
            let fontsize=data.info.fontsize;//获取自己在info定义的数据
              data.params.map((item)=>{
               con+='<div style="font-size:'+fontsize+'px; class="pages" ></div>'
              });
              meetname.innerHTML = con;
            window.parent.postMessage({
              cmd: 'success',//收到数据以后给vue传的成功标志
              params: {
                success: true,
              }
            }, '*');
          }
        });
      }
    

    好了,这样就完成了。希望能有帮助~ ~ ~

    相关文章

      网友评论

          本文标题:vue+iframe实现打印效果

          本文链接:https://www.haomeiwen.com/subject/ohubrqtx.html