美文网首页
iframe父子传参通信 之 postMessage

iframe父子传参通信 之 postMessage

作者: 头发飘逸 | 来源:发表于2022-01-17 20:50 被阅读0次

window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

以上摘自MDN 原文 postMessage;

背景:

应项目需求,需求对两个项目进行相互通信。A应用调用B应用里的某些页面,B应用发送消息给到A应用,想到了使用iframe 中的postMessage,最主要的是postMessage支持跨域使用,因此也避免了很多使用上的问题

例子

我这边使用的是react,所以就暂且用react来写例子了

子传父

父应用使用iframe前套子应用
import React, { useEffect } from 'react';
const Index = () => {
  useEffect(()=>{
    window.addEventListener('message',function(event){
        if(event.data=='close'){
            console.log('获取到子应用传递过来的值')
            console.log(event)
        }
    })
  },[])

  return (
   <div>
    <iframe src="http://10.1.38.13:8001" width={800} height={800}></iframe>
   </div>
  );
};

export default Index;
子应用被嵌套后传递值到父应用
import styles from './index.less';
import { Button } from 'antd';

export default function IndexPage() {
  const fnNs = ()=>{
    window.parent.postMessage('close','*');
  }
  return (
    <div>
       <h1 className={styles.title}>Page index 我是子应用 哈哈哈哈</h1>
      <Button onClick={fnNs}>子传父</Button>
    </div>
  );
}

父传子

父应用通过iframe嵌套子应用,并传递数据到子应用
import React, { useEffect } from "react";

const Index = ()=>{
    useEffect(()=>{
        createIframe('http://10.1.38.13:8001', 'calculation');
    },[]);

    /**
     * 创建iframe
     * @param src 子应用地址
     * @param element 希望在某个元素上添加
     */
    const createIframe = (src:string, element:string)=>{
        // 在此元素上添加iframe
        const childFrameObj:any = document.getElementById(element);
        const iframe:any = document.createElement("iframe");
        iframe.src = src;
        childFrameObj.appendChild(iframe);

        // 判断iframe是否加载完成 
        if (iframe.attachEvent){
            iframe.attachEvent("onload", ()=>{
              iframe.contentWindow.postMessage('啦啦啦 传值给子应用呀', '*');
            });
        } else {
            iframe.onload = ()=>{
              iframe.contentWindow.postMessage('啦啦啦 传值给子应用呀', '*');
            };
        }
    }

    return (
        <div id='calculation'>
        </div>
    )
}

export default Index;
子应用被访问,并接收父应用传递过来的值
import React, { useEffect } from 'react';
import styles from './index.less';

export default function IndexPage() {
  useEffect(()=>{
    window.addEventListener('message',function(event){
      console.log('--------获取被父应该调用后传递过来的值---------')
      console.log(event.data)
    })
  },[])


  return (
    <div>
       <h1 className={styles.title}>Page index 我是子应用 哈哈哈哈</h1>
    </div>
  );
}

相关文章

  • iframe父子传参通信 之 postMessage

    window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们...

  • FE-interview-Q&A

    浏览器标签页通信 WebSocket (可跨域) postMessage(可跨域)iframe 父子通信np = ...

  • iframe父子通信postMessage

    1、父级:接收iframe子页面发送的参数,如下接收就可以 2、子页面:发送数据给父级页面

  • 父子iframe通信问题

    主页面 子iframe 总结:iframe通信主要使用到了postMessage方法,使用方法为:otherWin...

  • 跨域iframe通信

    主页面与不同域名的iframe之间通信 window.postMessage() The window.postM...

  • 2019-03-31 iframe 子页面 postMessag

    参考链接:使用 postMessage 解决 iframe 跨域通信问题 iframePage.html是inde...

  • Vue组件通信

    Vue 组件之间的通信,通常我们遇到的都是父子组件之间的通信 一、父子组件传参 子组件定义 Props 属性; 父...

  • iframe postMessage

    iframe postMessage postMessage 是 HTML5 XMLHttpRequest Le...

  • vue第七节

    Vue里组件的通信 通信:传参、控制(A操控B做一个事件)、数据共享 模式:父子组件间、非父子组件 父组件可以将一...

  • vue+webpack+postMessage+iframe双标

    本文记录一下工作中关于双标签页通信问题 涉及的技术:vue webpack postMessage iframe ...

网友评论

      本文标题:iframe父子传参通信 之 postMessage

      本文链接:https://www.haomeiwen.com/subject/zqqhhrtx.html