iframe通信postMessage

iframe嵌入页面是实现微前端的方式之一。由于浏览器的跨域限制,iframe与父页面之间的通信变得不是那么容易。postMessage解决了这个问题。从广义上讲,一个窗口可以获得对另一个窗口的引用(比如 targetWindow = window.parent),然后在窗口上调用 targetWindow.postMessage() 方法分发一个 MessageEvent 消息。

语法

otherWindow.postMessage(message, targetOrigin, [transfer]);

注意: 此处的otherWindow指的是目标页面的一个引用,比如 iframe 的 contentWindow,也就是你想往哪里发送信息,就要使哪里的window。

  • 第一个参数是发送的消息对象;
  • 第二个参数表示目标地址,通过窗口的 origin 属性来指定哪些窗口能接收到消息事件,其值可以是字符串"*"(表示无限制)或者一个 URI。
  • 第三个参数可选,是一串和 message 同时传递的 Transferable 对象。这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。

实例

父传子

父页面通过一个按钮将一条消息发送到嵌入的iframe中,并在iframe中显示该消息
父页面结构

	//页面结构
    <p>mian页面</p>
    <p id="message">iframe发来的消息:</p>
    <p><button id="pButton">发消息</button></p>
    <div class="frameWrap">
        <iframe id='iframe' src="./iframe.html" frameborder="0"></iframe>
    </div>

父页面js代码

   let button = document.querySelector('#pButton')
    let iframe = document.querySelector('#iframe')
    button.addEventListener('click',function(){
        //alert(1)
        iframe.contentWindow.postMessage('父页面发送的消息就是我','*')
    })

子页面iframe的结构

  <div id="content">我是iframe</div>
  <button>发消息</button>

子页面js代码

	//在子页面的window上添加监听message事件,在事件方法中获取消息,并显示
  window.addEventListener('message',function(e){
      document.querySelector("#content").innerHTML = e.data
  })

在这里插入图片描述

子传父

子页面获取父页面window的引用,并发送消息

 let button = document.querySelector('button')
    button.addEventListener('click',e=>{
        window.parent.postMessage('我是子组件发送的消息','*')
    })

父页面监听message事件,并显示出来。

  window.addEventListener('message',e => {
        document.querySelector('#message').innerHTML=e.data
    })

在这里插入图片描述

<think>好的,用户想了解如何通过postMessage实现与iframe的跨域通信。我需要根据提供的引用内容来组织一个清晰的教程。首先,我应该先解释postMessage的基本概念和作用,然后分步骤说明父页面和子页面如何发送和接收消息,同时强调安全措施,比如检查origin。引用中的示例代码可以作为例子,可能需要简化或添加注释以便理解。另外,要指出跨域通信的注意事项,比如目标域设置和事件监听的处理。还要确保符合用户要求的格式,使用中文,行内公式用$...$,独立公式用$$...$$,但在这个主题里可能数学公式不多,不过如果有的话要注意格式。最后生成相关问题,比如安全性、替代方案、处理复杂数据等。需要检查是否有遗漏的关键点,比如发送和接收的代码示例,以及引用的正确标注。</think>### 使用 postMessage 实现 iframe 跨域通信教程 #### 1. 基本原理 `postMessage` 是 HTML5 提供的跨域通信 API,通过消息传递机制实现不同源窗口间的数据交互。父页面与子页面可通过 `window.postMessage()` 发送消息,并通过监听 `message` 事件接收数据[^1]。 #### 2. 实现步骤 **步骤 1:父页面向子页面发送消息** ```html <!-- 父页面代码 --> <iframe id="childFrame" src="子页面地址"></iframe> <script> const iframe = document.getElementById('childFrame'); // 发送消息到子页面 iframe.contentWindow.postMessage({ text: '父页面的消息' }, '*'); </script> ``` - `postMessage` 参数说明: 1. **消息内容**:支持字符串、对象等结构化数据 2. **目标域**:指定接收方域名(`'*'` 表示不限制)[^2] **步骤 2:子页面接收父页面消息** ```html <!-- 子页面代码 --> <script> window.addEventListener('message', (event) => { // 安全验证:检查来源是否可信 if (event.origin !== '父页面域名') return; console.log('收到父页面消息:', event.data); }); </script> ``` **步骤 3:子页面向父页面返回消息** ```html <!-- 子页面代码 --> <script> // 发送消息到父页面 window.parent.postMessage({ reply: '子页面的回复' }, '*'); </script> ``` **步骤 4:父页面接收子页面消息** ```html <!-- 父页面代码 --> <script> window.addEventListener('message', (event) => { // 验证消息来源 if (event.origin !== '子页面域名') return; console.log('收到子页面回复:', event.data); }); </script> ``` #### 3. 安全注意事项 - **验证 `event.origin`**:避免恶意网站伪造消息[^3] - **限制目标域**:避免使用 `'*'` 通配符,明确指定目标域名 - **敏感数据加密**:传输密码等数据时需加密 #### 4. 完整示例 ```html <!-- 父页面 --> <button onclick="sendToChild()">发送消息</button> <iframe id="child" src="child.html"></iframe> <script> function sendToChild() { const iframe = document.getElementById('child'); iframe.contentWindow.postMessage({ cmd: 'update', data: 123 }, 'https://子页面域名'); } window.addEventListener('message', (e) => { if (e.origin !== 'https://子页面域名') return; console.log('子页面响应:', e.data); }); </script> <!-- 子页面 child.html --> <script> window.addEventListener('message', (e) => { if (e.origin !== 'https://父页面域名') return; e.source.postMessage({ status: 'received' }, e.origin); }); </script> ``` #### 5. 数学公式补充说明 若涉及数据传输校验,可使用哈希函数如: $$ H(m) = \text{SHA-256}(m) $$ 确保消息完整性[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值