vue中使用window.print 打印html页面

1、print函数的打印功能是对整个页面作为打印对象的,要想打印部分内容,就需要将要打印的部分拿出来放到新的页面里面,来提供打印,例如以下代码:

<h3>页面标题</h3>
<tabel id='tab'>
   <tr>
      <td>test</td>
      <td>test</td>
  </tr>
 <tr>
      <td>test</td>
      <td>test</td>
  </tr>
</table>
<style>
 table{
        color:red;
    }
</style>

如果我们打印如下的页面效果,不要打印标题部分

test test
test test

我们需要新建一个vue组件test.vue将我们的css样式写入其中,如果你希望打印的内容和原页面内容不一样你可以自己写一套新的css文件引入组件,并去掉scope属性这样才能使css生效,因为组件css私有化不能作用到后来外面添加进来的html片段

<template>
    <div id="test"></div>
</template>
<style>
.test{
  table{
         color:red;
    }
}
</style>

如上图所示我们需要在组件中引入css,需要在组件中定义一个Id模块的div容器用来存放在页面中截取过来的html,因为webpack打包工具的关系在打包的过程中,所有的css文件都会加上编码,所以需要写在id里面,我们新添加的html编码都添加在其中。

2、在页面中引入主键,创建一个iframe用来打印截取的部分,将height,width设为0,隐藏标签不显示,仅供打印使用,你也可以动态创建iframe给src赋值的方式给它赋值组件,用后在移除掉

<iframe id="print-iframe" :src="loation+'/#/test'" width='0' height='0'></iframe>
//loation=window.location
<script>
            var iframe=document.getElementById('print-iframe');
             var doc = iframe.contentWindow.document;
             var tcontent=document.getElementById('tab');//获取table表中数据
            doc.getElementById("test").innerHTML=tcontent.innerHTML;//将获取到html标签数据赋值给iframe中组件中id中,组件的样式将影响html标签数据
iframe.contentWindow.print();//调取iframe打印,数据过多打印会自动分页
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。