众多跨标签页通信方式,你知道哪些?(二)

书接上回,由于时间原因,还有几种情况没有总结,今天抽时间总结一下,其他情况请查看这里,众多跨标签页通信方式,你知道哪些?

以下则是常用的通信方法

  • BroadCast Channel
  • Service Worker
  • LocalStorage + window.onstorage 监听
  • Shared Worker 定时器轮询(setInterval)
  • IndexedDB 定时器轮询(setInterval)
  • cookie 定时器轮询(setInterval)
  • window.open + window.postMessage(非同源也可)
  • Websocket (非同源也可)

IndexedDB 定时器轮询(setInterval)

  • IndexedDB是一种底层的API,用于在客户端存储大量的结构化数据。
  • 它是一种事务型数据库系统,是一种基于JavaScript面向对象数据库,有点类似于NoSQL(非关系型数据库)。
  • IndexDB本身就是基于事务的,我们只需要指定数据库模式,打开与数据库的连接,然后检索和更新一系列事务即可。

indexedDB的详细使用请看这里

下面就简单演示先通信的过程,就是在两个同源页面进行获取数据。

js 复制代码
// 页面一
<button>新增</button>
<button>查询</button>
<button>删除</button>
<button>修改</button>
<script src="db.js"></script>
js 复制代码
// 页面二
<script>
    function openDB() {
      return new Promise((resolve,reject) => {
        const dbRequest = indexedDB.open("zhDB", 3)
        let db = null
        dbRequest.onsuccess = function(event) {
          db = event.target.result
          resolve(db)
        }
      })
    }
    const getAllData = async (db) => {
      return new Promise((resolve, reject) => {
        const transaction = db.transaction("users", "readwrite")
        const store = transaction.objectStore("users")
        const res = store.getAll()
        res.onerror = () => {
          reject([])
        }

        res.onsuccess = () => {
          resolve(res.result)
        }
      })
    }

    let infoData = []
    openDB().then(db => {
      setInterval(async () => { 
        const data = await getAllData(db)
        if(infoData.length !== data.length) {
          infoData = data
          console.log("infoData", infoData)
        }
      }, 1000)
    })
</script>

具体代码请访问\]([cross-page-communication/IndexDB at main · zhang-glitch/cross-page-communication · GitHub](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fzhang-glitch%2Fcross-page-communication%2Ftree%2Fmain%2FIndexDB "https://github.com/zhang-glitch/cross-page-communication/tree/main/IndexDB")) ## cookie 定时器轮询(setInterval) mdn对于cookie各个属性及注意事项讲的非常清楚,可以在复习一下。[cookie](https://link.juejin.cn?target=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-CN%2Fdocs%2FWeb%2FHTTP%2FCookies "https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies") 这种跨页面通信方式也是在同源页面下才可以使用的。 ```js // 页面一 ``` ```js // 页面二 ``` ![cookie通信.gif](https://file.jishuzhan.net/article/1767735666105389058/5ea52aed6a02ca8634d82620ed144516.webp) ## window.open + window.postMessage **window.postMessage()** 方法可以安全地实现跨源通信。所以这种方式也是一种可以在非同源的页面进行通信的方式。 这里用到了`window.open`来打开一个页面,因为我们在向其他页面发送消息时,需要拿到目标页面的引用。[具体请看mdn](https://link.juejin.cn?target=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-CN%2Fdocs%2FWeb%2FAPI%2FWindow%2Fopen "https://developer.mozilla.org/zh-CN/docs/Web/API/Window/open") 通信的大致过程就是 * 我们通过`window.open`打开target页面。 * 获取到target页面引用,然后调用`postMessage`方法,该方法参数一是发送的数据,参数二是哪些源可以接收到该消息,**该参数指定目标页面必须和指定的源协议,域名,端口号一致才可以监听到消息**。 * 目标页面接收到消息后,对比`event.origin`,如果是发送方则可以使用`postMessage`回复消息。 ```js // 页面一 ``` ```js // 页面二 ``` ![postMessage.gif](https://file.jishuzhan.net/article/1767735666105389058/d9b93d88d4f28ceb3fd64309df64b832.webp) ## Websocket 在我们跨标签页通信中,WebSocket服务器就相当于中间人。就像`Service Worker`,`Shared Worker`通信方式一样,当我们接收到一个页面传递来的消息后,我们再将消息分发给其他页面。这也得益于websocket强大的服务器向客户端主动发送消息的能力。 **这种方式也是可以在非同源页面进行通信的。** ```js // 创建一个websocket服务器,这里使用ws快速创建 const {WebSocketServer} = require("ws") // 创建wb服务器 const wbss = new WebSocketServer({ port: 3000 }) // 保存客户端链接实例 const clients = [] // 客户端连接时触发 wbss.on("connection", (client) => { clients.push(client) console.log("clients:1 客户端连接数", clients.length); // 绑定当前客户端连接,获取消息 client.on('message', function message(data) { console.log('data', data); // 将消息传递给其他客户端 clients.forEach(c => { if(c !== client) { c.send(data) } }) }); // 客户端断开连接(关闭或者刷新) client.on("close", () => { const findIndex = clients.findIndex(c => c === client) clients.splice(findIndex, 1) console.log("clients:2 客户端连接数", clients.length); }) }) ``` ```js // 页面一 ``` ```js // 页面二 ``` ![websocket.gif](https://file.jishuzhan.net/article/1767735666105389058/c75a81ea37a6a0979e110f97844c73e0.webp) 所有的案例代码请访问这里 [zhang-glitch/cross-page-communication: 跨页面通信方案总结 (github.com)](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhang-glitch%2Fcross-page-communication "https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhang-glitch%2Fcross-page-communication")) ## 总结 以上这八种方法梳理了常见的跨标签页面通信的过程,开发中一般对于同源页面使用`LocalStorage + window.onstorage 监听`,`BroadCast Channel`这两种方式,对于非同源页面使用`window.open + window.postMessage`这种方式即可。其他方式了解即可。 其实这种通信方式有一些共性,`indexedDB, cookie, localStorage`方式,他们都是浏览器存储方式,同源页面可以获取到这些内容,因此就可以进行通信。`service worker, shared worker, websocket`他们都是通过一个中转人,通过接收消息,然后在进行消息分发。`postMessage, BroadCast Channel`他们就是通过js内置的消息通信方式进行通信。 ## 往期年度总结 * [四年沿海城市,刚毕业,一年3家公司](https://juejin.cn/post/7310895905573716005 "https://juejin.cn/post/7310895905573716005") * [七月仿佛又回到了那一年(2023年中总结)](https://juejin.cn/post/7254361990076055589 "https://juejin.cn/post/7254361990076055589") * [一位初入职场前端仔的年度终结 \<回顾2022,展望2023\>](https://juejin.cn/post/7188374796114067511 "https://juejin.cn/post/7188374796114067511") * [大学两年半的前端学习](https://juejin.cn/post/7046248406464856100 "https://juejin.cn/post/7046248406464856100") ## 往期文章 * [众多跨标签页通信方式,你知道哪些?](https://juejin.cn/post/7340109700767383604 "https://juejin.cn/post/7340109700767383604") * [反调试吗?如何监听devtools的打开与关闭](https://juejin.cn/post/7330021813823750159 "https://juejin.cn/post/7330021813823750159") * [因为原生,选择一家公司(前端如何防笔试作弊)](https://juejin.cn/post/7301908233291300900 "https://juejin.cn/post/7301908233291300900") * [结合开发,带你熟悉package.json与tsconfig.json配置](https://juejin.cn/post/7298294389478506548 "https://juejin.cn/post/7298294389478506548") * [如何优雅的在项目中使用echarts](https://juejin.cn/post/7294541220440752165 "https://juejin.cn/post/7294541220440752165") * [如何优雅的做项目国际化](https://juejin.cn/post/7293797226933764134 "https://juejin.cn/post/7293797226933764134") * [近三个月的排错,原来的憧憬消失喽](https://juejin.cn/post/7292036126269063178 "https://juejin.cn/post/7292036126269063178") * [带你从0开始了解vue3核心(运行时)](https://juejin.cn/post/7291955076100620342 "https://juejin.cn/post/7291955076100620342") * [带你从0开始了解vue3核心(computed, watch)](https://juejin.cn/post/7275550540620365878 "https://juejin.cn/post/7275550540620365878") * [带你从0开始了解vue3核心(响应式)](https://juejin.cn/post/7274072378606174263 "https://juejin.cn/post/7274072378606174263") * [3w+字的后台管理通用功能解决方案送给你](https://juejin.cn/post/7269225865619816483 "https://juejin.cn/post/7269225865619816483") * [入职之前,狂补技术,4w字的前端技术解决方案送给你(vue3 + vite )](https://juejin.cn/post/7251878440327512124 "https://juejin.cn/post/7251878440327512124") ## 专栏文章 * [重学vue及其生态](https://juejin.cn/column/7036633477013307423 "https://juejin.cn/column/7036633477013307423") * [前端面试](https://juejin.cn/column/7085181986347679751 "https://juejin.cn/column/7085181986347679751") * [前端工程化](https://juejin.cn/column/7215977393697587259 "https://juejin.cn/column/7215977393697587259") * [amis 低代码实战](https://juejin.cn/column/7171775932809052174 "https://juejin.cn/column/7171775932809052174") * [协议与安全](https://juejin.cn/column/7090398104549064718 "https://juejin.cn/column/7090398104549064718") * [重学react](https://juejin.cn/column/7073656450874081316 "https://juejin.cn/column/7073656450874081316") * [重学nodejs](https://juejin.cn/column/7036633282204663822 "https://juejin.cn/column/7036633282204663822") * [工作总结](https://juejin.cn/column/7133877511707951111 "https://juejin.cn/column/7133877511707951111") ## 结语 本篇文章到此就结束了,欢迎在评论区交流。 🔥如果此文对你有帮助的话,欢迎💗**关注** 、👍**点赞** 、⭐**收藏** 、**✍️评论,** 支持一下博主\~

相关推荐
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅8 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment8 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅8 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊8 小时前
jwt介绍
前端
爱敲代码的小鱼8 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax
Cobyte9 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc