数学建模社区-数学中国
标题:
js实现浏览器不同页签之间通信
[打印本页]
作者:
2744557306
时间:
2024-3-29 17:50
标题:
js实现浏览器不同页签之间通信
一. 使用BroadcastChannel
9 C5 a' K, I) l7 k7 _: ~
$ R+ \. R$ `7 P) e, D3 k) @
const sendMsg = new BroadcastChannel('logout_channel')
' E- E% j2 h% C# B8 B# S7 w
sendMsg.postMessage('清除缓存')
2 A2 W! e' L/ c
onMsg.onmessage = async (event) => {
: {$ t% e/ ? ^+ h
console.log('event清除缓存', event.data)
/ k5 p0 Q! l' X9 K! a5 a- L" ]1 t9 i, y
}
( X, E N0 [. h
/ i6 w4 Q8 x8 |
二. 使用SharedWorker
3 r; R& @' Z. v' D0 ]
1.创建一个SharedWorker实例,并在其中编写处理消息的代码。
# K4 V Y0 d0 C* f5 I$ E
1 R/ |! X! k* b6 B
// shared-worker.js
7 N1 S/ K. E6 _% C F. w5 x4 F! G
onconnect = function(e) {
8 C! D6 @- @ T4 i3 l
var port = e.ports[0];
0 U! z) q& |3 o, l
2 o. [) O. ]: r& R6 a
port.onmessage = function(e) {
# X: p, f! W A b4 e5 K/ h7 E
var message = e.data;
* e) D% C1 T3 Z
// 在这里处理接收到的消息
9 r# T5 ~9 A/ M: o+ y, S& V' C0 O- j
};
* |8 I5 A& t$ O) b! l5 R
0 k" _* T6 q3 i) g! K
port.start();
8 d) k# P x" W7 L8 c! K9 m# k
};
9 Q7 G7 I8 H# x, E' a
5 q0 b/ k1 t8 e4 g8 d
在多个窗口中分别创建SharedWorker的端口,并发送消息。
* c7 } B/ s* @) v. z8 E
// window1.js
! O; T( @" g# @2 O1 ~3 ?
var worker = new SharedWorker('shared-worker.js');
} N. Y1 d1 m% v8 j$ Z
var port = worker.port;
9 t- O2 t% m3 u/ D: Y! Y$ N! g. I2 t
9 J+ r9 P5 a) k7 F
port.onmessage = function(e) {
! y* ? V# T0 \4 C- n
var message = e.data;
" F& P* p' e% }# X- \
// 在这里处理接收到的消息
% Q' A0 m5 }9 o( m
};
1 m8 i! s- O/ M" R$ T1 e
) [: l. h, O! q- N! H5 T4 {9 [5 G
port.postMessage('Hello from window1!');
- A3 h; K( V9 |( B) J D/ @
/ h1 s/ r3 d8 L8 @- E* r& l
// window2.js
1 j7 `1 D, k* @: n
var worker = new SharedWorker('shared-worker.js');
- R! S# N m, `( g+ E
var port = worker.port;
, U9 D# L! @% t% l4 {! b4 B6 o
! I" ^9 c' T; T1 ?. e
port.onmessage = function(e) {
: |; P, F; F4 {5 e' {
var message = e.data;
# N1 j1 _! y O/ \% e
// 在这里处理接收到的消息
3 i0 D! v4 M- i/ S% h: c- P
};
1 |: X8 M* V( N/ s8 U- K
2 _6 S( ^- k6 r
port.postMessage('Hello from window2!');
1 `4 G$ P; ^3 ]. @2 Q
) R' \4 P+ c) |% J
在SharedWorker中处理接收到的消息,并向所有连接的窗口发送消息。
: `: ~! s, V' H
// shared-worker.js
) f5 I+ w6 w% G8 I! I$ h
onconnect = function(e) {
% i9 L$ V0 J' w! T3 [8 K
var port = e.ports[0];
7 K1 h) K0 Y: L ?( |( N
$ J) m& \- k8 d1 i
port.onmessage = function(e) {
. i! r) Z, n& c' L, _: N, z, `! N
var message = e.data;
2 y0 @/ |4 C* c/ c' O- C
// 在这里处理接收到的消息
" U1 Q# i+ z4 l! M* ]7 }5 B: h
& D' a" p; _: y
// 向所有连接的窗口发送消息
% ]/ h, T% o' C) G
e.source.postMessage('Hello from SharedWorker!');
2 _% ] k9 p, {! X
};
9 }: h7 q' \% t1 b1 P! r! e) H
/ K" ]; {& o( i, r* U& p
port.start();
& }7 @- {/ D; o: W
};
8 g2 R! F% s" u8 T, V& }9 m
W9 ^2 s$ p9 p4 C8 A+ K
" {5 N6 _! n/ u2 P7 }
' K* D B/ l. M
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5