如何实现网页多标签tab通讯?

news/2024/9/17 9:04:14 标签: 前端, javascript, 开发语言
  • 通过websocket
    • 无跨域限制
    • 需要服务端支持,成本高
  • 通过localStorage同域通讯(推荐)
    • 同域AB两个页面
    • A页面设置localStorage
    • B页面可监听到localStorage值的修改
  • 通过SharedWorker通讯
    • SharedWorkerWebWorker的一种
    • WebWorker可开启子进程执行JS,但不能操作DOM
    • SharedWorker可单独开启一个进程,用于同域页面通讯
    • SharedWorker兼容性不太好,调试不方便,IE11不支持

localStorage通讯例子

<!-- 列表页 -->
<p>localStorage message - list page</p>

<script>
  // 监听storage事件
  window.addEventListener('storage', event => {
    console.info('key', event.key)
    console.info('value', event.newValue)
  })
</script>

<!-- 详情页 -->
<p>localStorage message - detail page</p>

<button id="btn1">修改标题</button>

<script>
  const btn1 = document.getElementById('btn1')
  btn1.addEventListener('click', () => {
    const newInfo = {
      id: 100,
      name: '标题' + Date.now()
    }
    localStorage.setItem('changeInfo', JSON.stringify(newInfo))
  })

  // localStorage 跨域不共享
</script>

SharedWorker通讯例子

本地调试的时候打开chrome隐私模式验证,如果没有收到消息,打开chrome://inspect/#workers => sharedWorkers => 点击inspect

<p>SharedWorker message - list page</p>

<script>
  const worker = new SharedWorker('./worker.js')
  worker.port.onmessage = e => console.info('list', e.data)
</script>

<p>SharedWorker message - detail page</p>
<button id="btn1">修改标题</button>

<script>
  const worker = new SharedWorker('./worker.js')

  const btn1 = document.getElementById('btn1')
  btn1.addEventListener('click', () => {
    console.log('clicked')
    worker.port.postMessage('detail go...')
  })
</script>

// worker.js

/**
 * @description for SharedWorker
 */

const set = new Set()

onconnect = event => {
  const port = event.ports[0]
  set.add(port)

  // 接收信息
  port.onmessage = e => {
    // 广播消息
    set.forEach(p => {
      if (p === port) return // 不给自己广播
      p.postMessage(e.data)
    })
  }

  // 发送信息
  port.postMessage('worker.js done')
}

如何实现网页和iframe之间的通讯 ?

  • 使用postMessage通信
  • 注意跨域的限制和判断,判断域名的合法性

演示

<!-- 首页 -->
<p>
  index page
  <button id="btn1">发送消息</button>
</p>

<iframe id="iframe1" src="./child.html"></iframe>

<script>
  document.getElementById('btn1').addEventListener('click', () => {
    console.info('index clicked')
    window.iframe1.contentWindow.postMessage('hello', '*') // * 没有域名限制
  })

  // 接收child的消息
  window.addEventListener('message', event => {
    console.info('origin', event.origin) // 来源的域名
    console.info('index received', event.data)
  })
</script>

<!-- 子页面 -->
<p>
  child page
  <button id="btn1">发送消息</button>
</p>

<script>
  document.getElementById('btn1').addEventListener('click', () => {
    console.info('child clicked')
    // child被嵌入到index页面,获取child的父页面
    window.parent.postMessage('world', '*') // * 没有域名限制
  })

  // 接收parent的消息
  window.addEventListener('message', event => {
    console.info('origin', event.origin) // 判断 origin 的合法性
    console.info('child received', event.data)
  })
</script>

效果


http://www.niftyadmin.cn/n/5640943.html

相关文章

使用FFmpeg的AVFilter转换YUV到RGB

AVFilter 是 FFmpeg 库 libavfilter 的核心组件&#xff0c;提供了一套强大的音视频处理框架&#xff0c;用于对音视频流进行复杂的过滤、转换和效果处理。通过 AVFilter&#xff0c;开发者可以构建自定义的滤镜图&#xff08;filter graph&#xff09;&#xff0c;实现各种音视…

Spring中使用ResponseStatusExceptionResolver处理HTTP异常响应码

目录 常用HTTP状态码分类和HttpStatus枚举的对应关系错误请求处理过程定义ResourceBadRequestException类在监测到相应的问题时抛出对应的异常 在日常开发过程中&#xff0c;Spring中默认的HTTP状态处理并不能满足所以场景&#xff0c;可以使用ResponseStatusExceptionResolver…

【机器人工具箱Robotics Toolbox开发笔记(九)】 机器人逆运动学分析

​1. 逆运动学理论基础 机器人逆运动学的问题即已知机器人末端的工具坐标系相对于基坐标系的位姿,计算所有能够到达给定位置和姿态的关节角。 对于以上的问题,有以下几种情况: (1)不存在相应的解 当所期望的位姿离基坐标系太远,而机器人不够长时,末端执行器无法达到…

【微处理器系统原理与应用设计第二讲】微处理器的基本架构之组成原理和系统结构

本文首先讲解微处理器的重要组成部分&#xff0c;之后会穿插数电的知识进行相关功能电路的设计&#xff0c;以达到从理论到实践的效果。 一. 组成原理 1. 运算器 ALU是微处理器中执行所有算术和逻辑操作的部件。主要的功能是加减乘除&#xff0c;与或非异或比较等。&#xff…

计算机毕业设计 二手闲置交易系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

微服务中的服务降级与熔断机制

目录&#xff1a; 1、简介2、服务降级2.1. Hystrix基础配置2.2. 启用Hystrix2.3. 实现服务降级2.4. 配置Hystrix 3、熔断机制3.1. 配置熔断器3.2. 查看Hystrix Dashboard 1、简介 在微服务架构中&#xff0c;服务降级与熔断机制是保证系统稳定性和可靠性的关键技术。当系统中的…

【避坑指南】避免几个坑,OpenCV的轮廓分析速度也可以很快!

前一篇请看CSDN 博文 【性能飞升】OpenCV-Python改动一行代码性能提升百倍以上 学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; 缘由 这个是跟CCL分析速度很慢的姊妹篇文章&…

前端:HTML、CSS、JS、Vue

1 前端 内容概要 了解前端三件套(HTML、CSS、JS)在前端所起的作用掌握HTML标签的功能&#xff0c;掌握重要标签(a标签&#xff0c;form标签)了解CSS了解JS的基础语法掌握Vue的基础语法重点掌握Vue项目怎么启动项目掌握前后端分离是什么。前端做什么事情&#xff0c;后端做什么…