通过iframe碎片实现web局部打印

39 篇文章 0 订阅
3 篇文章 0 订阅

通过iframe碎片实现web局部打印

创建打印模板

首先,创建一个出货单的 HTML 模板,并用 CSS 进行样式设计。
tips:
1、直接通过iframe碎片拉起打印,会导致样式丢失,所以需要获取当前界面的样式。

${Array.from(document.querySelectorAll('link[rel="stylesheet"], style')).map(style => style.outerHTML).join('\n');}

2、通过浏览器拉起打印机打印会有一个延迟,如果直接执行 document.body.removeChild(iframe); 移除 iframe 碎片会导致打印机获取不到碎片的内容。所以需要对 removeChild() 进行延迟处理。

<template>
  <div id="app">
    <button @click="printOrder">打印出货单</button>
    <div id="printArea">
      <h1>出货单</h1>
      <p>订单编号: {{ orderNumber }}</p>
      <p>客户名称: {{ customerName }}</p>
      <table>
        <thead>
          <tr>
            <th>商品名称</th>
            <th>数量</th>
            <th>单价</th>
            <th>总价</th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="item in orderItems" :key="item.id">
            <td>{{ item.name }}</td>
            <td>{{ item.quantity }}</td>
            <td>{{ item.price }}</td>
            <td>{{ item.total }}</td>
          </tr>
        </tbody>
      </table>
      <p>总计: {{ totalAmount }}</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      orderNumber: '12345',
      customerName: '张三',
      orderItems: [
        { id: 1, name: '商品1', quantity: 2, price: 100, total: 200 },
        { id: 2, name: '商品2', quantity: 1, price: 200, total: 200 },
      ],
      totalAmount: 400,
    };
  },
  methods: {
    printOrder() {
      const printContent = this.$refs.printArea.innerHTML;
      const iframe = document.createElement('iframe');
      iframe.style.position = 'absolute';
      iframe.style.width = '0px';
      iframe.style.height = '0px';
      iframe.style.border = 'none';
      document.body.appendChild(iframe);

      const iframeDoc = iframe.contentWindow.document;
      iframeDoc.open();
      iframeDoc.write(`
        <!DOCTYPE html>
        <html>
          <head>
            <title>出货单</title>
            ${Array.from(document.querySelectorAll('link[rel="stylesheet"], style')).map(style => style.outerHTML).join('\n');}
            <style>
              table {
                width: 100%;
                border-collapse: collapse;
              }
              th, td {
                border: 1px solid #000;
                padding: 8px;
                text-align: left;
              }
            </style>
          </head>
          <body>
            ${printContent}
          </body>
        </html>
      `);
      iframeDoc.close();

      iframe.contentWindow.focus();
      iframe.contentWindow.print();
      setTimeout(()=>{
             document.body.removeChild(iframe);
      },3000);
    },
  },
};
</script>

<style>
#printArea {
  width: 100%;
  padding: 20px;
  border: 1px solid #000;
}
table {
  width: 100%;
  border-collapse: collapse;
}
th, td {
  border: 1px solid #000;
  padding: 8px;
  text-align: left;
}
</style>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值