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





目录
相关文章
|
8月前
|
JavaScript 前端开发 UED
JS:如何获取浏览器窗口尺寸?
JS:如何获取浏览器窗口尺寸?
275 1
|
3月前
|
JavaScript 前端开发
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
|
8月前
|
JSON JavaScript 前端开发
【JavaScript技术专栏】JavaScript的跨域通信方法
【4月更文挑战第30天】本文探讨了JavaScript中的跨域通信方法,包括:同源策略和跨域通信的概念,以及JSONP、CORS、WebSockets、`window.postMessage()`、代理服务器和WebAssembly的使用。这些技术各有优劣,适用于不同的场景,是Web开发者解决跨域问题的关键工具。随着Web技术的演进,跨域通信的解决方案也将不断更新。
160 0
|
7月前
|
JavaScript 前端开发 API
JavaScript基础-BOM与窗口交互
【6月更文挑战第12天】本文介绍了BOM(浏览器对象模型),它是JavaScript与浏览器交互的API。核心对象包括顶级对象window、document、location、navigator和history。常见问题涉及window全局作用域、location.href编码、history使用和navigator.userAgent检测。提供了代码示例,如设置页面标题、页面跳转及利用history实现无刷新跳转。掌握BOM基础和最佳实践对前端开发至关重要。
53 5
|
6月前
|
JavaScript 前端开发 API
JS案例:前端Iframe及Worker通信解决思路
JS案例:前端Iframe及Worker通信解决思路
113 0
|
8月前
|
设计模式 存储 消息中间件
JavaScript观察者模式:实现对象间的事件通信!
JavaScript观察者模式:实现对象间的事件通信!
|
7月前
|
JavaScript 前端开发
js怎样获取浏览器窗口尺寸
js怎样获取浏览器窗口尺寸
|
8月前
|
JavaScript 前端开发
JavaScript 窗口
JavaScript 窗口
|
8月前
|
JavaScript API
Vue.js组件精讲 组件的通信2:派发与广播——自行实现dispatch和broadcast方法
Vue.js 的 provide/inject API 主要用于跨级组件通信,侧重于子组件获取上级状态。但无法良好处理两种场景:父向子(跨级)传递数据和子向父(跨级)传递数据。在这种情况下,虽然Vue推荐使用Vuex,但在某些场景下,可以使用自定义的`dispatch`和`broadcast`方法。这两个方法在Vue 1.x中存在,但在2.x中被废弃。`$emit`用于触发当前组件的自定义事件,而`$on`用于监听这些事件。在Vue 2.x中,我们将自行实现`dispatch`和`broadcast`以实现类似的功能,允许父子组件(包括跨级)之间的通信,特别是当组件层级不深且无需全面状态管理时
67 0
|
8月前
|
JavaScript 前端开发
js怎样获取浏览器窗口尺寸
js怎样获取浏览器窗口尺寸
69 1