- 今天正好接到一个需求,要求网站做到类似 B 站这样,当有多个窗口时,一旦某个窗口退出,其他窗口同步退出。
- 我观察到的现象是,一个窗口退出以后,其他窗口会同步发送一个网络请求。
问题:其他窗口是如何监听到另一个窗口的退出动作的呢?
题主补充(2023/6/6):最后采用设置 localstorage,并且 在 app.vue 里加载下面函数,完成需求
window.addEventListener("storage",(e)=>{
if(e.key=一些判断){
//TODO:触发页面重新刷新的逻辑
}
})
1.WebSocket
html5提供的全双工通讯的协议,浏览器和服务器之间建立一条不受限的双向通信的通道,双向数据传输,需要服务端支持。
使用方法可参考:nodejs搭建websocket服务实现多页面通信
2.StorageEvent
简单有效的方式,页面A通过storage存储消息,页面B监听storage即可捕获消息。
pageA.html:
pageB.html:
3.postMessage
支持跨域通信,需要获取打开窗口的句柄(对象),建立联系,安全地实现跨源通信。
pageA.html:
pageB.html:
4.SharedWorker
实现一个在浏览器后台运行的共享worker,页面通过该worker进行连接和信息的传递。同源
本地不支持,需要放到服务器。( webstorm可在浏览器中打开,vscode使用live server插件)测试。
worker.js:
pageA.html:
pageB.html:
5.BroadcastChannel
实现同 源 下浏览器不同窗口,Tab页,frame或者 iframe 下的 浏览器上下文 (通常是同一个网站下不同的页面)之间的简单通讯。
pageA.html:
pageB.html:
6.MessageChannel
创建一个新的消息通道,并通过它的两个MessagePort 属性发送数据。常见场景iframe通信。
pageA.html:
pageB.html: