首页/文章/八股文

如何跨标签页通信

2025-07-20
13315 分钟
...

🎨 方案1:BroadCast Channel(对讲机频道)
🛠️ 方案2:Service Worker(隐形邮差)
📦 方案3:LocalStorage(共享小本本)
👨‍💻 方案4:Shared Worker(共享办公室)
🕵️‍♂️ 方案5-6:轮询侦查队(IndexedDB/Cookie)
👨‍👦 方案7:window.open(父子悄悄话)
🌐 方案8:WebSocket(专业电话线)
🧩 方案9:SharedArrayBuffer(共享黑板)


今天我们要去探索"跨标签页通信"这个神奇的乐园!🚀

🌟 开篇小剧场:为什么标签页要"聊天"?

想象你在网上商城:

标签1:浏览商品页
标签2:开着购物车

当你在标签1点击"加入购物车",标签2的购物车数字应该立即+1!这就是标签页通信的魔力啦!✨


🎨 方案1:BroadCast Channel - 对讲机频道

const channel = new BroadcastChannel('shop_channel');


channel.postMessage({ action: 'addToCart', item: '可爱猫猫' });


channel.onmessage = (event) => {
  console.log('收到消息:', event.data); 
  
};

📌 特点

就像一群人在同一个对讲机频道聊天
现代浏览器都支持(IE除外😅)
适合频繁通信


🛠️ 方案2:Service Worker - 隐形邮差

self.addEventListener('message', (event) => {
  
  self.clients.matchAll().then(clients => {
    clients.forEach(client => client.postMessage(event.data));
  });
});


navigator.serviceWorker.onmessage = (event) => {
  console.log('邮差送来消息:', event.data);
};


navigator.serviceWorker.controller.postMessage('快递到啦!');

🎯 适用场景

PWA应用(比如离线可用的网页)
需要后台同步的场景


📦 方案3:LocalStorage - 共享小本本

localStorage.setItem('message', '今晚吃火锅!');


window.addEventListener('storage', (event) => {
  if (event.key === 'message') {
    console.log('新留言:', event.newValue);
  }
});

⚠️ 注意

当前标签页修改不会触发自己的监听
容量约5MB(能写很多小纸条啦)


👨‍💻 方案4:Shared Worker - 共享办公室

const ports = []; 

onconnect = (e) => {
  const port = e.ports[0];
  ports.push(port);
  
  port.onmessage = (event) => {
    
    ports.forEach(p => p !== port && p.postMessage(event.data));
  };
};


const worker = new SharedWorker('shared-worker.js');
worker.port.onmessage = (event) => {
  console.log('办公室通知:', event.data);
};
worker.port.postMessage('大家好呀!');

💡 比喻

就像多个标签页在一个共享办公室工作
通过中间的worker传递消息


🕵️‍♂️ 方案5-6:轮询侦查队(IndexedDB/Cookie)

setInterval(() => {
  db.get('message').then(val => {
    if (val !== lastMessage) {
      console.log('发现新消息:', val);
      lastMessage = val;
    }
  });
}, 1000);


setInterval(() => {
  const msg = getCookie('message');
  if (msg !== lastMsg) {
    console.log('Cookie消息:', msg);
    lastMsg = msg;
  }
}, 1000);

🚨 注意

像不断检查信箱的侦查员
不推荐高频使用(耗电耗资源)


👨‍👦 方案7:window.open - 父子窗口说悄悄话

const child = window.open('child.html');
child.postMessage('乖儿子', 'https://same-origin.com');


window.opener.postMessage('老爸好!', 'https://same-origin.com');


window.addEventListener('message', (event) => {
  if (event.origin !== 'https://same-origin.com') return;
  console.log('收到:', event.data);
});

🔒 安全第一

必须验证event.origin!
就像只接收认识的人的信件


🌐 方案8:WebSocket - 专业电话线

const socket = new WebSocket('wss://example.com/chat');

socket.onmessage = (event) => {
  console.log('服务器通知:', event.data);
};


socket.send('标签1发来的消息');

🏆 优势

实时性最强
适合需要服务器参与的复杂场景


🧩 方案9:SharedArrayBuffer - 共享黑板(高级)

const buffer = new SharedArrayBuffer(1024);
const arr = new Int32Array(buffer);


worker.postMessage({ buffer });


Atomics.store(arr, 0, 123); 

🚧 注意

需要设置安全响应头
适合高性能计算


🎓 选择指南

方案适合场景难度实时性记忆口诀
BroadcastChannel简单现代应用⭐⭐⭐“对讲机聊天”
LocalStorage少量数据同步⭐⭐“共享小本本”
SharedWorker复杂数据共享⭐⭐⭐⭐⭐⭐“共享办公室”
Service WorkerPWA/离线应用⭐⭐⭐⭐⭐“隐形邮差”
WebSocket需要服务器参与⭐⭐⭐⭐⭐“专业电话线”
window.postMessage特定窗口通信⭐⭐⭐⭐⭐“父子悄悄话”

实际项目选择建议

1 先试试BroadcastChannel(最简单)
2 需要离线功能?上Service Worker
3 大量数据共享?SharedWorker等着你
4 要兼容IE?只能用localStorage啦

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
八股文2026-08-27
定时器按顺序播放多个音频,切后台音频会乱
本身不会补触发,但 它会被系统级冻结 ——iOS Safari 后台完全停止计时,切回前台后 只补执行一次 (不是不补,而是"缺失的中间状态补不上")。间隔短的不会出大问题, 间隔长的会出现"音频流被压缩" ——切回来后本该播 5 分钟的间隙,实际只过了 3 分钟,结果整段对不上。 核心原则 :定时器只能用来"提醒一次", 真正决定"该不该播"的是绝对时间戳 。 setTimeout 在后台会发生什么(按平台) | 平台 | 后台行为...
面试
八股文2026-08-27
线上项目白屏的原因
白屏的本质是 渲染管线某一环断了 ——可能是资源、JS、接口、路由、样式、兼容性任一环节出问题。排查按"控制台 → 网络 → DOM → 环境"四步定位。 本质(前端类比) 把网页想成一栋楼: 白屏 ≠ 一定是同一种原因——这是面试想听的层次。 六大类原因(按出现频率) | 类别 | 典型表现 | 真实案例 | | : | : | : | | ① 资源加载失败 | DOM 是空的 | 入口 JS 404、CDN 挂了、CSS 阻塞 |...
面试
八股文2026-08-27
背景图就是 1MB 大图,怎么优化
1MB 大背景图优化分 三步 :压缩体积(10 30x)、按需加载(按设备/视口/网速)、渲染期优化(GPU 合成)。背景图跟 不同——它是 CSS,不走浏览器的原生懒加载机制,得手动处理。 背景图 vs 的关键区别(先讲清楚这个) 这是面试官想听的"针对性认知"——背景图不是普通图片,不能套通用方案。 三步优化(按优先级) 第 1 步:压缩体积(最重要,立竿见影) 1MB 的来源一般是这几种 ,对应解决方案: | 原始问题 | 体积来...
面试
八股文2026-08-27
项目里很多图片和视频,怎么优化
图片视频优化分 四层 :网络层(CDN/格式)、加载层(懒加载/预加载)、渲染层(解码/缓存)、业务层(按需/降级)。面试要把这四层都讲到位才算有体系。 四层优化模型 第 1 层:网络层(省钱、省时间) 核心目标:让资源体积小、让用户拿到资源快 | 手段 | 作用 | 关键点 | | : | : | : | | 图片格式 | WebP/AVIF 比 JPEG 小 25 50% | 兼容 fallback | | 视频格式 | H.265...
面试
八股文2026-08-20
Embedding 向量模型:从语义表示到相似度计算
前言 大模型「读懂」文字靠的是 token,但 token 之间只有离散的编号关系,模型并不知道「苹果」和「李子」在语义上很近。要让程序能「理解」两段文字的相似程度,必须先把文本映射成一个 高维向量 ,再用几何方法比较。这一步就是 Embedding。 本篇基于我本地 今天的真实代码,从语义表示讲到余弦相似度,并复盘几个踩过的真实坑。 一、为什么需要 Embedding 传统关键词检索是「字面匹配」: Embedding 做的是「语义匹...
面试
八股文2026-08-19
前端面试100题
前端面试 100 题 适用方向:中高级前端 / React / Vue / Next.js / Nuxt / TypeScript / 工程化 / 实时通信 / Electron / Node.js / AI 应用前端 使用方式:优先掌握“标准回答”,再练“面试官追问”,最后把“结合你的简历怎么答”组织成自己的项目故事。 说明 “结合你的简历怎么答”只使用你简历中已经出现的项目与技术事实。 “标准回答 / 追问”属于通用前端知识总结,用...
面试

评论

请登录后发表评论

去登录
加载评论中...

目录