数学建模社区-数学中国
标题:
js实现浏览器不同页签之间通信
[打印本页]
作者:
2744557306
时间:
2024-3-29 17:50
标题:
js实现浏览器不同页签之间通信
一. 使用BroadcastChannel
3 L; f% M+ b' j% F3 d2 d* m4 F/ a
! m9 T/ R5 G% F
const sendMsg = new BroadcastChannel('logout_channel')
5 n, E4 D0 v; m& z: h; |/ o
sendMsg.postMessage('清除缓存')
9 t( s$ L! J8 d' \+ V6 p
onMsg.onmessage = async (event) => {
) L- ^7 I1 x+ o
console.log('event清除缓存', event.data)
& X, I( G# e7 b6 v4 E$ z2 d, c
}
( B0 V" c ]" s- H% K$ J( `
* L; Q; |* z. q" v/ v) E- c
二. 使用SharedWorker
2 t9 Y' S+ n4 n5 F+ T3 i2 ?! C
1.创建一个SharedWorker实例,并在其中编写处理消息的代码。
5 P0 z' ~& @+ o; A, V! n
7 `: g+ b! O: I% u1 r: b* U
// shared-worker.js
( `7 N, a/ B" n o0 r7 Z; ]
onconnect = function(e) {
$ C+ v: {; A5 D
var port = e.ports[0];
0 e# O! q5 t. A; y
. K" ~2 q2 \' H, g
port.onmessage = function(e) {
, q9 M+ L6 D$ q; x3 r7 S2 M& _- h
var message = e.data;
) Y4 R+ v# L( h# R$ p+ {% x- W
// 在这里处理接收到的消息
( `. U0 q3 f# k$ T% U1 t
};
0 g& b/ {# ~& A0 A; F
2 L7 N1 G/ ?$ ]* R% g
port.start();
2 C; I0 u4 {; B% h! Z0 @% Z
};
+ y7 d" ~8 e# r' O/ o
3 S0 w$ Q9 b4 i$ v! r) _- s
在多个窗口中分别创建SharedWorker的端口,并发送消息。
6 }# I; V% S ?& ~( H- i
// window1.js
4 ~5 q$ \; E) \$ c
var worker = new SharedWorker('shared-worker.js');
+ S3 V% }. @/ B, b
var port = worker.port;
/ @$ ?' r+ S* X, {
/ }) \: Y" S. H. d; P9 U0 k
port.onmessage = function(e) {
: S2 s) ]$ C+ m0 \
var message = e.data;
9 K R/ m( l4 m7 L z- p" Z" k
// 在这里处理接收到的消息
9 W8 o1 I8 ?' g* V/ o J
};
- l1 W, R) z' `( L8 M3 e* d1 S' z" U8 _
2 |2 d9 w' @* a7 { n
port.postMessage('Hello from window1!');
/ d7 O' }( n- O. ^7 x
, S* i7 T: z9 h9 l
// window2.js
" @! k4 O+ m+ v. j
var worker = new SharedWorker('shared-worker.js');
1 ~( c) _0 u* b/ D! b
var port = worker.port;
2 F+ ]" Z8 e% |; X
2 G0 H# q- x& p& d5 n9 a5 e2 t# @
port.onmessage = function(e) {
. i8 e* x5 ^! I) |7 H7 f
var message = e.data;
: w% E; T$ w& F3 {4 S
// 在这里处理接收到的消息
% n5 X; s2 `9 o: D8 A r! _
};
! k) t2 D3 n/ p h8 Y
6 t$ t7 U8 A7 b, t! @
port.postMessage('Hello from window2!');
/ N# t' D2 P( p6 x- R. x( i# M
! E( u& F3 f" a: `8 g& y0 q& r
在SharedWorker中处理接收到的消息,并向所有连接的窗口发送消息。
7 L; {( B: _: N0 R& q, p0 Z; h
// shared-worker.js
0 h: Y, k% A8 l$ D
onconnect = function(e) {
* _2 o$ y" a7 G: |. M& ?
var port = e.ports[0];
0 B3 Y! W- k5 d8 M L9 F
% w/ c* n+ f. m6 l+ s
port.onmessage = function(e) {
7 y: S" l x1 {
var message = e.data;
' h8 Z' H4 g; U# @2 }
// 在这里处理接收到的消息
$ O q% \& r0 K' [1 t1 d" _
* Y0 K6 @7 |) E) E
// 向所有连接的窗口发送消息
; ~% n# Y. z8 A0 ]( m2 s) f
e.source.postMessage('Hello from SharedWorker!');
; C; @7 A- U8 c. ^
};
+ X3 X9 J/ A( K6 A7 v$ C0 B
8 r+ U# }6 @, I, x0 j8 X
port.start();
* [6 u9 a& E+ Q& ?0 h
};
- L+ G( `5 C0 T
+ r( ?, u* @/ c4 N/ D! [& L
0 s2 y9 \/ c* b) T' P* ]% U- [. v
+ {3 N/ o7 R n: [, s
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5