前端实现多标签页通讯

前端实现多标签页通讯

需求分析

现代浏览器,比如谷歌,微软edge等都可以实现同时打开多个标签页。在实际工作当中,笔者发现,有些用户确实喜欢用多个标签页来操作。比如在A页面浏览,在B页面提交。那么,在某些场景下,需要保持多个标签页之间的数据、状态是一致的。因此,我们需要解决多标签页通讯问题。

现有解决方案

1、BroadcastChannel

BroadcastChannel 接口表示给定源的任何浏览上下文都可以订阅的命名频道。它允许同源 的不同浏览器窗口 、标签页 、frame 或者 iframe 下的不同文档之间相互通信。消息通过 message 事件进行广播,该事件在侦听该频道的所有 BroadcastChannel 对象上触发,发送消息的对象除外。

A页面

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>A</title>
</head>
<body>
<script>
    const bc = new BroadcastChannel('room');
    bc.postMessage({type: 'init', content: 'hi,b'})
</script>
</body>
</html>

B页面

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>B</title>
</head>
<body>
<script>
    const bc = new BroadcastChannel('room');
    bc.onmessage = function (event) {
        console.log(event.data)
    }
</script>
</body>
</html>

2、localStorage或sessionStorage的storage事件

localStorage 和 sessionStorage 都是 HTML5 新增的 API,用于存储数据。它们都提供了 setItem()、getItem()、removeItem() 等方法,用于设置、获取和删除数据。

当存储区域(localStorage 或 sessionStorage)被修改时,将触发 storage 事件。

我们可以通过监听特定key的改变来变相实现标签页的通讯。

A页面

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>A</title>
</head>
<body>
<script>
    // room 这个key 充当通讯渠道标识
    window.localStorage.setItem('room','hi,b');
</script>
</body>
</html>

B页面

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>B</title>
</head>
<body>
<script>
    /**
     * 监听storage事件
     * @description 监听storage事件,可以通过如下信息来定义通讯逻辑
     * @param e
     * @param e.key 被修改的key
     * @param e.oldValue 修改前的值
     * @param e.newValue 修改后的值
     * @param e.url 触发storage事件的页面的URL
     * @param e.storageArea 触发storage事件的存储区域
     */
    window.addEventListener('storage',(e)=>{
        console.log(e);
        if(e.key === 'room'){
            // 处理逻辑
        }
    })
</script>
</body>
</html>
相关推荐
jktantan9 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
总要学点什么9 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
2601_9628857210 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
excel10 小时前
encodeURI 和 encodeURIComponent 有什么区别?
前端
前端精髓10 小时前
调用openrouter的免费API模型
java·前端·javascript
赛博守夜人10 小时前
AI安全攻防与治理之十四:AI 安全测试不能脱离传统安全,Web、API、移动端与模型攻击面的组合拳
前端·人工智能·安全
开开心心_Every10 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
networknomad11 小时前
OpenReplay:自己搭的会话回放工具,给前端排错用的
前端·其他
缓慢更新12 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
陈随易12 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员