JavaScript怎么实现两个窗口之间的通信?

简介: JavaScript怎么实现两个窗口之间的通信?

问题

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




window.postMessage的简单介绍


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


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


简介

【window.postMessage】


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


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


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


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


浏览器兼容性


aHR0cHM6Ly9ub3RlLnlvdWRhby5jb20veXdzL3B1YmxpYy9yZXNvdXJjZS8yMzU2YzY3ZTMyYzFlYzI0OGRiOTY1ZTlhM2MzNWI1Yi83NDU2QkNGMDVDMTA0QTYxQUMwQjVFQTcwRjkwOTM4Nw.png


示例

我们先写好两个页面

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,然后点击跳转

aHR0cHM6Ly9ub3RlLnlvdWRhby5jb20veXdzL3B1YmxpYy9yZXNvdXJjZS8yMzU2YzY3ZTMyYzFlYzI0OGRiOTY1ZTlhM2MzNWI1Yi80RTQ2MUQxNjRFQjI0MjU0OTg2OERDOUM1QjBCMEZBNg.png

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

aHR0cHM6Ly9ub3RlLnlvdWRhby5jb20veXdzL3B1YmxpYy9yZXNvdXJjZS8yMzU2YzY3ZTMyYzFlYzI0OGRiOTY1ZTlhM2MzNWI1Yi81NTUzRUE2NDdFMjM0MDFCQkQ4M0VFQUExQjJGQTE3RQ.png

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

alert提示


aHR0cHM6Ly9ub3RlLnlvdWRhby5jb20veXdzL3B1YmxpYy9yZXNvdXJjZS8yMzU2YzY3ZTMyYzFlYzI0OGRiOTY1ZTlhM2MzNWI1Yi9ENzk1QUE3QTUzRkM0RUJGOTVFMzlGQjZCNEFDRDI4OA.png

event数据


aHR0cHM6Ly9ub3RlLnlvdWRhby5jb20veXdzL3B1YmxpYy9yZXNvdXJjZS8yMzU2YzY3ZTMyYzFlYzI0OGRiOTY1ZTlhM2MzNWI1Yi9GOEUxMzNFOTc3MkE0RDk3OUMzQjlCQjU0ODcwMENCRQ.png





目录
相关文章
|
29天前
|
JavaScript 前端开发 UED
JS:如何获取浏览器窗口尺寸?
JS:如何获取浏览器窗口尺寸?
37 1
|
8月前
|
JavaScript 前端开发 UED
Vue.js中的父子组件通信:构建交互性和可维护性的组件
Vue.js是一款流行的JavaScript框架,以其组件化的开发方式而著称。在Vue.js中,父子组件通信是实现组件之间交互和数据传递的重要机制。在本博客中,我们将深入研究父子组件通信的概念、用法、传递数据的方式以及如何有效地利用它来构建交互性和可维护性的组件。
39 0
|
8月前
|
JavaScript 前端开发 UED
Vue.js中的自定义事件:组件间通信的灵活工具
Vue.js是一款流行的JavaScript框架,以其组件化的开发方式而著称。在Vue.js中,自定义事件是一种强大的机制,用于在组件之间进行通信和交互。在本博客中,我们将深入研究自定义事件的概念、创建、触发和监听,以及如何利用它来实现灵活的组件间通信。
35 0
|
8月前
|
JavaScript
Vue | Vue.js 组件化 - 组件间通信
Vue | Vue.js 组件化 - 组件间通信
|
5月前
|
存储 JavaScript 安全
js中多个页面之间如何进行通信?有什么区别?
js中多个页面之间如何进行通信?有什么区别?
40 0
|
5月前
|
JavaScript
js实现跨浏览器tab选项卡页通信、传参,监听localStorage.变量的实时变化,实现打开多个浏览器页面窗口相互可以传参通信
js实现跨浏览器tab选项卡页通信、传参,监听localStorage.变量的实时变化,实现打开多个浏览器页面窗口相互可以传参通信
|
5月前
|
JavaScript 前端开发
js怎样获取浏览器窗口尺寸
js怎样获取浏览器窗口尺寸
30 1
|
6月前
|
前端开发 JavaScript 数据处理
【JavaScript】在前后端通信方面的优势
【JavaScript】在前后端通信方面的优势
22 0
|
6月前
|
JavaScript 前端开发
js怎样获取浏览器窗口尺寸
js怎样获取浏览器窗口尺寸
34 0
|
7月前
|
前端开发 JavaScript 安全
带你读《现代Javascript高级教程》二十一、前端跨页面通信:实现页面间的数据传递与交互(1)
带你读《现代Javascript高级教程》二十一、前端跨页面通信:实现页面间的数据传递与交互(1)