如何实现浏览器内多个标签页之间的通信,是什么意思?

2020-09-24 20:30:25 +08:00
 BaiLinfeng

去面试里面有一道陌生的题目,如何实现浏览器内多个标签页之间的通信, 我想问的是什么叫浏览器内多个标签页之间的通信?标签页还有通信的说法吗?

4183 次点击
所在节点    程序员
21 条回复
ysc3839
2020-09-24 20:32:20 +08:00
就是同一网站不同页面之间的通信。
mxT52CRuqR6o5
2020-09-24 20:38:06 +08:00
你用 window.open 打开一个页面会返回个对象,你能通过这个对象进行页面间通信,打开同源页面直接返回新开页面的 window 对象,可以对被打开页面随意控制,打开非同源页面通过返回对象上的 postMessage 通信
mxT52CRuqR6o5
2020-09-24 20:41:29 +08:00
还可以通过 BroadcastChannel 或监听 localStorage 事件进行同源网站页面之间的通信
eason1874
2020-09-24 20:45:25 +08:00
window.postMessage()

比如你同时打开了多个 V 站页面,你想在有未读提醒的时候全部页面都显示未读提醒,在随意一个标签页点开消息之后其他标签页也自动更新到已读状态,最好的办法是标签页之间通信。
lin07hui
2020-09-24 21:25:22 +08:00
BaiLinfeng
2020-09-24 21:35:44 +08:00
@mxT52CRuqR6o5 好模式的 api
BaiLinfeng
2020-09-24 21:36:05 +08:00
@lin07hui 好陌生啊这个 api
anUglyDog
2020-09-24 21:57:28 +08:00
其它标签页监听 storage 事件,本页面 localStorage.setItem 时其它页面可以收到消息。
监听 message 事件,使用 sharedWorker 的 postMessage 可以使别的页面收到消息。
重点:同域。
anUglyDog
2020-09-24 21:59:18 +08:00
就算是老浏览器,你也可以通过服务器同步,或者就是在 cookie 里设置数据,setInterval 不断读写 cookie 数据也能多标签页同步数据。
重点:不管技术多烂,你都可以完成目标。
xieqiqiang00
2020-09-24 21:59:28 +08:00
用 localStorage 吧
yeqizhang
2020-09-24 22:17:24 +08:00
看了楼上所说的,对通信这个词又陌生了……
godblessumilk
2020-09-25 01:05:01 +08:00
我一般是用 sessionStorage
shilianmlxg
2020-09-25 08:46:50 +08:00
又陌生了起来
galikeoy
2020-09-25 08:58:38 +08:00
@BaiLinfeng #7 vue/react 等单页实例也是有这个 api 的实践(我想熟悉的都知道吧),可以说利用这个也可以手写一个小单页应用,可能你还没了解到这部分
Curtion
2020-09-25 09:27:15 +08:00
imswing
2020-09-25 09:56:33 +08:00
@godblessumilk ? sessionStorage 不能跨 tab
BaiLinfeng
2020-09-25 13:56:09 +08:00
@galikeoy 说到 vue 我就想到的是组件之间通信传值。浏览器多标签通信是真默认,说多网页之间相互通信获取还好理解点。
BaiLinfeng
2020-09-25 14:04:39 +08:00
@Curtion 你写的吗?
Curtion
2020-09-25 14:09:41 +08:00
@BaiLinfeng #18 不是
ruzztok
2020-09-25 14:35:04 +08:00
不问原理,问 api 的面试,我都懒得回答

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/710227

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX