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

主要是这两个方案,其他的,还有 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 介绍

相关推荐
这儿有一堆花6 分钟前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架
全栈前端老曹20 分钟前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
NCDS程序员1 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
夏幻灵1 小时前
CSS三大特性:层叠、继承与优先级解析
前端·css
小杨同学呀呀呀呀1 小时前
Ant Design Vue <a-timeline>时间轴组件失效解决方案
前端·javascript·vue.js·typescript·anti-design-vue
qq_532453531 小时前
使用 Three.js 构建沉浸式全景图AR
开发语言·javascript·ar
华玥作者9 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
Mr Xu_10 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠10 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
sleeppingfrog10 小时前
zebra通过zpl语言实现中文打印(二)
javascript