美文网首页
tab页之间的通信

tab页之间的通信

作者: 廊桥梦醉 | 来源:发表于2023-09-08 18:00 被阅读0次

一、同源网站下的tab通信

按照通信的特征可以分为三种方式:  点对点通信、广播通信、轮询通信

点对点通信: window.postMessage

广播通信: BroadCast Channel、Service Worker、 LocalStorage

轮训通信: IndexedDB

1.1 window.postMessage

场景: 在a页面使用window.open打开b页面,在b页面向a页面发送消息

特点: 类似点对点通信,其他同源页面无法接收到消息

原理:
    A页面监听message事件
    B页面使用postMessage发送消息
    B页面可以获取A页面的window对象,一般使用window.opener

A页面

B页面

2.2 BroadCast Channel

BroadcastChannel 接口代理了一个命名频道,可以让指定 origin 下的任意 browsing context 来订阅它。它允许同源的不同浏览器窗口,Tab 页,frame 或者 iframe 下的不同文档之间相互通信。通过触发一个 message 事件,消息可以广播到所有监听了该频道的 BroadcastChannel 对象。

特点: 广播通信

原理:
    页面创建BroadCast Channel实例
    为实例注册message事件

实现:

2.3 Service Worker

Service Worker 是一个运行在后台的 Worker,多页面间可以共享 Worker,使用 Worker 充当消息转发中心,实现多页面间的通信。

原理:
  多 Tab 共用同一份 Service Worker,每一个 Tab 是为 Client,通过 Service Worker 向每一客户端推送消息实现通信

实现:
  参考: https://blog.csdn.net/swl979623074/article/details/120338707

延伸: websocket、shareWorker

2.4 localstorage

localstorage 可以存储浏览器数据,同源时,共享数据。当同源下的两个 Tab 页需要监听对方数据变化时,使用 localstorage 是比较好的方式。

原理:
    两个 Tab 页同源
   A 页面监听storage
   B 页面使用setItem更新数据时,此时 A 页面可以监听到localstorage数据的变化

实现:

延伸: cookie

2.5 IndexedDB

同源下的 Tab 可以访问相同的 IndexedDB,利用数据的全局存储特性,实现通信。

原理:
 A 页面将数据存储到 IndexedDB 中
 B 页面轮询查询 IndexedDB 中数据的变化

基于同样的原理,localstorage、sessionstorage 都可以采用这种方案

二、非同源网站下的tab通信

2.1 iframe
依靠 iframe 为媒介,可以实现非同源页面间的通信

参考: https://blog.csdn.net/swl979623074/article/details/120338707
         https://www.exyb.cn/news/show-166575.html?action=onClick

相关文章

网友评论

      本文标题:tab页之间的通信

      本文链接:https://www.haomeiwen.com/subject/ehwemdtx.html