面试一问就给我整不会了😭如何跨标签页通信

🎨 方案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');

// 标签1发送消息
channel.postMessage({ action: 'addToCart', item: '可爱猫猫' });

// 标签2接收消息
channel.onmessage = (event) => {
  console.log('收到消息:', event.data); 
  // 显示:"收到消息: {action: "addToCart", item: "可爱猫猫"}"
};

📌 特点

就像一群人在同一个对讲机频道聊天

现代浏览器都支持(IE除外😅)

适合频繁通信

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

// service-worker.js
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 - 共享小本本

// 标签1写下留言
localStorage.setItem('message', '今晚吃火锅!');

// 标签2监听小本本变化
window.addEventListener('storage', (event) => {
  if (event.key === 'message') {
    console.log('新留言:', event.newValue);
  }
});

⚠️ 注意

当前标签页修改不会触发自己的监听

容量约5MB(能写很多小纸条啦)

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

// shared-worker.js
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)

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

// 方案6:Cookie轮询
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 - 专业电话线

// 所有标签页连接同一个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
worker.postMessage({ buffer });

// Worker中修改
Atomics.store(arr, 0, 123); // 线程安全写入

🚧 注意

需要设置安全响应头

适合高性能计算

🎓 选择指南

BroadcastChannel

简单现代应用

⭐⭐⭐

"对讲机聊天"

LocalStorage

少量数据同步

⭐⭐

"共享小本本"

SharedWorker

复杂数据共享

⭐⭐⭐

⭐⭐⭐

"共享办公室"

Service Worker

PWA/离线应用

⭐⭐

⭐⭐⭐

"隐形邮差"

WebSocket

需要服务器参与

⭐⭐

⭐⭐⭐

"专业电话线"

window.postMessage

特定窗口通信

⭐⭐

⭐⭐⭐

"父子悄悄话"

实际项目选择建议

1 先试试BroadcastChannel(最简单)

2 需要离线功能?上Service Worker

3 大量数据共享?SharedWorker等着你

4 要兼容IE?只能用localStorage啦

记住:没有最好的方案,只有最合适的方案!就像选择工具一样,用对场景最重要~

——转载自:盏灯

全部评论
感觉都能写书去了
点赞 回复 分享
发布于 2025-12-19 14:46 陕西
看着好专业的样子啊
点赞 回复 分享
发布于 2025-12-17 20:53 陕西

相关推荐

2025-12-22 20:43
已编辑
门头沟学院 Java
作为西安邮电大学计算机科学与技术专业的 2025 届毕业生,如今我已在葡萄城度过 5 个月的职场时光。从校园到职场的过渡,没有想象中的局促与迷茫,反而满是踏实的收获与真切的归属感 —— 这是我选择葡萄城后,最幸运的答案,也想把这份美好分享给即将踏上校招之路的同学们。最初被葡萄城吸引,始于高效又舒心的面试体验。校招时投递简历后,一周内就完成了四轮技术面,全程没有冗长的等待,面试官们专业又亲和。不同于一些公司格外看重实习经历,葡萄城更在意我们的基础能力、学习潜力和对技术的热情。每一轮面试更像一场平等的技术交流,既能让公司看到真实的我,也让我对葡萄城的技术氛围有了初步的好感。入职后,葡萄城给新人的 “成长 buff” 更是超出预期。我加入了 GCExcel 项目组,试用期的三个月里,公司完全没有让我仓促接手工作,而是安排了完善的系统化培训,让我能心无旁骛地专注学习。培训中会布置层层递进的练习,我的 Mentor 更是会手把手指导,帮我优化作业里的每一处细节,从代码逻辑到编写规范,都倾囊相授。除了集中培训,公司每周还有全员参与的技术分享会,项目组内部也会定期开展针对性交流,无论是行业前沿动态,还是工作中踩过的 “坑”,大家都毫无保留地分享,让我这种职场新人能快速拓宽视野、补齐短板。更让我安心的是规范的工作体系、极致的办公环境和如家般的团队氛围。公司搭建了成熟的开发流程,每个任务的分配、推进和复盘都有清晰的追踪链路,让我能很快理解职场工作的逻辑,避免手忙脚乱。而办公环境更是让人幸福感拉满:独栋别墅式的办公空间,配套着茶水间、健身房,工作累了就去院子里转转,看看绿植吹吹风,疲惫感瞬间消散;公司还会提供暖心的晚餐,节假日福利从不缺席,充足的年假更是给了我们平衡生活的底气。在这里工作,完全没有传统职场的压抑感,更像是身处一个温暖的大家庭。不管是职级高的前辈,还是同级的小伙伴,大家都互相尊重、开放包容。遇到问题时只要主动开口,总能得到耐心的指导。我曾有过一次代码仓库提交失误的情况,正一筹莫展时,身边的同事主动过来帮我梳理问题、排查原因,高效地帮我解决了难题,那份互助的温暖到现在想起来都觉得很感动。最让我惊喜的是,公司的产品服务客户遍布全球,这让我们开发人员也能接触到国际层面的业务和技术视野。在打磨高标准产品的过程中,我的专业能力也跟着一起进阶。对于我们应届生来说,不用纠结于过往是否有亮眼的履历,只要基本功扎实、愿意学习,就能在这里找到自己的成长赛道。作为从西邮走出的学子,我深知学弟学妹们校招时最看重的,是能否学到真技术、能否有好的成长环境、能否感受到被重视。而这些,葡萄城都一一满足了我。如果你也对技术充满热情,渴望在一个专业、包容、有温度的团队里稳步成长,那么不妨把葡萄城纳入你的校招清单 —— 这里会是你职业生涯中一个靠谱又值得的起点,期待在葡萄城与你们相遇,一起在技术的道路上并肩前行!
葡萄城公司氛围 8人发布
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务