前端打印页面功能element数据重复打印

在vue2.x+element项目中打印页面时发现表格数据被重复打印了。

在这里插入图片描述
点击打印:发现多循环展示且打印了两条数据
在这里插入图片描述
造成原因:element提供的fixed固定效果是通过新创建一个相同dom进行切换实现的,观察dom结构可以发现有多个相同的dom结构。
在这里插入图片描述
解决办法:
1:不使用fixed,把table中的fixed属性删除。
2:在打印事件中判断打印内容的结构中是否有fixed的表格,有的话删除即可。

最后贴上修改前和修改后的代码:

修改前:

<template>
<div>
  <el-table
    :data="tableData"
    style="width: 400px"
    max-height="250">
    <el-table-column
      fixed
      prop="date"
      label="日期"
      width="150">
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="120">
    </el-table-column>
    <el-table-column
      fixed="right"
      label="操作"
      width="120">
      <template slot-scope="scope">
        <el-button
          @click.native.prevent="deleteRow(scope.$index, tableData)"
          type="text"
          size="small">
          移除
        </el-button>
      </template>
    </el-table-column>
  </el-table>
<div style="display: none;" id="print_iframe">
<span>这是自定义内容的标题</span>
<el-table
    :data="tableData"
    style="width: 100%"
    max-height="250">
    <el-table-column
      fixed
      prop="date"
      label="日期"
      width="150">
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="120">
    </el-table-column>
    <el-table-column
      fixed="right"
      label="操作"
      width="120">
      <template slot-scope="scope">
        <el-button
          @click.native.prevent="deleteRow(scope.$index, tableData)"
          type="text"
          size="small">
          移除
        </el-button>
      </template>
    </el-table-column>
  </el-table>
</div>
<el-button @click="print()">打印</el-button>
</div>
</template>

<script>
export default {
    methods: {
      print() {
        var iframe = document.createElement('iframe');
        document.body.appendChild(iframe)
        var doc = iframe.contentWindow.document;
        let wrap = document.getElementById("print_iframe").innerHTML;
        doc.write("<div>" + wrap + "</div>");
        doc.close();
        iframe.contentWindow.focus();
        iframe.contentWindow.print();
        //最后把这个iframe销毁
        iframe.parentNode.removeChild(iframe);
      },
      deleteRow(index, rows) {
        rows.splice(index, 1);
      }
    },
    data() {
      return {
        tableData: [{
          date: '2016-05-03',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1518 弄',
          zip: 200333
        }, {
          date: '2016-05-04',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1518 弄',
          zip: 200333
        }, {
          date: '2016-05-01',
          name: '王小虎',
          province: '上海',
          city: '普陀区',
          address: '上海市普陀区金沙江路 1518 弄',
          zip: 200333
        }]
      }
    }
  }
</script>

修改后的print方法:

methods: {
      print() {
        var iframe = document.createElement('iframe');
        document.body.appendChild(iframe)
        var doc = iframe.contentWindow.document;
        let wrap_dom=document.getElementById("print_iframe");
        let fixed = wrap_dom.querySelector('.el-table__fixed');
        let fixed_right = wrap_dom.querySelector('.el-table__fixed-right');
        //判断dom结构中是否有el-table__fixed及el-table__fixed-right节点并删除
        if(fixed){
          wrap_dom.querySelector('#my_table').removeChild(fixed)
        }
        if(fixed_right){
           wrap_dom.querySelector('#my_table').removeChild(fixed_right)
        }
        let wrap = wrap_dom.innerHTML;
        doc.write("<div>" + wrap + "</div>");
        doc.close();
        iframe.contentWindow.focus();
        iframe.contentWindow.print();
        //打印完成后我们将iframe销毁了,所以下面两行代码无需加上。
        //wrap_dom.querySelector('#my_table').appendChild(fixed);
        //wrap_dom.querySelector('#my_table').appendChild(fixed_right)
        //最后把这个iframe销毁
        iframe.parentNode.removeChild(iframe);
      },
      deleteRow(index, rows) {
        rows.splice(index, 1);
      }
    },

效果如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值