JS如何跨标签页通信

1,904 阅读1分钟

chrome浏览器中打开2个掘金官网的标签

1、localStorage

打开左边标签的控制台,输入

localStorage.getItem('msg') // null

然后打开右边的标签控制台,输入

localStorage.setItem('msg', 'hello')

重新打开左边标签的中控制台,输入

localStorage.getItem('msg') // "hello"

通信成功!

2、SharedWorker

打开左边标签的控制台,输入

打开右边标签的控制台,输入

(我猜掘金的换行有问题,所以这里肯定不会换行)

再次打开左边的标签,控制台会看到有hello的消息输出

通信成功!

3、websocket转发(可跨域)

本地简单搭建node的websocket服务:

在左边标签页输入如下代码

右边标签页输入如下代码

可以在左边标签页控制台发现有输出:

server trans, from client2

在服务端可发现输出

服务端:客户端已连接 服务端:客户端已连接

通信成功!

4、postMessage

操作:打开掘金官网控制台,输入

var myPopup = window.open("https://juejin.cn/")

在新打开的标签内控制台注册回调

window.addEventListener('message', e => console.log(e.data))

返回第一个标签页,输入

myPopup.postMessage('hello')

可以在第二个标签页中看到显示输出

hello

通信成功!

5、BroadcastChannel

标签页1控制台输入

new BroadcastChannel('juejin').onmessage = e => console.log(e.data)

标签页2控制台输入

new BroadcastChannel('juejin').postMessage({ value: 'hello' })

返回标签页1控制台发现打印结果

{value: "hello"}

通信成功!

6、SSE和cookie方式 和websocket类似,待整理……