JavaScript怎么实现两个窗口之间的通信? https://blog.csdn.net/kaimo313/article/details/107773642

问题
最近在进行业务开发的时候,遇到一个问题,就是一个页面里面点击打开了一个新的窗口,然后在新的窗口里面保存成功数据之后需要更新前面一个窗口的数据?

window.postMessage的简单介绍
一段时间的挣扎,确定了用postMessage实现改功能,没办法,这个再一次涉及到了我的知识盲区。

我们先来看一看MDN上怎么说

简介
【window.postMessage】

window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。

window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

从广义上讲,一个窗口可以获得对另一个窗口的引用(比如 targetWindow = window.opener),然后在窗口上调用 targetWindow.postMessage() 方法分发一个 MessageEvent 消息。

接收消息的窗口可以根据需要自由处理此事件。传递给 window.postMessage() 的参数(比如 message )将通过消息事件对象暴露给接收消息的窗口。

浏览器兼容性
在这里插入图片描述

示例
我们先写好两个页面

demo-1.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>demo-1</title>
</head>
<body>
  <div id="demo-1">demo-1页面</div>
  <button id="btn">点击跳转到demo-2</button>
  <script>
    // 添加点击事件
    document.getElementById('btn').addEventListener('click', () => {
      window.open('./demo-2.html');
    });
    // 监听
    window.addEventListener('message', event => {
      // 我们能信任信息来源吗?
      if (event.origin !== window.location.origin) {
        alert('我们不能信任信息来源!!!!!')
        return;
      }
      console.log(event);
      alert(event.data.message)
    })
  </script>
</body>
</html>

demo-2.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>demo-2</title>
</head>
<body>
  <div id="demo-2">demo-2页面</div>
  <button id="save">保存</button>
  <script>
    // 添加点击事件
    document.getElementById('save').addEventListener('click', () => {
      window.opener.postMessage({
        name: 'demo-2',
        message: '凯小默保存成功啦啦啦啦!!!!'
      }, window.location.origin);
    });
  </script>
</body>
</html>

1、我们用服务打开demo-1.html,然后点击跳转

在这里插入图片描述

2、在demo-2.html页面,点击保存,我们会发现demo-1.html会有小蓝点

在这里插入图片描述

3、接下来我们查看demo-1.html

alert提示
在这里插入图片描述

event数据

在这里插入图片描述

————————————————
版权声明:本文为CSDN博主「凯小默」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kaimo313/article/details/107773642

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值