前端跨界面之间的通信解决方案

主要是这两个方案,其他的,还有 SharedWorkerIndexedDBWebSocketService Worker

如果是,父子嵌套 iframe 还可以使用 window.parent.postMessage("需要传递的参数", '*')

1、localStorage

核心点

  1. 同源,不能跨域(协议、端口、域名三者有一个不一样)
  2. 使用storage事件监听localStorage变化

示例代码

pageA 界面

html 复制代码
<body>
  <h1>1、localStorage</h1>
  <h2>pageA</h2>
  <script>
    window.addEventListener("storage", (e) => {
      console.info("localStorage发生变化:", e)
    })
  </script>
</body>

pageB 界面

html 复制代码
<body>
  <h1>1、localStorage</h1>
  <h2>pageB</h2>
  <button id="btnB">添加数据到 localStorage</button>
</body>
<script>
  let btnB = document.getElementById("btnB");
  let num = 0;
  btnB.addEventListener("click", () => {
    localStorage.setItem("num", num++)
  })
</script>

当在 B界面上,点击添加的时候,A界面会输出结果

2、BroadcastChannel

核心点

  1. 同源
  2. 两个界面,务必保证频道名称一样

示例代码

pageA界面

html 复制代码
<body>
  <h1>1、localStorage</h1>
  <h2>pageA</h2>
  <h1>2、BroadcastChannel</h1>
  <span id="span2">发送广播</span>
  <script>
    window.addEventListener("storage", (e) => {
      console.info("localStorage发生变化:", e)
    })


    document.querySelector('#span2').addEventListener('click', () => {
      // 创建 某个频道
      var bc = new BroadcastChannel("test_channel");
      bc.postMessage({ msg: "A界面发送来的" })
    })

  </script>
</body>

pageB 界面

html 复制代码
<body>
 <h1>1、localStorage</h1>
 <h2>pageB</h2>
 <button id="btnB">添加数据到 localStorage</button>
</body>
<script>
 let btnB = document.getElementById("btnB");
 let num = 0;
 btnB.addEventListener("click", () => {
   localStorage.setItem("num", num++)
 })


 var bc = new BroadcastChannel("test_channel");
 bc.onmessage = function (ev) {
   console.log('收到了消息', ev);
 };
</script>

window.parent.postMessage

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <iframe src="./son.html" frameborder="0"></iframe>
  <script>

    //监听单个事件
    window.addEventListener('message', function (msg) {
      console.log(msg, '发生了变化')
    })
  </script>
</body>

</html>
html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <h2>发送请求</h2>
  <script>
    // window.parent 是 iframe 子页面获取父页面的 window 对象

    document.querySelector('h2').addEventListener('click',()=>{
      window.parent.postMessage("需要传递的参数", '*')
    })
    // 后面的 * 号就是处理跨域问题的,任何域名都不会出现跨域问题
 

    // 也可以指定传送域名地址,这个域名不会出现跨域问题,写父页面(接收)域名地址
    // window.parent.postMessage("需要传递的参数", 'http://0.0.0.0:8080')
    // 传递的参数可以是数组,对象,字符串等
  </script>
</body>

</html>

3、参考连接

BroadcastChannel MDN 介绍

相关推荐
祝余呀2 分钟前
HTML初学者第四天
前端·html
浮桥1 小时前
vue3实现pdf文件预览 - vue-pdf-embed
前端·vue.js·pdf
七夜zippoe2 小时前
前端开发中的难题及解决方案
前端·问题
晓13133 小时前
JavaScript加强篇——第七章 浏览器对象与存储要点
开发语言·javascript·ecmascript
Hockor3 小时前
用 Kimi K2 写前端是一种什么体验?还支持 Claude Code 接入?
前端
杨进军3 小时前
React 实现 useMemo
前端·react.js·前端框架
海底火旺3 小时前
浏览器渲染全过程解析
前端·javascript·浏览器
你听得到113 小时前
揭秘Flutter图片编辑器核心技术:从状态驱动架构到高保真图像处理
android·前端·flutter
驴肉板烧凤梨牛肉堡3 小时前
浏览器是否支持webp图像的判断
前端
Xi-Xu3 小时前
隆重介绍 Xget for Chrome:您的终极下载加速器
前端·网络·chrome·经验分享·github