vue 打印html <iframe>标签(内容打印)超详细

这篇具有很好参考价值的文章主要介绍了vue 打印html <iframe>标签(内容打印)超详细。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

今天领导给了个需求,需要配合其他项目组给一个公共组件的npm进行,公共组件打印,打印操作由这个npm包来操作。(经过开会商讨,最后决定配置一个path路径,来展示页面,然后我负责在公共这里打印相应页面内容。)在这之初都是好着的,首先进行配置,这里只需要一个input框来给后端传值就可以了,这一步没什么好讲的,

正传

好了 正头戏开始了,通过请求在mounted中发送请求,获取到配置好的 path路径,开始我想着用路由进行编写后来发现过于麻烦,选择了iframe标签来进行编写,(这里再说一下留下来的需求,需要弹窗然后展示其他组要展示的内容)这里选择了iframe ,然而iframe的src值如果不是本项目页面的话 是会报跨域的,so(幸好我们是同一个域名同一个端口号) 这里我对src 路径的最前面的地址进行处理,编写一个 获取域名以及端口号等的一个过滤方法,方法如下:

 // 获取http域名
  urlhttp() {
  console.log(window.location.href, "window.location.href");
   // 截取域名前面的部分
  const url = window.location.href.split("://")[1];
  const urlhttp = window.location.href.split("://")[0];
  const urlArr = url.split("/");
  const urlStr = urlArr[0];
  const urlStrArr = urlStr.split(".");
  const urlStrArrLen = urlStrArr.length;
  const urlStrArrLenLast = urlStrArrLen - 1;
  const urlStrArrLenLastStr = urlStrArr[urlStrArrLenLast];
  const urlStrArrLenLastStrLen = urlStrArrLenLastStr.length;
  const urlStrArrLenLastStrLenLast = urlStrArrLenLastStrLen - 1;
  const urlStrArrLenLastStrLenLastStr = urlStrArrLenLastStr[urlStrArrLenLastStrLenLast];
  const urlStrArrLenLastStrLenLastStrNum = Number(urlStrArrLenLastStrLenLastStr);
  if (urlStrArrLenLastStrLenLastStrNum) {
    this.urlStr = urlStrArr[urlStrArrLenLastStrLenLastStrNum];
  } else {
    this.urlStr = urlStrArr[urlStrArrLenLastStrLenLastStr];
  }
  console.log(urlhttp + urlStr, "urlStr");

  // 截取域名带http+域名
  this.urlhttpStr = urlhttp + "://" + urlStr;
  console.log(this.urlhttpStr, "urlhttpStr");
},

通过次方法,对页面域名进行格式化,其中window.location.href 获取的是当前地址框的所有地址,然后通过.split(" : / / " )[1];等进行数据的获取,最终得到:http://localhost:8080 这种地址,
从而拼接起来我配置的 iframe的src地址拼接后,弹窗展示了相应的页面,

然后在弹窗上给一个打印按钮(重头戏来了) 我先对iframe标签进行ref的设置,从而获取该节点,然后我将

const contentWindow = iframe.contentWindow.document;

节点进行赋值,拿到后直接打印该节点,
调用 contentWindow.print(); 方法,发现打印信息不全的情况,然后我通过翻阅资料方得知 会有样式排版等一些问题导致至此,所以次方法pass,过,后又发现可以通过创建新的页面进行展示打印,然后我调用

  const printWindow = window.open("", "_blank");
   printWindow.document.write(`
<html>
<body>
</body>
</html>
`);

去创建新页面,在新页面中执行打印方法

printWindow.document.close();
printWindow.print();

然后发现打印后,我iframe中的打印的东西消失了,然后我便复制一个子节点然后再用子节点打印

const childElementcopy = childElement.cloneNode(true); // 复制元素

发现奏效了,但是没有css样式,我开始便利子节点的样式

	Array.from(sourceComputedStyle).forEach(style => {
const value = sourceComputedStyle.getPropertyValue(style);
printElement.style.setProperty(style, value);
});

但是次方法未奏效,尝试了好多办法后,我查看元素时候发现 style标签我可以直接copy旗下所有元素啊 然后便复制了一份,一起加入打印的新页面,至此完成次需求,下面是全部代码文章来源地址https://www.toymoban.com/news/detail-553884.html

  async submitPrint() {
  const iframe = this.$refs.myIframe;
  console.log(this.$refs.myIframe, "this.$refs.myIframe");
  const contentWindow = iframe.contentWindow.document;
  const head =  contentWindow.querySelector("head")
  // 访问iframe的子元素
  const childElement = contentWindow.getElementById(this.printLocation) || contentWindow.getElementsByClassName(this.printLocation)[0]
  //this.printLocation是我后配置的要打印模块的id
  console.log(childElement);
  const childElementcopy = childElement.cloneNode(true); // 复制html元素
  const headcopy = head.cloneNode(true); // 复制css 样式元素元素

  const printWindow = window.open("", "_blank");
  // 在前确保先监听
  printWindow.document.write(`
  <html>
  <body>
  </body>
  </html>
	`);
      const printBody = printWindow.document.querySelector("body");
      const printhead = printWindow.document.querySelector("html");
      printhead.appendChild(headcopy);
      printBody.appendChild(childElementcopy);

  printWindow.onafterprint = function() {
    // 在打印对话框关闭后执行的逻辑
    console.log("打印对话框已关闭");

    // 判断用户是否点击了取消按钮
    var printResult = window.matchMedia("print");
    if (printResult.matches) {
      console.log("用户点击了取消按钮");
      // 执行取消打印的相关逻辑
      printWindow.close(); // 关闭新页面
    } else {
      console.log("用户点击了打印按钮");
      // 执行打印操作的相关逻辑
      printWindow.close(); // 关闭新页面
    }
  };

  setTimeout(() => {
    printWindow.document.close();
    printWindow.print();
  }, 500);
  // const printBody = printWindow.document.querySelector('body');
  // const printhead = printWindow.document.querySelector('html');
  // printhead.appendChild(headcopy);
  // printBody.appendChild(childElementcopy);

  // printWindow.document.close();
  // printWindow.print();

  // 监听新窗口的onload事件,在加载完成后执行打印操作



},

对你有帮助的话请点赞收藏,你的鼓励我会收到的

到了这里,关于vue 打印html <iframe>标签(内容打印)超详细的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Vue】Vue 使用 Print.js 打印选中区域的html,用到的是Element ui table表格,解决页面样式不出现或者table表格样式错乱问题!!!

    需求 : 打击打印按钮,文字内容以及表格中的内容 解决方案 加上这句就好了!完美! 一、因为表格数据过多,之前加了表格滚动条,但是打印出来 会把表格上的滚动条也打印出来,所以这里改成了 给弹框加滚动条,去掉表格中的滚动条 2.1 原因: table-layout: fixed导致的,

    2024年02月09日
    浏览(69)
  • 【Vue】 在 vue 中使用 iframe 挂载 html 文件

    首先需要将要挂载的 html 文件放到 public 文件夹中 路径的引用形式 通过绑定 ref 获取到 iframe,data为我需要传递的数据,通过 iframes.postMessage 的方法进行传递。 postMessage 通信具体用法请参考:https://blog.csdn.net/qq_45677671/article/details/128238860

    2024年02月17日
    浏览(46)
  • 2023年最新前端面试题汇总大全(含答案超详细,HTML,JS,CSS汇总篇)-- 持续更新

    专项练习–持续更新 HTML篇 CSS篇 JS篇 Vue篇 TypeScript篇 React篇 微信小程序篇 前端面试题汇总大全二(含答案超详细,Vue,TypeScript,React,微信小程序,Webpack 汇总篇)-- 持续更新 1.xhtml和html有什么区别 功能上 主要是 XHTML 可兼容各大浏览器、手机以及 PDA ,并且浏览器也能快速

    2024年02月12日
    浏览(58)
  • web前端大作业_Html5+CSS3+JS原生项目_京东商城首页 详细代码

    index.html css index.css js index.js 效果图如下:            

    2024年02月11日
    浏览(62)
  • 【HTML】标签读取富文本编辑器的内容

    1.正确读取富文本内容示例: 代码:  显示结果:  在这个例子中, {$row.content}  是直接输出从数据库中获取的富文本内容,包括可能存在的HTML标签和属性,这样可以确保富文本能够按照预期样式呈现。 2. 错误读取富文本内容示例及其原因分析:  代码:  显示结果: 分析

    2024年02月02日
    浏览(49)
  • vue项目关于iframe嵌套的页面,在切换tab标签时会被重新刷新的问题处理方案

    这两天工作中遇到一个这样的需求,切换tab标签时,要求对应的tab页面不刷新,但是项目中加入了一部分含有iframe的页面,在切换路由的过程中,如果使用keep-alive是达不到缓存ifram嵌套的页面效果的。 vue中的keep-alive 1.原理:vue 的缓存机制并 不是直接存储 DOM 结构 ,而是将

    2024年02月04日
    浏览(80)
  • 最详细!!!前端原神官网 (采用html+css+js+dom+ajax+jquery+swiper+json)完整版

    1.该项目采用了大部分前端知识, 完整的复刻原神官网上所显示的全内容 ,非常全面和详细。希望有兴趣的小伙伴萌可以看看和参考一下!!!该项目可以作为大学生 毕设项目(附带项目答辩ppt) 同时也可以作为计算机专业的小伙伴的 期末大作业 。喜欢的请留下你的足迹

    2024年02月05日
    浏览(64)
  • vue-codemirror实现一个前端代码在线编辑器,可处理 HTML,VUE,JS,CSS代码在线编辑

    先找个目录创建一个vue项目 例如 我们想要项目叫 editor 在终端执行 2和3其实都可以 但个人建议 最近还是2会更稳定一些 在终端执行 引入依赖包 然后在项目src目录下创建 utils 文件夹 里面创建一个setting.js 参考代码如下 然后 这边 调用组件的代码 因为项目也刚创 我直接写 s

    2024年02月15日
    浏览(55)
  • Python爬虫——BeautifulSoup,获取HTML中文档,标签等内容

    将复杂的HTML文档转换成一个复杂的树形结构,每个结点都是一个Python对象,所有对象可以分为四种: Tag NavigableString BeautifulSoup Comment 首先要引入该函数,再打开相应的html文件读取其中的内容,在使用BeautiSoup对其进行解析,解析的时候要使用相应类型的解析器html.parser bs当中

    2024年02月06日
    浏览(52)
  • 4.正则提取html中的img标签的src内容

    我们以百度贴吧的1吧举例 目录 1  把网页搞下来 2  收集url 3  处理url 4  空的src 5  容错 6  不使用数字作为文件名 7  并不是所有的图片都用img标签表示 8  img标签中src请求下来不一定正确 9  分页   搞下来之后,双击打开是这样的 我们实际拿的就是 img标签中src的内

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包