• iframe之间传递数据笔记


    我们公司的很多项目都是门户iframe内嵌子系统的形式,有时候会需要门户给子系统传递数据,或者子系统给门户传递数据的情况。

    传递数据 我使用的是H5的postMessage

    简单说一下postMessage的用法

    window.postMessage({name:'lisa'},'*')  发布消息 传递数据name

    window.addEventListener('message',(res)=>{//监听数据

        console.log(res.data.name)

    })

    以上讲的比较简单,要想具体学习,自行研究。

    先说下比较简单的,子系统给门户传递数据是比较简单的(以下场景是iframe内外层都在一个项目中的不同组件)

    window.parent.postMessage({name:'lisa'},'*')  //内层发布消息

    window.addEventListener('message',(res)=>{})//外层接收消息

    外层给内层传递数据,且外层是门户项目,内层是子系统

    门户菜单待办事项菜单有代办数量的展示,是调接口获取的(每30秒获取一次)

    代办事项页面是各种业务类型的tab展示,每种业务类型也要加代办数量。如果内外层都是分别每30秒调接口获取,会出现变化不同步的情况。因为两个系统可能调接口的时间不一致

    所以一种方式就是 门户获取到代办数量的数据后通过postMessage传递给子系统。

    门户postMessage

    这里门户要找到iframe.contentWindow然后postMessage;

    angular是通过viewChild获取到iframe

    iframe.nativeElement.contentWindow.postMessage

    子系统接收

    window.addEventListener('message',(res)=>{})

    这里有个坑就是,如果你打开多个菜单,也就是多个tab页,那通过viewChild获取到的iframe就是个数组,这个时候postMessage,子系统是获取不到数据的

    解决办法有很多,我是只有待办事项一个tab页需要接收数据,在门户加了代码控制,只给代办事项的iframe加#iframeObj,这样通过viewChild获取到的就是待办事项的iframe

    如果你的系统需要给每个菜单都传递数据,你遍历获取到的iframe,然后postMessage就可以了

  • 相关阅读:
    C++中为何需要函数
    Tomact目录结构的介绍
    Spring5学习笔记07--Bean 初始化与销毁
    搭建 Github 上的 Hexo 博客
    罗丹明标记的葡聚糖 70k,RB-Dextran,MW:70K
    LinkedList集合
    ARMday03(寄存器读写、栈、程序状态寄存器、软中断和异常、混合编程)
    编程基础-C++入门到入土知识手册
    计蒜客 T1895切蛋糕(单调队列)
    JAVA毕业设计100—基于Java+Springboot+Vue的WMS仓库管理系统+移动端微信小程序(源码+数据库+部署视频)
  • 原文地址:https://blog.csdn.net/e87e09e11/article/details/127695492