#独家
dom 为什么必须刷新才会响应 $nextTick 中调用 window.print() 后影响 dom 的操作 ?

2023-05-04 0 4,047

代码示例如下:

...
<div :id="pageStyle" ref="page" >
...
    // 打印函数
    fun() {
    //将要打印的区域修改为打印样式
    this.pageStyle='pageprint'
      this.$nextTick(()=>{
        //将要打印的区域单独保存到变量中
        let printHtml = this.$refs.page.innerHTML; 
        //将完整的页面保存到变量中
        let oldHtml = window.document.body.innerHTML;
        //修改页面,只保留要打印的部分
        document.body.innerHTML = printHtml;
        //打印页面
        window.print();
        //打印完成后,将页面恢复为完整页面
        document.body.innerHTML = oldHtml;
        //恢复打印区域的样式
        this.pageStyle='page'
        // 就是这一句,为什么不加的话this.pageStyle='page' 就不会生效?
        this.$router.go(0)
      })
    },
...
#page{...}
#pageprint{...}

我知道 DOM 的刷新是在这一轮计算完成之后才进行,只有 this.$nextTick 中的运算是在 DOM 刷新后才进行的,那我在 this.$nextTick 中进行了会引起页面刷新的运算不就应该在这些运算结束后再一次引起 DOM 刷新?可是这里为什么还要加一个刷新页面才可以生效?

试试这个方法:

fun() {
  this.pageStyle = "pageprint";
  this.$nextTick(() => {
    let iframe = document.createElement("iframe");
    iframe.style.display = "none";
    document.body.appendChild(iframe);

    const stylesheets = Array.from(document.querySelectorAll("link[rel='stylesheet'], style"));
    stylesheets.forEach((stylesheet) => {
      const clonedStylesheet = stylesheet.cloneNode(true);
      iframe.contentWindow.document.head.appendChild(clonedStylesheet);
    });

    iframe.contentWindow.document.body.innerHTML = this.$refs.page.innerHTML;

    iframe.contentWindow.print();

    document.body.removeChild(iframe);

    this.pageStyle = "page";
  });
},
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. JK下载官网所有资源来源于开发团队,加入会员即可下载使用!如有问题请联系右下角在线客服!
2. JK下载官方保障所有软件都通过人工亲测,为每位会员用户提供安全可靠的应用软件、游戏资源下载及程序开发服务。
3. JK开发团队针对会员诉求,历经多年拥有现今开发成果, 每款应用程序上线前都经过人工测试无误后提供安装使用,只为会员提供安全原创的应用。
4. PC/移动端应用下载后如遇安装使用问题请联系右下角在线客服或提交工单,一对一指导解决疑难。

JK软件下载官网 技术分享 dom 为什么必须刷新才会响应 $nextTick 中调用 window.print() 后影响 dom 的操作 ? https://www.jkxiazai.com/1676.html

JK软件应用商店是经过官方安全认证,保障正版软件平台

相关资源

官方客服团队

为您解决烦忧 - 24小时在线 专业服务