页面间通信postMessage和onmessage

前言

postMessageonmessage是HTML5的方法,用来解决跨页面通信,或者通过iframe嵌套的不同页面的通信的。
postMessage为发送方,onmessage为接收方。

用法

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

otherWindow是其他窗口的window对象。可以通过以下几种方法获得,例如window.open()返回的窗口对象、window.parent来获取当前父窗口的window对象 或者 iframe元素的contentWindow属性等等。

参数

message:要发送到另一个窗口的数据
targetOrigin:指定此窗口的来源必须是要分派的事件,可以是文字字符串"*"(表示无首选项)或 URI。
transfer(可选):是一串和message 同时传递的 Transferable 对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。

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

event属性

data:从另一个窗口传递的对象
origin:调用 postMessage 时消息发送方窗口的 origin ,通过event.origin获取。要注意的是,当你的页面使用非服务器环境时这个属性值为null,在本地进行测试时请注意这一点,因为你可能拿不到origin的值。此属性用来判断发送方的身份,防止恶意的第三方向页面发送恶意消息进行攻击。 典型来源的示例:https://example.org
source:调用 postMessage 时消息发送方window对象的引用

使用场景

页面与嵌套的 iframe 消息传递

// 父页面
<iframe id="iframe" src="demo.html" frameborder="2" width="100" height="100"></iframe>

<script>
  // 向iframe发送消息
  const iframe = document.querySelector('#iframe');
  iframe.onload = function() {
    iframe.contentWindow.postMessage('我是父页面的数据', '*');
  }
  window.addEventListener('message', (e) => {
    console.log('e', e.data); // 我是iframe数据
  })
</script>
// demo.html
<script>
  window.addEventListener('message', (e)=> {
    console.log('e', e.data) // 我是父页面的数据
    // 向父页面发送数据
    window.parent.postMessage('我是iframe数据', '*') // 也可以写成 e.source.postMessage('我是iframe数据', '*')
  }, false);
</script>

安全问题

如果不希望收到来自其他站点的消息,不要为message事件添加任何事件监听,否则请始终使用originsource属性验证发件人的身份。

window.addEventListener("message", (event)=>{
   var origin = event.origin;
   if (origin !== "http://example.org:8080")
     return;
   // ...
}, false);
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值